Webpack配置target:'node'与type:'module'时报require未定义错误
问题原因
你已将body-parser等依赖配置为Webpack的externals外部依赖(即不将这类依赖打包进最终产物),Webpack默认对Node环境的外部依赖会生成CommonJS规范的require调用代码。即使项目根目录package.json设置了"type": "module",Webpack默认也不会自动切换外部依赖的加载方式为ES模块的import语法,因此打包产物中混进了CommonJS专属的require语法,在ESM运行环境下执行就会触发ReferenceError: require is not defined报错。
项目未经过Webpack处理时可以正常运行,是因为Node原生会根据"type": "module"配置自动识别ES模块语法,同时处理依赖加载逻辑,不需要通过Webpack生成的加载代码调用依赖。
解决方案
- 方案1:调整Webpack配置输出纯ES模块产物,强制外部依赖使用ESM语法加载
在Webpack配置中新增如下参数即可:// webpack.config.js export default { target: 'node', output: { module: true, // 保留你原来的其他output配置,比如filename、path等 }, externalsType: 'module', // 保留你原来的externals配置,比如externals: ['body-parser', 'express']等 experiments: { outputModule: true // Webpack 5需要开启该实验特性,支持输出ESM格式产物 } // 保留你原来的其他配置项 } - 方案2:兼容CommonJS格式运行
保持当前Webpack配置不变,将打包后输出的JS文件扩展名从.js改为.cjs,Node会自动将该文件识别为CommonJS模块,允许使用require语法加载依赖。 - 方案3:取消外部依赖配置
删掉Webpack配置中的externals相关配置项,让Webpack把所有Node服务依赖都打包进最终产物,不会生成外部依赖的require调用代码,仅会增大产物体积,不影响运行。
内容的提问来源于stack exchange,提问作者Han Dijk
相关产品推荐
相关产品推荐

