【发布时间】:2020-04-13 06:40:04
【问题描述】:
我在 nodeJs 存储库上使用 webpack 和 serverless.com 框架来部署到 AWS Lambda 函数。由于 AWS 上的 Lambda 容器已经包含 aws-sdk,因此我试图将其从打包中排除。
构建期间的输出实际上将 aws-sdk 标识为已排除:
[41] ./src/controller/queue.ts 2.57 KiB {3} [built]
[43] ./src/controller/auth.ts 3.76 KiB {1} [built]
+ 30 hidden modules
Serverless: Excluding external modules: aws-sdk@^2.309.0
Serverless: Package lock found - Using locked versions
Serverless: Packing external modules: @hapi/joi@^16.1.5, moment-timezone@^0.5.23, axios@^0.19.0, chrome-aws-lambda@^2.0.1, puppeteer-core@^2.0.0, uuid@^2.0.3, memorystream@^0.3.1, lambda-warmer@^1.2.1, jsonwebtoken@^8.5.1, typeorm@0.2.9, js-yaml@^3.12.0
Serverless: Packaging service...
然而,为上传到 Lambda 而构建的 zip 文件仍然包含 aws-sdk,并且使该包接近 60MB。我还在构建过程中查看了 .webpack 中的文件夹,并注意到 node_modules 文件夹位于依赖项文件夹和服务文件夹中,而 aws-sdk 位于服务文件夹下。不过我真的不知道那是什么意思。
感谢任何帮助。令人沮丧的是,它明目张胆地表示将其排除在外,但无论如何它都被拉进了拉链。
我的 webpack.config.js 如下:
const webpack = require("webpack");
const path = require("path");
const serverlessWebpack = require("serverless-webpack");
const nodeExternals = require("webpack-node-externals");
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
entry: serverlessWebpack.lib.entries,
target: 'node',
mode: serverlessWebpack.lib.webpack.isLocal ? "development" : "production",
node: {
__dirname: true
},
devtool: 'source-map',
externals: [nodeExternals()],
module: {
rules: [
{
test: /\.ts$/,
use: [
{
loader: "ts-loader"
}
],
include: [__dirname],
exclude: /node_modules/
}
]
},
resolve: {
extensions: [".ts", ".tsx", ".js"]
},
output: {
libraryTarget: "commonjs",
path: path.join(__dirname, ".webpack"),
filename: "[name].js"
},
plugins: [
new webpack.EnvironmentPlugin({
NODE_ENV: "development"
}),
new CopyWebpackPlugin([
{ from: 'ormconfig.yml' },
])
]
};
在 serverless-webpack 插件的 serverless.yml 自定义部分中,我的配置是:
webpack:
webpackConfig: webpack.config.js
includeModules:
forceExclude:
- aws-sdk
packager: 'yarn'
【问题讨论】:
标签: node.js webpack aws-lambda serverless-framework