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

// lib.jsvar counter = 3;function incCounter() {counter++;}module.exports = {get counter() {return counter},incCounter: incCounter,};// main.jsvar mod = require('./lib');console.log(mod.counter);// 3mod.incCounter(); //调用console.log(mod.counter); // 4ES6 模块的运行机制与 CommonJS 不一样 。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用 。等到脚本真正执行时,再根据这个只读引用到被加载的那个模块里面去取值 。换句话说,ES6 的import有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变 。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块 。还是举上面的例子 。// 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 模块不是对象,它的对外接口只是一种【静态定义】,在代码静态解析阶段就会生成 。

经验总结扩展阅读