Angular构建时无法解析Node内置模块"timers"(依赖xml2js引发)
Angular构建时无法解析Node内置模块"timers"(依赖xml2js引发)
嘿,我之前也碰到过一模一样的问题!你这个情况其实很好捋清楚:xml2js这个库内部用到了Node.js专属的timers内置模块,但Angular默认的生产构建是针对浏览器环境打包的,浏览器里根本没有这个模块,所以打包工具(不管是Webpack还是现在的Esbuild)就会报错找不到它。而ng serve不管是开发还是生产模式,开发服务器的配置可能自动兼容了这类Node模块,所以能正常跑起来。
给你几个实用的解决办法,你可以按顺序试试:
1. 先检查xml2js版本,回退到之前能正常工作的版本
你说之前构建没问题,最近才出问题,很大概率是xml2js更新了版本,新增了timers的依赖。你可以打开package.json,把xml2js的版本号改成之前能正常构建的那个(比如之前是0.4.23,就写成"xml2js": "0.4.23"),然后删掉node_modules和package-lock.json(或者yarn.lock),重新执行npm install,再试试ng build。这个方法最简单,能快速验证是不是版本更新导致的问题。
2. 给浏览器环境添加Node内置模块的polyfill
如果不想回退版本,那就得给打包工具配置polyfill,让它在浏览器环境模拟timers模块的功能:
如果你用的是Webpack构建的Angular版本(Angular 15及以前默认)
- 先安装polyfill插件:
npm install node-polyfill-webpack-plugin --save-dev
- 在项目根目录新建一个
webpack.config.js文件,内容如下:
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); module.exports = { plugins: [ new NodePolyfillPlugin() ] };
- 打开
angular.json,找到你项目的build配置(路径:projects -> [你的项目名称] -> architect -> build -> options),添加一行配置指定webpack配置文件:
"webpackConfig": "webpack.config.js"
然后重新执行ng build应该就可以了。
如果你用的是Esbuild构建的Angular版本(Angular 16及以后默认)
- 先安装需要的polyfill插件:
npm install @esbuild-plugins/node-globals-polyfill @esbuild-plugins/node-modules-polyfill --save-dev
- 打开
angular.json,找到项目的build配置,在options里添加esbuildOptions配置:
"esbuildOptions": { "plugins": [ { "name": "@esbuild-plugins/node-modules-polyfill" }, { "name": "@esbuild-plugins/node-globals-polyfill", "options": { "timers": true } } ] }
保存后重新构建,问题应该就能解决了。
备注:内容来源于stack exchange,提问作者R1D3R175
相关产品推荐
相关产品推荐

