You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webpack编译Node.js项目时ES模块转CommonJS问题求助

问题描述

使用Webpack编译Node.js项目时,编译过程无异常,但代码中的import被转为require,运行dist目录下的index.js时出现**“必须在ES模块中使用import”**的错误。

当前配置与代码

webpack.config.js

import path from "path";
import {fileURLToPath} from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
import nodeExternals from "webpack-node-externals";

export default {
    entry: './src/index.ts',
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: 'index.js',
        chunkFormat: "module"
    },
    target: 'node',
    module: {
        rules: [
            {
                test: /\.ts$/,
                exclude: /node_modules/,
                use: {
                    loader: 'ts-loader'
                }
            }
        ]
    },
    devtool: 'source-map',
    externals: [nodeExternals()]
}

TypeScript源文件(src/index.ts)

import fetch from "node-fetch";
fetch("http://example.com").then((data => console.log(data)));

编译后代码(dist/index.js片段)

const o = require("node-fetch");

需求

希望Webpack仅做优化和压缩,保留ES模块语法,编译后输出:

import o from "node-fetch";

解决方案

要让Webpack保留ES模块语法,需同步调整Webpack、TypeScript及项目配置:

1. 更新Webpack配置

  • 指定兼容ES模块的Node版本,避免默认兼容旧版本导致转CommonJS
  • 开启ES模块输出实验特性,配置输出格式为ES模块
  • 修改node-externals配置,让外部模块保留import引用

修改后的webpack.config.js关键部分:

export default {
    // ... 其他原有配置
    target: 'node20', // 指定支持ES模块的Node版本
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: 'index.js',
        chunkFormat: "module",
        libraryTarget: "module" // 明确输出ES模块
    },
    experiments: {
        outputModule: true // 启用ES模块输出支持
    },
    externals: [nodeExternals({
        importType: 'module' // 外部模块使用import语法引用
    })]
    // ... 其他原有配置
}

2. 修改TypeScript配置(tsconfig.json)

确保TypeScript编译输出ES模块而非CommonJS:

{
    "compilerOptions": {
        "module": "ESNext", // 或ES2020+,匹配Node支持的版本
        "moduleResolution": "NodeNext",
        "target": "ES2020",
        "outDir": "./dist",
        "sourceMap": true
    },
    "include": ["src/**/*"]
}

3. 配置package.json

在项目根目录的package.json中添加声明,明确项目使用ES模块:

{
    "type": "module"
}

内容的提问来源于stack exchange,提问作者Hosein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:25:03