Node.js升级至16后Serverless部署遇匹配及导入错误求助
问题分析与解决方案
核心问题拆解
No file matches include/exclude patterns错误:全局package.exclude: ['./**']规则过于激进,在Node.js 16对应的Serverless框架版本中,函数级的include无法覆盖全局排除所有文件的规则,导致打包时找不到符合条件的文件。Runtime.ImportModuleError崩溃:移除全局exclude后,函数级的include路径配置不匹配handler实际位置(handler在src/dist下,但include写的是dist/**/*),导致部署包缺失必要文件;同时serverless-plugin-optimize未适配Node.js 16,可能错误裁剪了依赖模块。
具体修复步骤
1. 调整全局打包排除规则
彻底删除exclude: ['./**'],换成精准排除本地无关文件的规则,避免误删部署必需文件:
package: { individually: true, exclude: [ '.git/**', '.env', 'localstack/**', 'tests/**', 'src/**/*.ts' // TS项目仅保留编译后的dist文件,源码无需部署 ] },
2. 修正函数级打包包含路径
匹配handler的实际路径,确保src/dist下的编译文件被正确打包,同时优化node_modules的打包范围:
functions: { api: { timeout: 30, handler: 'src/dist/serverless.handler', package: { include: [ 'src/dist/**/*', // 对应handler所在的实际路径 '!src/dist/**/*.map', // 排除sourcemap文件 'node_modules/**/*' ], exclude: [ 'node_modules/**/*.test.js', // 排除依赖中的测试文件 'node_modules/**/*.md' // 排除依赖中的文档 ] }, }, },
3. 适配serverless-plugin-optimize至Node.js 16
将插件升级到兼容Node.js 16的最新版本,并在custom配置中明确指定运行时版本,避免优化时裁剪必要依赖:
custom: { 'serverless-plugin-optimize': { enabled: true, minimize: true, nodeVersion: 'nodejs16.x' // 指定运行时版本,确保优化后的代码兼容 }, // 其他custom配置... },
4. 清理缓存并重新部署
- 删除项目根目录下的
.serverless文件夹,清除旧打包缓存 - 删除
node_modules并重新执行npm install,确保依赖是针对Node.js 16编译的 - 重新执行
serverless deploy
5. 精准排查缺失模块
如果仍出现Runtime.ImportModuleError,登录AWS查看对应函数的CloudWatch日志,找到具体无法导入的模块名称,然后在函数的package.include中单独添加该模块的路径(例如node_modules/xxx/**/*)。
内容的提问来源于stack exchange,提问作者Uri
相关产品推荐
相关产品推荐

