Module 的语法
概述
es6之前
AMD规范:全称”Asynchronous Module Definition”,称为 异步模块加载规范 。一般应用在浏览器端。流行的浏览器端异步加载库RequireJS实现的就是AMD规范。
- 依赖前置,提前执行!
CommonJS: 称为同步模块加载规范,也就是说,只有加载完成,才能执行后面的操作。用于服务器端。
- CommonJS 模块就是对象,输入时必须查找对象属性。代码运行时加载,输出的值是值得拷贝
let { stat, exists, readFile } = require('fs'); //只有先全部加载`fs`这个方法才能在这个对象上读取这个三个方法
es6中的module
ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。输入的是指的引用
- 这种加载称为“编译时加载”或者静态加载,效率更高
// ES6模块
import { stat, exists, readFile } from 'fs'; //从`fs`模块加载3个方法不用全部加载
export
每个module都是一个独立的文件,该文件类的所有内容外部都无法获取export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。
-
写法
export const name='haha' //也可以 name='haha' sex='male' export {name,sex} //可以接受多个属性 //输出变量和类 export function fn(){}
-
export 输出的变量是有名字的,可以使用as替换
function fn1(){} export {fn1 as fn2}
import
import ‘fs’ 这样会加载所有
import {xx,xxx} form ‘xxxxx’
import 导入的时候需要知道要导入的方法名称
如果使用了export default 的默认输出,我们import的时候可以用任意的名字
export.js
export default function fn(){} //一个模块只能有一个默认输出,还是可以通过export 正常导出其它函数,import {xx}通过指定名称正常导入
import.js
import foo from 'export.js' //import时候不能使用大括号
Node 加载
node将两者分开,ES6 模块和 CommonJS 采用各自的加载方案。
CommonJS 模块的输出都定义在module.exports这个属性上面。Node 的import命令加载 CommonJS 模块,Node 会自动将module.exports属性,当作模块的默认输出,即等同于export default xxx
- commonJS
// a.js module.exports = { foo: 'hello', bar: 'world' }; // 等同于 export default { foo: 'hello', bar: 'world' };