如何在Node.js中使用ES6模块化语法


众所周知,在 Node 中不能直接使用 ES6 模块。通常情况下是这样的,但是如果我们非要用 ES6 模块那也是可以滴。下面我就介绍两种在 Node 环境下使用 ES6 模块的方法。不过在此之前,你必须保证项目中 Node 的版本在 14 以上。

方法一:修改文件后缀名

在 Node 项目中使用 ES6 模块最简单的方法就是将.js文件的扩展名替换为.mjs。Node 在编译.mjs文件时,将会使用ES6模块化规范来处理代码,而不是使用默认的CommonJS模块化规范。同时,你也可以用.cjs文件扩展名告诉 Node 使用CommonJS模块化规范处理代码。简而言之,你可以通过文件扩展名来告诉 Node 使用哪种模块化规范来处理代码,默认使用的是CommonJS

在 ES6 模块化的文件中导入 CommonJS 模块

Node 支持在ES6模块中导入CommonJS模块。例如:

// a.mjs
import test from 'b';
test.helloworld(); // hello world!
// b.cjs
module.exports = {
    helloworld: function(){
        console.log('hello world!');
    }
}

但是反过来,在CommonJS模块中导入ES6模块在 Node 中不支持。如果非要在CommonJS模块中使用ES6模块,我们可以借助一些编译器来帮助我们把ES6模块翻译成CommonJS模块,从而实现导入。

方法二:配置 Package.json 文件

如果想要在整个项目中都使用ES6模块化规范,一个一个更改文件扩展名太费劲了。我们可以通过在项目的package.json文件中添加"type": "module"。例如:

// package.json
{
  "name": "ESM_Module",
  "version": "1.0.0",
  "description": "This is a test project",
  "main": "index.js",
  "type": "module", // 添加类型说明
  "scripts": {
    "start": "node index.js"
  },
}

当我们在package.json中添加"type": "module"时,所有的文件都会被 Node 当作 ES6 模块文件来处理,除非该文件的扩展名为.cjsnode_modules文件夹中的依赖文件还是使用CommonJS模块化规范处理,不会受到影响。