Module加载的详细说明-保证你有所收获( 二 )

// lib.jsexport let counter = 3;export function incCounter() {counter++;}// main.jsimport { counter, incCounter } from './lib';console.log(counter); // 3incCounter();console.log(counter); // 4在举一个小粒子// m1.jsexport var foo = 'bar';setTimeout(() => foo = 'baz', 500);// m2.jsimport {foo} from './m1.js';console.log(foo);setTimeout(() => console.log(foo), 500);上面代码中 , m1.js的变量,foo,在刚加载时等于bar,过了 500 毫秒,又变为等于baz 。Node.js 的模块加载方法JavaScript 现在有两种模块 。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS 。CommonJS 模块是 Node.js 专用的 , 与 ES6 模块不兼容 。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports.ES6 模块使用import和export 。ps:从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持 。Node.js 要求 ES6 模块采用.mjs后缀文件名 。也就是说,只要脚本文件里面使用import或者export命令 , 那么就必须采用.mjs后缀名 。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict" 。友情提示注意,ES6 模块与 CommonJS 模块尽量不要混用 。require命令不能加载.mjs文件 , 会报错 。只有import命令才可以加载.mjs文件 。反过来.mjs文件里面也不能使用require命令,必须使用import 。简单说一下他们的第2个差异第二个差异是因为 CommonJS 加载的是一个对象,通过 module.exports 输出 。该对象只有在脚本运行完才会生成 。而ES6 模块不是对象,它的对外接口只是一种【静态定义】,在代码静态解析阶段就会生成 。【Module加载的详细说明-保证你有所收获】

推荐阅读