总结:
(1)es6模块化就是通过export关键字进行分别导出,通过 export { 变量标识符1,变量标识符2 }进行统一导出,通过 export defalt { key: value }进行默认导出(默认导出可匿名)。但是请注意变量标志符这几个字,也就说统一导出的并不是实际变量,export { key: value }这种写法错误!!里面只能写变量标识符。但是默认导入的是一个真实的对象,里面是可以写key:value的。然后对于导入的话,就用import关键字进行导入就好,有两点,一是可以起别名,二是统一导入和默认导入可以一起。
(2)commonjs模块化就是给exports对象添加属性来导出,分别导出就给exports添加不同的属性,统一导出就给 module.exports = { } 这个对象里面统一添加key:value。导入的话 就用require引入一下就好。注意一下exports 和 module.exports,其实都是指向同一块引用,所以别随便给 module.exports重新赋值一个对象,会导致导入的对象丢失。
(3)区别:commonjs是加载后立即执行,es6是静态加载,即运行时加载,node默认支持commonjs,如果node里想用es6,文件后缀名得是 .mjs。然后es6还支持再导出!export { a } from ''./a.js'这种,还支持动态导入,返回一个promise 即 import('a.js').then(a => { let b = a.func1 })这种,好高级!终于写完了这一条....
commonjs:
以下代码文件名:a.js
// commonjs模块化
function funA () {
console.log('a');
}
function funB () {
console.log('b');
}
// 导出
// 分别导出
exports.funA = funA
exports.funB = funB
// 统一导出
module.exports = { funA, funB }
以下代码文件名:b.js
// 分别导入
const funcs = require('./a.js')
funcs.funA() // a
funcs.funB() // b
// 统一导入
const { funA, funB } = require('./a.js')
funA() //a
funB() //b
ES6:
以下代码文件名:a.mjs
// ES6模块化
//分别导出
export function funA () {
console.log('a');
}
export function funB () {
console.log('b');
}
// 统一导出
export { funA, funB }
// 默认导出
export default { name: 'hui' }
以下代码文件名:b.mjs
// 分别导入
import { funA, funB } from "./a.mjs";
funA()
funB()
// 统一导入
import * as funcs from './a.mjs'
funcs.funA()
funcs.funB()
// 默认导入
import name from './a.mjs'
console.log(name);