在ES6中,每一个文件就是一个模块,有本身的做用域。在一个文件里面定义的变量、函数、类,都是私有的,对其余文件不可见。在看到这里的时候感受很熟悉,这不就是匿名函数自执行,而后一个个匿名函数放在一个个文件中的么,一个模块就是一个放在文件中的匿名自执行函数。二者对比就像下面这样:javascript
// add.js (function(window){ function add(a, b) { return a + b; } window.add = add // 经过window对象把 add 函数向外开放 })(window)
而使用ES6的模块, 就像下面java
// add.js function add(a, b) { return a + b; } export default add; // 经过export 导出 add方法
固然了,ES6的模块确定是比匿名函数自执行更加高级的一种封装了。相比于匿名函数,ES6模块具备下面几种特色。webpack
严格模式
, 而不须要使用 "use strict"
至于为何时候ES6的模块产生的历史就不讨论,网络上不少。我的感受明白了它的历史就能更好的明白它的特性。web
说到模块,就须要想到两点,一个是模块的对外接口,后面文章中使用导出
来表示,另一个是引入其余模块的接口,后面文章中使用导入
来表示。缓存
export
命令用于规定模块的导出
,import
命令用于模块的导入
。
导出
与导入
。当模块引入其余模块的时候,最终是获取其模块导出
的值(基本数据类型或者引用类型)。因而能够这样去理解,当咱们引入的模块(文件)已经肯定下来了,那么导入
的值也就肯定下来。网络
// add.js function add(a, b) { return a + b; } export default add // main.js import add from './add.js' add(1,2) // 3
上面导入
的是 add.js 这个模块,其实主要是把add.js 中的 add 函数进行引入。函数
当须要到导入多个值的时候,能够经过对象来返回多个所须要的值。学习
// util.js function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } // 经过对象来返回多个值 export default {add: add, reduce: reduce}; // main.js import util from './util.js' console.log(util) // {add: add, reduce: reduce}
到这里,我我的以为模块的导入
和导出
基本上就已经很好了。由于这样不论是导出仍是导入,对接的接口都是简单方便。 code
固然这只是我以为。仍是上面的例子对象
// util.js function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } export default {add: add, reduce: reduce, name: 'util'} // main.js import util from './util.js' util.add(1, 2) // => 3 util.reduce(4, 3) // => 1 util.name // => 'util'
有人说,当导入
的是值是对象的时候,须要屡次去使用对象获取属性。 就像上面须要屡次使用util去获取属性。ES6中不是有解构赋值么,用来处理对象屡次获取属性的问题,那么导入
对象的时候,也能够这样去处理。
因而按照对象的解构赋值,对上面的 main.js 改变。
// main.js import {add: addFn} from './util.js' // 这里在`webpack`中编译就已经报错了, ES6模块不支持这种方式 // 使用另一种解构方式,`导出`模块的属性名与`导入`的变量名一致 // main.js import { add } from './util.js' console.log(add) // undefined // 这里在`webpack`编译中没有报出错误,可是还有警告: "export 'add' was not found // 因而对 util.js 的`导出`进行改变 //util.js function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } export {add, reduce, name: 'util'} // 当修改完util.js 就完成了util.js模块`导出` 与 main.js模块的`导入`对接
模块的导入
与导出
大体能够分为两种模式
default 模式下,模块中导出
的值可使用任何类型(不论是基本类型仍是引用类型),均可以对外输出。而导入
的此模块也是很简单,提供一个接收的变量就能够(推荐这种模式)
例子以下:
// util.js function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } const obj = { add, reduce }; export default obj;
// main.js import util from './util.js'; // util 是能够变换任意名称 console.log(util)// => {add: ƒ, reduce: ƒ}
{ xxx } 是不须要在模块导出
的时候使用default的。可是这种方式下,导出的值必定是object的。
而导入
的模块时是须要使用 { xxx }来接收。并且接收的变量名称还必须与导出模块属性名的同样。
例子以下:
// util.js function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } let obj = { add, reduce }; // export obj; //webpack 编译报错 export { add, reduce };
// 除了这样直接导出对象,还能够像下面这样
export let name = 'util'; // 与 export { name } 效果同样;
深刻了解的话,二者仍是能够一块儿合用
function add(a, b) { return a + b; } function reduce(a, b) { return a - b; } export let name = 'util'; export { add, reduce }; // 至关于把这些属性合并在一块儿
// main.js import { add, reduce, name } from './util.js' console.log(add) // add(a, b) { return a + b; } console.log(name) // util
as 重命名主要是用于 { xxx }模式。由于在导出
的时候,属性名是被肯定下来,而在导入
此模块的时候,变量名须要跟此属性名同样才能获取对应的值。而使用 as 不只可以帮助导出
模块把属性名重命名,也可以帮导入
模块把接收的变量名进行重命名。
例子以下:
// util.js function add(a, b) { return a + b; } export { add as addFn};
// main.js import { addFn as add } from './util.js' console.log(add) // add(a, b) { return a + b; }
上面是我的关于ES6的模块我的理解和学习心得。
另外想要深刻了解的能够查看官方文档 http://www.ecma-international...