关于模块化,在以前有过AMD和CMD,require.js以及后面的sea.js,实际上都是借助于第三方的插件。那么在ES6里面它官方引入了模块化编程,它的不一样之处在于:es6
ES6的Module它的运行环境其实是编译时的,也就是说在编译时它就会把全部的依赖导入导出,每个模块有本身独立的命名空间,而后这些关系都明确了。编程
编译时模块(module)体系模块化
export在ES5以前或者是在sea.js和require.js里面咱们用的都是export.default,可是在ES6咱们实际上只须要用一个export关键字就能够了,它是规定模块化的对外接口,也就是说导出的是什么。函数
状况一:下面的代码这两个若是放在一个模块化的尾部(或者是一个js尾部、一段代码尾部),那么它的意思就是说导出了两个变量,一个叫作name,一个叫作age,这是最基本的用法。工具
也就是说在一个js一段代码下咱们导出了两个模块,两个变量能够供外部使用或者说两个方法。ui
export const name = 'Eric'; export const age = 28;
状况二:default,默认引入。插件
当别人使用咱们写的模块的时候,可能会不知道咱们导出的关键字是什么,可是当使用了default以后,无论外来是以什么引入,以什么变量把它命名为何都没有关系,由于这时候导出的是整个的对象。所以,别人在引用这个对象时,能够随意命名,对象下面就能够看到变量的名称。code
const name = 'Eric'; const age = 28; export default { name, age };
状况三:导出方法对象
const name = 'Eric'; const age = 28; export default function getProperty() { return `name: ${name} age: ${age}` };
状况四:自身导出接口
const name = 'Eric'; const age = 28; export default { name as customName, age as customAge };
这里{ name, age }用到的是一个解构,对应上面的第一种导出写法。
import { name, age } from '../xxx.js';
重命名:
import { name as customName } from '../xxx.js';
下面的没有{}没有解构的它获得的是一个默认导出的,能够不用解构就直接导出。
import getProperty from '../xxx.js';
lodash是一个颇有用的函数是编程的工具库。
在ES6里面,当咱们引入两个一样的内容的时候,好比下面的写两遍import,但实际上它只会引入一次。甚至说当咱们引用了同一个文件两次,每次取它不一样的方法,可是实际上也只引入一次。这是ES6 Module内部的特有处理。
import 'lodash'; import 'lodash'; import { name } from '../xxx.js'; import { age } from '../xxx.js';
整个文件所有引入:* 表明全部,以下把../xxx.js文件下全部的都导出来而后把它命名到这个utils 。
import * as utils from '../xxx.js';
在某些场景下,咱们可能须要把export和import结合。好比咱们引入了不少其余的库,而后封装一下供咱们使用,在封装时咱们须要引入其余的库,也就是import,而后抛出来给咱们本身的模块,这个时候咱们就要用到export。
// 先引进来再导出去 import { foo, bar } from '../xxx.js'; export { foo, bar }; /* 等同于 */ export { foo, bar } from '../xxx.js';
把../xxx.js中的所有导出来而后再把它导出去:
export * from '../xxx.js';
把../xxx.js里面default导出的再把它导出来,这样省去了一些中间变量:
export { default } from '../xxx.js';
从../xxx.js中只引入其中一个es6,可是咱们把它默认的default成为了一个es6:
import { es6 } from '../xxx.js'; export default es6; // 等同于 也就是说从../xxx.js把es6引进来而后再把它export默认导出 export { es6 as default } from '../xxx.js'; // 默认导出也能够重命名 export { default as es6 } from '../xxx.js';
import除了引入模块,通常来讲咱们一般是把它放在文件的顶部来引入依赖,可是这个import它能够动态加载。好比说咱们有一些文件不须要用到,好比点击某一个按钮才可能去实现一些功能,那么实现这个功能的时候咱们就须要一些额外的文件,这个时候就须要用到import动态加载了。
按需加载
button.addEventListener('click', event => { import('./xxx.js') .then(value => { console.log(value); }) .catch(error => { /* Error */ }) });
条件加载
if (condition === 1) { import('./xxx.js').then(module => { console.log(module.default); }); } else if (condition === 2) { import('./xxx.js').then(({ name, age }) => { console.log(name, age); }); } else { import('./xxx.js').then(({ name: customName, age }) => { console.log(customName, age); }); }