一. ES Module
ES ModuleES6 中新提出的规范,但由于一些浏览器还不能支持 ES6 ,所以就需要一些打包工具 eg: webpack 来帮我们把 ES6 的代码转化为浏览器能使识别的 JS 代码,从而进行使用。
ES Module的一些子规定:
- ES Module 默认采用严格模式,use strict
- ES Module 都是运行在单独的私有作用域中
- ES Modula 是通过 CORS 的方式请求外部资源模块
- ES Module 的 script 标签会延迟执行脚本
可以直接在 script 标签中设置属性 type='module' 来使用 ES Module!!!
二. ES Module 的导出
- export 可以分别导出
变量声明、函数声明、类声明
- export 可以统一集中进行导出
- export 导出时可以给导出变量手动更改名字
-
export 的默认导出 default
- 集中导出中使用 default
导入时,就要修改名字 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 的导入和导出
可以在一个模块中,导入其他几个模块的成员,然后进行统一导出,方便后续的引用!!!这就涉及到了导入即导出的简写方法!!