微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用无服务器打包 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。