Node.js 模块导入导出机制变化分析
- ES6 模块导入导出在 Node.js 不同版本中的支持情况
- 早期版本:Node.js 早期主要使用 CommonJS 模块系统,以
exports
或 module.exports
导出,require
导入。对 ES6 模块(import
和 export
)支持不佳。
- Node.js v13.2.0+:实验性支持 ES6 模块,文件需以
.mjs
为后缀名,且 package.json
中需设置 "type": "module"
。例如:
// 导出
// utils.mjs
export const add = (a, b) => a + b;
// 导入
// main.mjs
import { add } from './utils.mjs';
console.log(add(1, 2));
- Node.js v14.13.1+:稳定支持 ES6 模块,
.mjs
后缀名仍可用,同时若 package.json
中有 "type": "module"
,.js
文件也可当作 ES6 模块处理。若要在 .js
文件中使用 CommonJS 模块,可用 .cjs
后缀名。
- 处理旧版本 Node.js 对新的模块导入导出方式的兼容性问题
- 使用 Babel:
- 安装 Babel 相关依赖,如
@babel/core
、@babel/cli
、@babel/preset - env
。
- 配置
.babelrc
文件:
{
"presets": [
[
"@babel/preset - env",
{
"targets": {
"node": "current"
}
}
]
]
}
- 然后通过 Babel 命令将 ES6 模块代码转译为 CommonJS 模块代码,例如:`npx babel input.mjs -o output.js`。
- 使用 Rollup 或 Webpack:
- Rollup:安装
rollup
及相关插件,如 @rollup/plugin - commonjs
、@rollup/plugin - node - resolve
。配置 rollup.config.js
文件:
import commonjs from '@rollup/plugin - commonjs';
import resolve from '@rollup/plugin - node - resolve';
export default {
input: 'input.mjs',
output: {
file: 'output.js',
format: 'cjs'
},
plugins: [
resolve(),
commonjs()
]
};
- **Webpack**:安装 `webpack`、`webpack - cli` 及 `@babel/preset - env` 等相关依赖。配置 `webpack.config.js` 文件,利用 Babel 加载器将 ES6 模块转译为 CommonJS 模块。例如:
module.exports = {
entry: './input.mjs',
output: {
filename: 'output.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: {
loader: 'babel - loader',
options: {
presets: ['@babel/preset - env']
}
}
}
]
}
};
- 条件加载:在代码中根据 Node.js 版本进行条件加载。例如,通过
process.versions.node
获取 Node.js 版本,在代码中:
if (parseInt(process.versions.node.split('.')[0]) >= 13) {
import { someFunction } from './module.mjs';
} else {
const { someFunction } = require('./module.cjs');
}