首先,我们要明白一个前提,那就是CommonJS模块规范与ES模块规范是不同的概念
1. CommonJs
1.1 概念
- Node应用由模块组成,采用CommonJS模块规范。
-
- 根据规范,每个文件就是一个模块,有自己单独的作用域。在一个文件里面定义变量,函数,类等都是私有的,对其他的文件不可见。
- 根据规范,每个模块内部,module白能量代表当前模块。这个变量是一个对象,它的exports属性(module.exports)是对外的接口。
- module.exports用于输出文件定义内容,require用于加载模块。
1.2 实例
1.2.1 module.exports
// example.jslet x = 5;let addX = (value) => { return x + value;}module.exports.x = x;module.exports.addX = addX;复制代码
1.2.2 require
let requireTest = require(./example.js);let x = requireTest.x;let addX = requireTest.addX(3);console.log(x); // 5console.log(addx); // 8复制代码
1.3 exports与module.exports
- Node为每个模块提供了一个exports变量,指向module.exports。这如同在每个模块的头部添加如下代码:
let exports = module.exports;复制代码
- module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是module.exports而不是exports。 所有的exports收集到的属性和方法,都赋值给了Module.exports。
2. ES6模块规范
2.1 概念
- 不同于CommonJS,ES6使用的是export和import来导出和导入模块。
- export命令规定的是对外的接口,必须与模块内部的变量建立意义对应关系。
2.2 实例
2.2.1 export
let firstName = "Chengwu";let lastName = "Du";export { firstName, lastName }复制代码
2.2.2 export意义对应实例
// oneexport const PI = "3.1415926";// twolet name = "Robin";export { name }// threelet n = "Robin";export { n as name }复制代码
2.2.3 import
import { firstName, lastName } from "./export.js";let name = firstName + lastName;console.log(name); // Chengwu Du复制代码
2.3 export default
export defalut function() { return "Robin";}复制代码
2.3.1 export default与export区别
- 在一个文件或者模块中,export和import可以有多个,但是export default却仅有一个。
- 通过export方式导出,再导入时需要加{},按需加载。但是export default不需要。
- 输出单个模块时使用export default,多个模块时使用export。
- 不要同时使用。