Serverless Node.js8.10部署AWS时模块缺失问题求助
我之前也碰到过一模一样的问题,这种模块找不到的坑在Serverless + Webpack部署Lambda的时候真的很常见,尤其是当依赖是间接引入的时候(比如你遇到的underscore是promisified-request的子依赖)。咱们一步步来排查解决:
问题根源分析
从你的配置和错误日志来看,核心问题出在Webpack的nodeExternals配置和Serverless Webpack插件的依赖打包逻辑不匹配:
- 你用了
nodeExternals(),它默认会把所有node_modules里的模块排除在Webpack打包之外; - 但Serverless Webpack的
webpackIncludeModules需要明确知道哪些依赖要被包含到最终的部署包中,尤其是间接依赖的模块,它可能不会自动识别。
具体解决方案
1. 调整Webpack的Externals配置
修改你的webpack.config.js,让它区分本地开发和部署环境的externals处理:
const nodeExternals = require('webpack-node-externals'); const slsw = require('serverless-webpack'); module.exports = { entry: slsw.lib.entries, target: 'node', // 本地开发用nodeExternals,部署时用serverless-webpack的externals逻辑 externals: [slsw.lib.webpack.isLocal ? nodeExternals() : slsw.lib.externals()], node: { __dirname: false, __filename: false }, devtool: 'inline-source-map', module: { loaders: [{ test: /\.js$/, loaders: ['babel-loader'], include: __dirname, }] } };
这样部署时,Serverless Webpack会接管依赖的打包逻辑,确保需要的模块被包含。
2. 强制包含间接依赖的模块
在serverless.yml的webpackIncludeModules配置里,添加forceInclude字段,明确指定那些被间接依赖的模块:
custom: webpackIncludeModules: packagePath: './package.json' # 强制包含这些间接依赖的模块 forceInclude: - underscore - babel-runtime
这会确保即使是子依赖的模块,也会被打包到部署包中,不会被遗漏。
3. 确认依赖的安装位置
检查你的package.json,确保underscore和babel-runtime是放在dependencies而不是devDependencies里。因为Serverless默认不会把devDependencies里的包打包到部署环境中。如果之前误放在devDependencies里,执行:
npm install underscore babel-runtime --save
把它们移到dependencies中。
4. 清理缓存重新部署
有时候旧的打包缓存会导致奇怪的问题,先清理缓存再重新部署:
- 删除项目根目录下的
.webpack文件夹; - 执行
serverless remove删除已部署的资源; - 再运行
serverless deploy --stage <你的环境>重新部署。
验证步骤
部署完成后,你可以通过Serverless CLI查看部署包的内容,确认依赖是否被包含:
serverless package --stage <你的环境>
然后解压.serverless目录下的zip包,检查node_modules里是否有underscore和babel-runtime文件夹。
内容的提问来源于stack exchange,提问作者jta

