MST

星途 面试题库

面试题:JavaScript的Node.js模块导入导出在不同版本中的变化及兼容性处理

随着Node.js版本的更新,模块导入导出机制有一些变化。请分析这些变化,比如ES6模块导入导出在Node.js不同版本中的支持情况,以及如何处理旧版本Node.js对新的模块导入导出方式的兼容性问题。
42.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

Node.js 模块导入导出机制变化分析

  1. ES6 模块导入导出在 Node.js 不同版本中的支持情况
    • 早期版本:Node.js 早期主要使用 CommonJS 模块系统,以 exportsmodule.exports 导出,require 导入。对 ES6 模块(importexport)支持不佳。
    • 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 后缀名。
  1. 处理旧版本 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');
}