前端模块化的最佳实践 ES Module

173 阅读3分钟

2216.png

一. ES Module

ES Module ES6 中新提出的规范,但由于一些浏览器还不能支持 ES6 ,所以就需要一些打包工具 eg: webpack 来帮我们把 ES6 的代码转化为浏览器能使识别的 JS 代码,从而进行使用。

ES Module的一些子规定:

  • ES Module 默认采用严格模式,use strict
  • ES Module 都是运行在单独的私有作用域中
  • ES Modula 是通过 CORS 的方式请求外部资源模块
  • ES Module 的 script 标签会延迟执行脚本

可以直接在 script 标签中设置属性 type='module' 来使用 ES Module!!!

2217.png

二. ES Module 的导出

  • export 可以分别导出 变量声明函数声明类声明

2218.png

  • export 可以统一集中进行导出

2219.png

  • export 导出时可以给导出变量手动更改名字

2220.png

  • export 的默认导出 default

      - 集中导出中使用 default
    

2221.png

导入时,就要修改名字 import default as fooname from ...

     - 直接 export default name
     
     

导入时,就可以随便给导入的变量命名

注意:

  • export 统一导出时,export { } 的意思并不是导出一个对象,而是这是 export 的使用规范!!!

       - 如果需要导出一个对象,可以通过 export default {}来导出,因为 export 导出后面呢不仅可以跟变量,还可以跟一个值,直接导出值
    
  • export 导出是 引用导出 ,即导出的是对变量的引用【即导出的其实跟模块内部的是一个东西】,【如果后续在模块内部对导出的变量进行了修改,那么相应的在导入部分的使用也会跟着改变】!!!

  • export 导出的东西是只读的,即不能对导出的成员进行修改!!!

三. ES Module 的导入
  • 不能省略文件扩展名,不管是什么类型的文件都不行
import './module.js'
  • 如果要导入的文件为 index.js ,也不可以省略
//错的
import './src/Menu'
//对的
import './src/Menu/index.js'
  • 如果是对同一层的引入,不能省略前面的 ./ 【如果省略的话,就默认要导入的是外部的库】

  • 可以使用完整/绝对路径进行导入!!!

注意:

  • 导入模块后,会自行对模块中的代码进行执行,如果只是单纯想执行模块中的代码,而不想引入模块中的成员,可以如下:
import {} from './module.js'
import './module.js'
  • 如果某个模块使用的是集中导出,而导入时,为了方便可以使用 * 符号进行全部导入,并且可以将它们挂载在一个对象身上进行导入
import * as mod from './module.js'
  • 动态导入 【使用 import() 函数】

       - 因为 import 语句只能在文件最顶部使用,不能嵌套使用!!!
       - 而且 import 不能出现变量形式的路径
       - var path = './...'
       - import {} from path 是错误的!!!
    

所以我们就可以使用封装好的 import() 函数来进行导入!!【可以在任意位置使用】

该函数的返回值,是一个 Promise 实例,所以可以在其身上直接调用.then() 方法!!!!

  • 如果某个模块中的导出既有集中导出也有默认导出,那么导入时就有简写方式
import title , {name , age} from './module.js'
// , 左面是导入的默认导出的成员,可以任意命名1
// , 右面是导入的集中导出的成员
四. ES Module 的导入和导出

可以在一个模块中,导入其他几个模块的成员,然后进行统一导出,方便后续的引用!!!这就涉及到了导入即导出的简写方法!!

2222.png