场景:我想直接在js文件中引入模块,如下:
import { ChatGPTAPI } from 'chatgpt'
运行js文件,报错:
SyntaxError: Cannot use import statement outside a module
问题原因: ESM语法属于ES6,node环境是不支持import的
解决办法:
- 步骤1: 添加 "type": "module" 到你的 package.json 文件中的 "scripts" 字段来设置。
这样做的目的是告诉 Node.js 解析器,你希望运行的 JavaScript 文件是一个 ECMAScript 模块,因此可以使用 import 语句。
- 步骤2: 将 JavaScript 文件的扩展名从 .js 改为 .mjs。
例如:
将 index.js 改为 index.mjs。
然后,使用 node index.mjs 命令运行你的 JavaScript 文件,就可以使用 import 语句了。
遗留问题:
1、最开始为了解决node不支持ESM语法的问题,我安装了@babel/preset-env进行转译,并且创建了babel.config.js文件,添加了:
module.exports = {
"presets": [
["@babel/preset-env",
{
"targets":
{ "node": true }
}
]
]
}
未解决问题的原理还没弄清楚
扩展知识: js和mjs的区别: JS 文件和 MJS 文件是两种 JavaScript 文件类型。
- JS 文件(
.js扩展名)是 CommonJS 模块系统的实现,这是 Node.js 用于构建服务器端应用程序的主要模块系统。 - MJS 文件(
.mjs扩展名)是 ECMAScript 模块系统的实现,这是一种用于构建客户端应用程序的模块系统。
两种模块系统的主要区别在于:
- CommonJS 模块是同步加载的,因此如果你的代码依赖于外部模块,则在代码执行之前必须加载该模块。
- ECMAScript 模块是异步加载的,因此可以按需加载外部模块,从而提高了网页的性能。
因此,如果您正在构建服务器端应用程序,则应该使用 CommonJS 模块,并以 .js 扩展名保存您的文件。如果您正在构建客户端应用程序,则应该使用 ECMAScript 模块,并以 .mjs 扩展名保存您的文件。