如何使用 `serverless 在 node_modules 中打包符号 link?

How can I package symbolic link in node_modules with `serverless?

我正在使用 serverless 打包 nodejs 应用程序。我在我的项目中使用 yarn workspace

- common
- projectA
- projectB

projectAprojectB 正在使用由 yarn workspace 管理的 common 模块。它在 node_modules/common -> ../common 中创建了一个 link。但是当我用 sls deploy 打包应用程序时,它不包含 link node_modules/common。我怎样才能使它成为符号包 link?

您应该开始使用代码打包器。

什么是代码打包器?

代码打包器的作用:

  1. 它通过所有文件扫描您的 AWS Lambda 代码结构,从处理程序文件开始。
  2. 它遍历所有导入以创建依赖关系树。
  3. 然后它将所有这些依赖项内联到单个“胖”文件中。
  4. 之后您可以自由部署您的应用程序,它只有一个文件。

如您所见,它与 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',
  },
};

现在,当您在 projectAprojectB 中调用 sls package 时,然后在解压缩 ./.serverless/functionName.zip 之后,您会发现只有一个“胖”文件,其中包括所有所需的依赖项。

sls deploy 阶段,此文件将部署为 Lambda 处理程序。

正确定义依赖关系

确保 common 包被列为 projectAprojectB 的依赖项:

// 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 此处找到使用此方法的项目:

https://github.com/PatrykMilewski/serverless-series