如何使用 `serverless 在 node_modules 中打包符号 link?
How can I package symbolic link in node_modules with `serverless?
我正在使用 serverless
打包 nodejs 应用程序。我在我的项目中使用 yarn workspace
。
- common
- projectA
- projectB
projectA
和 projectB
正在使用由 yarn workspace
管理的 common
模块。它在 node_modules/common -> ../common
中创建了一个 link。但是当我用 sls deploy
打包应用程序时,它不包含 link node_modules/common
。我怎样才能使它成为符号包 link?
您应该开始使用代码打包器。
什么是代码打包器?
代码打包器的作用:
- 它通过所有文件扫描您的 AWS Lambda 代码结构,从处理程序文件开始。
- 它遍历所有导入以创建依赖关系树。
- 然后它将所有这些依赖项内联到单个“胖”文件中。
- 之后您可以自由部署您的应用程序,它只有一个文件。
如您所见,它与 AWS Lambda 和您的用例完美匹配。
common
包中的所有依赖项都将包含在输出文件中。
代码打包器还有其他很酷的功能,比如删除所有不需要的文件,这些文件在您使用的库中定义,但您没有直接使用它们。由于 Lambda 的输出包大小会小很多,which will decrease cold starts.
如何使用无服务器框架实现这一目标
最简单的方法是从 serverless-webpack 插件开始,它包括 Webpack(最流行的代码打包器之一)和一些最常见的配置。
添加此插件后,只需在serverless.yml
中配置即可:
custom:
webpack:
webpackConfig: 'webpack.config.js' # you can remove it, it's the same as default
packager: 'yarn'
现在您需要使用 webpack.config.js
文件配置 Webpack。配置它有很多可能性,下面的例子是最基本的:
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',
},
};
现在,当您在 projectA
或 projectB
中调用 sls package
时,然后在解压缩 ./.serverless/functionName.zip
之后,您会发现只有一个“胖”文件,其中包括所有所需的依赖项。
在 sls deploy
阶段,此文件将部署为 Lambda 处理程序。
正确定义依赖关系
确保 common
包被列为 projectA
和 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 此处找到使用此方法的项目:
我正在使用 serverless
打包 nodejs 应用程序。我在我的项目中使用 yarn workspace
。
- common
- projectA
- projectB
projectA
和 projectB
正在使用由 yarn workspace
管理的 common
模块。它在 node_modules/common -> ../common
中创建了一个 link。但是当我用 sls deploy
打包应用程序时,它不包含 link node_modules/common
。我怎样才能使它成为符号包 link?
您应该开始使用代码打包器。
什么是代码打包器?
代码打包器的作用:
- 它通过所有文件扫描您的 AWS Lambda 代码结构,从处理程序文件开始。
- 它遍历所有导入以创建依赖关系树。
- 然后它将所有这些依赖项内联到单个“胖”文件中。
- 之后您可以自由部署您的应用程序,它只有一个文件。
如您所见,它与 AWS Lambda 和您的用例完美匹配。
common
包中的所有依赖项都将包含在输出文件中。
代码打包器还有其他很酷的功能,比如删除所有不需要的文件,这些文件在您使用的库中定义,但您没有直接使用它们。由于 Lambda 的输出包大小会小很多,which will decrease cold starts.
如何使用无服务器框架实现这一目标
最简单的方法是从 serverless-webpack 插件开始,它包括 Webpack(最流行的代码打包器之一)和一些最常见的配置。
添加此插件后,只需在serverless.yml
中配置即可:
custom:
webpack:
webpackConfig: 'webpack.config.js' # you can remove it, it's the same as default
packager: 'yarn'
现在您需要使用 webpack.config.js
文件配置 Webpack。配置它有很多可能性,下面的例子是最基本的:
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',
},
};
现在,当您在 projectA
或 projectB
中调用 sls package
时,然后在解压缩 ./.serverless/functionName.zip
之后,您会发现只有一个“胖”文件,其中包括所有所需的依赖项。
在 sls deploy
阶段,此文件将部署为 Lambda 处理程序。
正确定义依赖关系
确保 common
包被列为 projectA
和 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 此处找到使用此方法的项目: