zoukankan      html  css  js  c++  java
  • 你真的搞懂ES6模块的导入导出规则了吗

    前言

    模块作为ES6规范的核心部分之一,在实际项目开发中经常会看到它的身影,那么我们是否真正了解它的相关规则呢,今天就带大家一起了解一下模块的导入导出规则

    导入

    ES6模块的导入(即import)大致分为:命名导入、命名空间导入、默认导入、空导入;那怎么知道用哪种方式来导入源模块呢?下面我们通过几个具体的场景看看

    场景1:只想导入源模块的部分内容

    假设a.js是以如下方式导出的

    1 // a.js
    2 export var num = 100
    3 export var name = '王小明'

    那么如果我们只需要a模块的num,就应该按下面的方式导入它

    1 // b.js
    2 import {num} from './a.js'
    3 
    4 console.log(num) // 100

    此处的模块导入利用了ES6的解构方式,相关知识大家如果感兴趣可以参考阮一峰老师的《变量的解构赋值》一章

     

    场景2:不满意源模块所导出的变量或方法的名称,想要为它们另起名称

    假设a.js中有一个名称如此晦涩的变量gddhauabsg

    1 // a.js
    2 export var gddhauabsg = 100

    忍不住想要重命名这个变量的名称,但是又无权或不想修改源模块的话,那么不妨这么做

    1 // b.js
    2 // 如此,我们就可以在b.js中愉快的使用num了
    3 import {gddhauabsg as num} from './a.js'
    4 
    5 console.log(num) // 100

    场景3:想要把源模块的所有导出都导入进来,但偏偏源模块不是以export default方式导出的

    假设a模块将每个变量都单独,且声明时立即导出

    1 // a.js
    2 export var num = 100
    3 export var name = '王小明'

    那么我们就要这样导入a的所有导出

    1 // b.js
    2 import * as moduleA from './a.js'
    3 
    4 console.log(moduleA.num)  // 100
    5 console.log(moduleA.name) // '王小明'

    解释一哈:*代表源模块(除去export default)的所有导出的集合,该集合类似Object类型,*就相当于{num: 100, name: '王小明'},所以在源模块没有使用export default导出时,我们就可以使用上面的方式导入源模块的所有导出

     

    场景4:源模块并没有对外暴露任何导出

    a模块没有导出任何内容

    1 // a.js
    2 var arr = [1, 2, 3]
    3 for (var i = 0;i < arr.length;i++) {
    4     console.log(arr[i])
    5 }

    那么b文件将a.js文件整个引入就好了

    1 // b.js
    2 // 此处会执行a.js的所有代码逻辑
    3 import './a.js'

    那么有些童鞋可能会有个疑问“这种导入方式的应用场景在哪?”,不知道大家是否听过'腻子脚本'这一概念,就是一些第三方脚本或工具,作用类似于补丁,用于兼容一些新特性或功能,在一般情况下,这些脚本或工具只需要自执行,并且通常都是在我们的业务代码之前引入

     

    导出

    ES6模块的导出方式大致有两种:命名导出、默认导出;对比模块的导入规则,导出要简单一些,下面我们还是通过场景来介绍

    场景1:源模块怎样才能支持命名导入和命名空间导入?

     1 // a.js
     2 // 方式1:在源模块末尾集中导出(当导出较多时,推荐此方式,方便管理导出)
     3 var num = 100
     4 var name = '王小明'
     5 var flag = true
     6 
     7 export {
     8     num,
     9     name,
    10     flag
    11 }
    12 
    13 // 方式2:声明时立即导出(当导出较少时,推荐此方式)
    14 export var num = 100
    15 export var name = '王小明'
    16 export var flag = true

    场景2:导出的内容前后名称需要不一致,那么我们可以尝试重命名

    什么意思呢?如果源模块的开发者有下面这种想法时,就应该使用重命名导出:‘我想要提高代码的可读性且有较好的语义化,此时变量或方法的名称长度一定不会太短,类似getOrderInfoFromDatabaseByHttp这种命名,但又不想让使用我的模块的人觉得我的导出名称过长’,示例如下:

     1 // a.js
     2 // 名称真的好长
     3 var getOrderInfoFromDatabaseByHttp = function () {
     4     // ...
     5 }
     6 
     7 export {
     8     // 如果没有重命名,机会导出下面这一大串
     9     // getOrderInfoFromDatabaseByHttp
    10     // 但如果使用了重命名,方法的名称就会变得很简洁,即getOrderInfo
    11     getOrderInfoFromDatabaseByHttp as getOrderInfo
    12 }

    场景3:模块功能单一,并且只需要导出值,不需要具名

    1 // version.js
    2 export default 'v1.0.0'
    3 
    4 // index.js
    5 import version from './version.js'

    上面的代码功能很简单,只是导出项目的版本号,所以我们应该使用默认导出,而没有必要像下面这样写:

    1 // version.js
    2 export var version =  'v1.0.0'
    3 
    4 // index.js
    5 import {version} from './version.js'

    结语

    以上就是ES6模块的一些导入导出场景的整理,内容不多,但却很实用,希望能够对大家有所帮助~

    原文地址:https://kittyslave.github.io/2017/10/16/%E4%BD%A0%E7%9C%9F%E7%9A%84%E6%90%9E%E6%87%82ES6%E6%A8%A1%E5%9D%97%E7%9A%84%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BA%E8%A7%84%E5%88%99%E4%BA%86%E5%90%97/

  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/sampapa/p/7773553.html
Copyright © 2011-2022 走看看