Node.js 20 ESM项目Webpack打包AWS Lambda时无法引入image-size问题
统一导入语法,避免ESM与CommonJS混用
你的项目已设置为ESM(type="module"),混用require()会导致Webpack对模块的识别逻辑混乱,改成ESM的import语法:import sizeOf from 'image-size';这样Webpack能正确追踪到该依赖,确保它被纳入打包流程。
检查Webpack的externals配置
如果你的Webpack配置使用了webpack-node-externals这类工具(常见于Serverless项目),默认会把所有node_modules的包排除在打包外,让Lambda运行时从环境中读取。若未给Lambda配置包含image-size的层,需要将image-size加入允许列表:const nodeExternals = require('webpack-node-externals'); module.exports = { // 其他配置 externals: [nodeExternals({ allowlist: ['image-size'] })], };若是自定义externals规则,确保
image-size不在被排除的列表中。确认Webpack的target设置
打包Node.js环境(AWS Lambda)的代码时,必须将Webpack的target设为node,这样Webpack会保留Node.js模块系统特性,正确处理CommonJS模块的导入:module.exports = { target: 'node', // 其他配置 };验证Webpack的resolve配置
部分CommonJS库的入口文件需要Webpack明确解析,确保resolve配置中包含正确的主字段:module.exports = { resolve: { mainFields: ['main', 'module'], }, // 其他配置 };这会让Webpack优先读取库的
main字段(CommonJS入口),避免解析失败。检查打包产物,确认依赖被包含
打包完成后,打开生成的bundle文件,搜索image-size相关代码,确认它已被打包进去。如果使用多文件打包模式,检查输出目录中是否包含image-size的模块文件。
内容的提问来源于stack exchange,提问作者cesarpachon

