SyntaxError: Cannot use import statement outside a module

1,213 阅读2分钟

场景:我想直接在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 扩展名保存您的文件。