首页 > 解决方案 > 如何在 node_modules 中使用“无服务器”打包符号链接?

问题描述

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

- common
- projectA
- projectB

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

标签: aws-lambdayarnpkgserverless-frameworkyarn-workspaces

解决方案


您应该开始使用代码捆绑器。

什么是代码捆绑器?

代码捆绑器的作用:

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

如您所见,它非常适合 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,您会发现只有一个“胖”文件,其中包含所有必需的依赖项。projectAprojectB./.serverless/functionName.zip

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

正确定义依赖关系

确保该common包被列为projectAand的依赖项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 上找到:

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


推荐阅读