aws-lambda - 如何在 node_modules 中使用“无服务器”打包符号链接?
问题描述
我正在使用serverless
打包 nodejs 应用程序。我yarn workspace
在我的项目中使用。
- common
- projectA
- projectB
projectA
和projectB
正在使用common
由 管理的模块yarn workspace
。它在内部创建一个链接node_modules/common -> ../common
。但是当我用 打包应用程序时sls deploy
,它不包含链接node_modules/common
。我怎样才能使它打包符号链接?
解决方案
您应该开始使用代码捆绑器。
什么是代码捆绑器?
代码捆绑器的作用:
- 它从处理程序文件开始扫描所有文件的 AWS Lambda 代码结构。
- 它遍历所有导入以创建依赖关系树。
- 然后它将所有这些依赖项内联到单个“胖”文件中。
- 之后,您可以自由部署只有单个文件的应用程序。
如您所见,它非常适合 AWS Lambda 和您的用例。
包中的所有依赖项common
都将包含在输出文件中。
此外,代码捆绑器还有其他很酷的功能,例如删除所有不需要的文件,这些文件在您使用的库中定义,但您并没有直接使用它们。由于您的 Lambda 的输出包大小会小很多,这将减少冷启动。
如何使用无服务框架实现这一目标
最简单的方法是从serverless-webpack插件开始,其中包括 Webpack(最流行的代码捆绑器之一)和一些最常见的配置。
添加此插件后,只需在以下位置进行配置serverless.yml
:
custom:
webpack:
webpackConfig: 'webpack.config.js' # you can remove it, it's the same as default
packager: 'yarn'
现在你需要使用 file.config 配置 Webpack webpack.config.js
。有很多配置它的可能性,下面的例子是最基本的:
const path = require('path');
const slsw = require('serverless-webpack');
module.exports = {
entry: slsw.lib.entries,
target: 'node',
mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
stats: 'minimal',
devtool: 'nosources-source-map',
externals: [{'aws-sdk': 'commonjs aws-sdk'}],
resolve: {
extensions: ['.js', '.json'],
},
output: {
libraryTarget: 'commonjs2',
path: path.join(__dirname, '.webpack'),
filename: '[name].js',
sourceMapFilename: '[file].map',
},
};
现在,当您调用or ,然后在 unzipping 之后 sls package
,您会发现只有一个“胖”文件,其中包含所有必需的依赖项。projectA
projectB
./.serverless/functionName.zip
在sls deploy
阶段期间,此文件将部署为 Lambda 处理程序。
正确定义依赖关系
确保该common
包被列为projectA
and的依赖项projectB
:
// common/package.json
{
"name": "@your-project/common",
"version": "1.0.0",
"license": "ISC",
}
// projectA/package.json
{
"name": "@your-project/packageA",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@your-project/common": "1.0.0"
}
}
多亏了这一点,您将能够通过以下方式在 pakcageA 导入中引用公共资源:
import exampleHelper from '@your-project/common/src/exampleHelper';
使用这种方法的项目可以在我的 Github 上找到:
推荐阅读
- r - 在 R - 对角 AB 线上绘图
- java - 如何在 Android 上下载 mp3 文件?
- java - 在没有服务的情况下杀死应用程序后如何在后台线程中运行代码?
- debugging - 如何强制 Rider 使用 Chrome 进行调试?
- sql - 优化加入GreenPlum
- bash - 如何使用 awk/bash 脚本减去两列的值并添加到文本文件中的新列
- javascript - 为端点应用 JWT Guard,但当它有请求参数时不应用它
- javascript - React useState:切换对象内部的布尔属性-如何识别onClick源?
- c - 在while循环中使用时如何访问scanf的返回值?
- python - 如何从 2 个类继承而无需更改原始类?