「这是我参与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规范的文件,会得到的是以下报错:
因为NodeJS默认采用的是commonJS规范,直接使用import或export会报语法错误,想要在NodeJS中使用ESModules语法,需要通过以下两种方式:
package.json
中添加"type": "module"
字段- 模块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好,它们有什么区别等,后期我会继续推出相关文章,请小伙伴们持续关注我