node 环境下一个文件如何同时支持 import 和 requ
2022-05-10 本文已影响0人
月半女那
JavaScript 现在有两种模块。一种是 ES6 模块,简称 ESM;另一种是 CommonJS 模块,简称 CJS。
CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。
如何让require 和 import在同一文件中使用
- npm init -y 会默认生成一个package.json
- 在package.json这种添加 type :'module'
一旦设置了以后,该项目的 JS 脚本,就被解释成 ES6 模块。
index.js
// ES6 模块需要支持静态代码分析,而 CommonJS 模块的输出接口是module.exports,是一个对象,无法被静态分析,所以只能整体加载。
import lib from './lib.cjs'
import * as newLib from './newLib.js'
console.log(lib.count) // 3
lib.incCounter();
console.log(lib.count) // 3
console.log(newLib.count) // 3
newLib.incCounter();
console.log(newLib.count) // 4
lib.cjs
let count = 3;
function incCounter(){
return count++;
}
module.exports = {
count,
incCounter
}
newLib.js
let count = 3;
function incCounter(){
return count++;
}
export {
count,
incCounter
}
如果这时还要使用 CommonJS 模块,那么需要将 CommonJS 脚本的后缀名都改成.cjs。则.js脚本会被解释成 CommonJS 模块。
- CommonJS 模块是 Node.js 专用的,与 ES6 模块不兼容。语法上面,两者最明显的差异是,CommonJS 模块使用require()和module.exports,ES6 模块使用import和export。
- 它们采用不同的加载方案。从 Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持。
Node.js 要求 ES6 模块采用.mjs后缀文件名。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。Node.js 遇到.mjs文件,就认为它是 ES6 模块,默认启用严格模式,不必在每个模块文件顶部指定"use strict"。