使用nx-serverless模板导入node_modules依赖时webpack报Module not found错误
问题根因
报错是因为bcrypt属于带原生编译逻辑的依赖,它依赖的@mapbox/node-pre-gyp包中存在仅用于测试场景的可选依赖nock,默认不会在生产环境安装。而你当前的webpack配置未外置node_modules依赖,构建时会尝试解析所有导入的模块,找不到对应可选依赖就抛出了构建错误。
解决方案
方案1(优先推荐,无额外兼容问题)
直接替换bcrypt为纯JS实现的等价包bcryptjs,API完全兼容,无需修改业务逻辑,也不会出现原生依赖打包问题:
- 安装依赖:
npm i bcryptjs && npm i -D @types/bcryptjs
- 修改导入语句即可:
import { hash } from 'bcryptjs';
方案2(必须使用原生bcrypt时使用)
修改webpack配置和serverless打包规则:
- 修改webpack配置的externals字段,外置所有node_modules依赖,不需要把依赖打包进产物,运行时直接加载:
// 把原配置里的 externals: [] 替换为以下内容 externals: [ slsw.lib.entries, // 匹配所有非相对路径的导入,即node_modules下的依赖 /^[^./]|^\.[^./]|^\.\.[^/]/, // 单独显式外置原生相关依赖 'bcrypt', '@mapbox/node-pre-gyp' ],
- 添加IgnorePlugin过滤node-pre-gyp中的测试依赖,不需要解析未安装的可选依赖:
plugins: [ new webpack.IgnorePlugin({ resourceRegExp: /nock|aws-sdk-mock/, contextRegExp: /@mapbox\/node-pre-gyp/ }) ],
- 修改serverless.yml配置,打包时保留bcrypt相关依赖:
package: patterns: - 'node_modules/bcrypt/**' - 'node_modules/@mapbox/node-pre-gyp/**'
注意:如果部署到云厂商的Serverless运行环境,需要保证安装依赖时的系统架构与运行环境一致,比如AWS Lambda默认用x86_64架构的话,需要在对应架构的环境下安装依赖,避免原生二进制文件不兼容。
内容的提问来源于stack exchange,提问作者tamim abweini
相关产品推荐
相关产品推荐

