Angular 5升级Angular 6编译报错:无法解析'stream'依赖
解决Angular 6升级后hash-base找不到'stream'的编译错误
这个问题的根源是Webpack 4+ 默认不再为浏览器环境自动polyfill Node.js核心模块,而你的依赖链里crypto-browserify依赖的hash-base需要stream模块的浏览器兼容实现——你之前安装的stream包是Node原生版本,没有提供浏览器所需的stream.Transform等API,所以没用。下面是两种可靠的解决办法:
方案一:手动配置stream-browserify polyfill
- 安装浏览器兼容的stream实现包
npm install stream-browserify --save-dev
- 自定义Webpack配置来替换模块
Angular 6使用@angular-devkit/build-angular管理构建,需要借助@angular-builders/custom-webpack来注入自定义配置:
- 先安装自定义构建工具:
npm install @angular-builders/custom-webpack --save-dev
- 在项目根目录新建
webpack.config.js:
const webpack = require('webpack'); module.exports = { resolve: { // 告诉Webpack在遇到stream模块时使用stream-browserify fallback: { "stream": require.resolve("stream-browserify") } }, plugins: [ // 全局提供Stream/stream变量,避免部分依赖找不到 new webpack.ProvidePlugin({ Stream: 'stream-browserify', stream: 'stream-browserify' }) ] };
- 修改
angular.json替换构建器
找到architect下的build和serve节点,把默认builder换成自定义webpack的版本,并指定配置文件路径:
"architect": { "build": { "builder": "@angular-builders/custom-webpack:browser", "options": { "customWebpackConfig": { "path": "./webpack.config.js" }, // 保留你原有的outputPath、index、main等配置... } }, "serve": { "builder": "@angular-builders/custom-webpack:dev-server", "options": { "customWebpackConfig": { "path": "./webpack.config.js" }, // 保留你原有的host、port等配置... } } }
方案二:一键处理所有Node核心模块polyfill(更省心)
如果担心后续还有其他Node模块缺失的问题,可以用node-polyfill-webpack-plugin自动处理所有Node核心模块的浏览器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的构建器为@angular-builders/custom-webpack:browser和@angular-builders/custom-webpack:dev-server,指向这个配置文件即可。
额外检查点
- 确认你的
tsconfig.json配置没问题:当前的target: es5和lib: ["es2017", "dom"]是合理的,不需要调整; - 你引入的Git仓库包如果有特殊Node依赖,上述polyfill方案也能覆盖,无需单独处理;
- 两种方案都可以解决你的问题,方案二更适合避免未来出现类似的模块缺失错误。
内容的提问来源于stack exchange,提问作者Icevarta
相关产品推荐
相关产品推荐

