如何使用无服务器打包 node_modules 中的符号链接?

问题描述

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

- common
- projectA
- projectB

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

解决方法

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

什么是代码打包器?

代码打包器的作用:

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

如您所见,它非常适合 AWS Lambda 和您的用例。

来自 common 包的所有依赖项都将包含在输出文件中。

代码捆绑器还有其他很酷的功能,例如删除所有不需要的文件,这些文件在您使用的库中定义,但您没有直接使用它们。由于您的 Lambda 的输出包大小会小很多,which will decrease cold starts.

如何使用 Serveless 框架实现这一点

最简单的方法是从 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',};

现在,当您在 sls packageprojectA 中调用 projectB 时,解压缩 ./.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","dependencies": {
      "@your-project/common": "1.0.0"
  }
}

因此,您将能够通过以下方式在 pakcageA 导入中引用公共资源:

import exampleHelper from '@your-project/common/src/exampleHelper';

可以在我的 Github 上找到使用这种方法的项目:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...