抛弃commonJS,在NodeJS中使用ESModules

380 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

用过NodeJS的小伙伴应该都知道,nodejs在2009年推出时就已经支持支持了模块化开发(即commonJS规范,简称cjs),它使用module.exports导出模块,require()方法引入模块,自此,服务端的模块化概念已经形成。

随着ES2015的推出,javascript也开始从语言层面上支持模块化(即ESModules),采用export导出模块,import引入模块,本文不深入讲解ESModules的用去,需要了解ESModules的小伙伴请查看我的另一篇文章《一文搞懂前端模块化开发之ES Modules

好的东西我们总会想用在所有的场景,ESModules虽然是前端模块化,但我们也会想,除了commonJS,能不能在NodeJS中使用ESModules呢,答案是肯定的,NodeJS已经对ESModules进行了支持,但如果你直接通过node index.js运行用了ESModules规范的文件,会得到的是以下报错:

node中使用esmodule1.png

因为NodeJS默认采用的是commonJS规范,直接使用import或export会报语法错误,想要在NodeJS中使用ESModules语法,需要通过以下两种方式:

  1. package.json中添加"type": "module"字段
  2. 模块js文件后缀名换成.mjs

在Nodejs v12.17.0 LTS 版之前,运行命令时还需要添加--experimental-modules 参数,比较繁琐

    node index.js --experimental-modules

在Nodejs v12.17.0 LTS版本之后,可以使用不添加参数执行文件

    node index.js

但由于ESModules仍处于Stability: 1 - Experimental 实验阶段,在该版本下运行代码还是会有以下警告信息,由于是在实验阶段,故在实际项目中不建议使用该功能

    (node:8776) ExperimentalWarning: The ESM module loader is experimental.

PS: NodeJS v14.0.0开始删除了以上警告信息

与commonJS不同,ES Modules 必须明确文件扩展名,所以自定义模块的引入必须加上.js后缀名,内置模块与npm安装的第三方模块可直接使用模块名

    import a from './a.js'
    import fs from 'fs'
    import express from 'express'

终上所术,要在NodeJS中使用ESModules,你的NodeJS版本必须在v12.17.0以上(建议v14.15.0 LTS版本),且项目package.json中添加"type":"module"(文件名可以是.js文件)或文件名为.mjs,这样就可以在NodeJS中愉快地使用ESModules了。

当然,到底是commonJS好,还是ESModules好,它们有什么区别等,后期我会继续推出相关文章,请小伙伴们持续关注我

关注.png