解决 "Cannot use import statement outside a module" 错误

这个错误通常发生在 JavaScript 环境中不支持 ES6 模块语法(import/export)的情况下。以下是详细的解决方案,适用于不同环境(浏览器、Node.js、打包工具等)。


1. 浏览器环境

错误原因

浏览器默认不支持 import/export 语法,除非显式声明 <script type="module">。

解决方案

(1) 使用 type="module"

在 HTML 文件中引入脚本时,添加 type="module":

html 复制代码
<script type="module" src="your-script.js"></script>

注意:

  • 必须通过 HTTP 服务器(如 http://localhost)运行,不能直接打开本地文件(file://)。
  • 模块脚本默认启用严格模式,并遵循 CORS 规则。

(2) 使用打包工具(推荐)

如果项目较复杂,建议使用 Webpack、Vite、Rollup 等打包工具处理模块依赖:

bash 复制代码
npm install webpack webpack-cli --save-dev

配置 webpack.config.js:

javascript 复制代码
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist',
  },
  mode: 'development',
};

然后在 HTML 中引入打包后的文件:

html 复制代码
<script src="dist/bundle.js"></script>

2. Node.js 环境

错误原因

Node.js 默认使用 CommonJS (require),除非显式启用 ES6 模块。

解决方案

(1) 在 package.json 中设置 "type": "module"

json 复制代码
{
  "name": "my-app",
  "version": "1.0.0",
  "type": "module",  // 启用 ES6 模块
  "main": "index.js"
}

然后就可以使用 import:

javascript 复制代码
import fs from 'fs';

(2) 使用 .mjs 扩展名

如果不想修改 package.json,可以将文件扩展名改为 .mjs:

javascript 复制代码
// math.mjs
export function add(a, b) { return a + b; }

// index.mjs
import { add } from './math.mjs';

(3) 使用 Babel 转换(兼容旧版本 Node.js)

安装 Babel:

bash 复制代码
npm install @babel/core @babel/node @babel/preset-env --save-dev

创建 .babelrc:

json 复制代码
{
  "presets": ["@babel/preset-env"]
}

运行代码:

bash 复制代码
npx babel-node index.js

3. 通用解决方案(Babel + Webpack)

如果项目需要兼容多种环境(浏览器 + Node.js),推荐使用 Babel + Webpack 组合:

  1. 安装依赖

    bash 复制代码
    npm install webpack webpack-cli babel-loader @babel/core @babel/preset-env --save-dev
  2. 配置 webpack.config.js

    javascript 复制代码
    module.exports = {
      module: {
        rules: [
          {
            test: /\.js$/,
            exclude: /node_modules/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['@babel/preset-env']
              }
            }
          }
        ]
      }
    };
  3. 运行打包

    bash 复制代码
    npx webpack

4. 常见错误排查

  1. 路径问题
    • 确保 import 路径正确(如 './module.js' 而不是 'module.js')。
  2. CORS 限制
    • 浏览器模块必须通过 HTTP 服务器运行(如 live-server、vite)。
  3. 文件扩展名
    • Node.js 中建议使用 .mjs 或 "type": "module"。
  4. 混合模块系统
    • 避免在同一个项目混用 require 和 import。

总结

环境 解决方案
浏览器 <script type="module"> 或 Webpack/Vite
Node.js "type": "module" 或 .mjs 或 Babel
通用项目 Webpack + Babel

如果仍有问题,请检查:

  • 是否正确配置了模块系统?
  • 是否使用了正确的文件扩展名?
  • 是否运行在正确的服务器环境下?
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端