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
相关产品推荐
相关产品推荐

