NodeJS模块与ES6模块系统语法及注意点详解

2020-06-17 07:10:41易采站长站整理

2.export default 用于导出一个默认值,使得用户可以不需要知道内部导出变量名称即可使用

PS: 一个模块只能有一个默认导出


export default 等同 export {add as default}
// 不能接变量声明语句
export default let a = 1

普通导出与默认导出使用的区别


// 普通导出的导入使用
export {f}
import {f} from 'fmod'

// 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
export default f
import c from 'fmod'

3.导出值与模块值是动态绑定的


export let foo = 'bar';
// 500毫秒后,其他模块拿到的foo值会变成bar
setTimeout(() => foo = 'baz', 500);

import用法

关键:

1.导入非默认变量时需要使用{}语法,并且变量要与导出时变量一致


// 普通导出的导入使用
export {f}
import {f} from 'fmod'

2.导入默认变量时,省略{},并且可以重命名导出变量


// 默认导出的导入使用,可以无需知道导出模块的内部变量名,任意重命名
export default f
import c from 'fmod'

3.可以使用*导出整体模块


// circle.js
export let radius = 1
export let area = 2*PI*radius
// main.js
import * as circle from './circle.js'
circle.radius
circle.area

4.可以使用,同时导出默认导出和常规导出


import _,{each, forEach} from 'lodash'

5.多次import同一模块,只会执行一次

6.import可以与require混用,但是其在静态分析阶段执行,也就是会先于require加载,这在要求一定的导入顺序时要注意


export { foo, bar } from 'my_module';

// 可以简单理解为,但是合并写法等同于没有在当前模块中导入my_module,即无法使用
import { foo, bar } from 'my_module';
export { foo, bar };

ESM加载CommmonJS

关键:

1.CommonJS模块输出对象module.exports将会被Node转换成默认导出


// 导出
export default module.exports
// 导入,类似导入默认
import m from './m'

2.此时CommonJS模块变量遵循其规则,不会动态绑定


module.exports = 123;
setTimeout(() => module.exports = null,500)
//500毫秒后,module.exports仍然是123

3.由于CommonJS模块运行时,才会确定输出的module.exports对象,而ESM在编译时就要确定接口,导入时,不允许解构语法