【问题标题】:Serverless Framework: How to add external NPM packages?无服务器框架:如何添加外部 NPM 包?
【发布时间】:2016-09-07 06:03:51
【问题描述】:

我的情况是在将外部 NPM 包添加到我的无服务器框架项目(特定包是 geopoint)时遇到了一些麻烦。

我去了无服务器项目的根文件夹并运行npm install geopoint --save。 package.json 更新为 dependencies": { "geopoint": "^1.0.1" } 并创建了 node_modules 文件夹。

我的文件夹结构如下:
根项目文件夹
-功能
--地理空间
---handler.js
-node_modules
--geopoint

在我的 functions/geospatial/handler.js 中,我声明了 geopoint 模块:

    var geopoint = require('geopoint');
    var geopoint = require('../../geopoint');
    var geopoint = require('../../../geopoint');

lambda 控制台返回错误:

    {
      "errorMessage": "Cannot find module '../../geopoint'",
      "errorType": "Error",
      "stackTrace": []
    }

如何正确地将外部 NPM 模块添加到无服务器框架项目?

【问题讨论】:

  • 你为什么要首先解决../geopoint../../geopoint?它是无服务器特有的吗?

标签: node.js aws-lambda serverless-framework


【解决方案1】:

我认为您所经历的与我最近所经历的相同。我可以在我的应用程序根目录中安装 npm 包,但不会将任何内容部署到 lambda。

我的理解是,serverless 将所有内容部署在每个组件目录下(应用程序根目录下的子目录)。在您的情况下,在functions 下。

我在无服务器文档中找不到太多关于此的内容,但我所做的是在我的 functions 文件夹下定义一个 package.json 文件,然后在该子目录中运行 npm install。然后在部署到 lambda 之后,这个目录下的node_modules 也被部署了,这意味着我的函数代码可能需要这些 npm 模块中的任何一个。

因此,您的文件夹结构现在应该如下所示:

root-project-folder
|-functions
|--package.json
|--node_modules
|---geopoint
|--geospatial
|---handler.js
|-package.json
|-node_modules
|--geopoint

这里的好处是你只能部署你的函数需要的 npm 依赖项,而没有那些 serverless 需要部署你的资源的依赖项。

希望这会有所帮助 - 再一次,我不确定这是最佳实践,因为我没有在无服务器存储库或任何示例代码中找到的任何地方记录这一点。

【讨论】:

  • 您好,感谢您的回答,但我找到了另一种方法。在函数的 s-functions.json 中,我将 "handler": "handler.handler" 行编辑为 "handler": "functions/geospatial/get_bounding_coordinates/handler.handler",,以便将函数根设置为节点模块的目录。
  • 你好。是的,感谢您发送。我发现虽然您的建议有效,但 sls dash deploy 花了更长的时间,因为它也试图从我的根 node_modules 文件夹中捆绑开发依赖项。虽然我可以使用npm prune --prod,但我想我会保留第二个 node_modules,就像我在答案中使用的那样,以加快部署速度,并且不必在每次部署时修剪开发依赖项。
  • 您是正确的,编辑用于处理程序属性的值是要走的路。您应该能够构建您的函数,以便您可以使 node_modules 对给定函数非常具体(如您所愿)。例如,我的主项目有一个 package.json,然后是两个额外的 package.json 文件,一个用于每组 lambda 函数。
  • 很棒的电话@Mikelax,任何让每个 lambda 函数的大小尽可能小的东西在我看来都是一件好事。
【解决方案2】:

对我来说最好的解决方案是无服务器插件:serverless-plugin-include-dependencies

serverless-plugin-include-dependencies

【讨论】:

  • 可以确认这一点。完美运行
  • 也为我工作!
【解决方案3】:

您可以执行以下操作:

# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.

Reference document

【讨论】:

  • 这太棒了!谢谢男人。
【解决方案4】:

如果有人遇到这个问题并且以上答案都没有帮助,试试这个(对我有用):

custom: 
  webpack:
    webpackIncludeModules: true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2019-08-04
    • 1970-01-01
    相关资源
    最近更新 更多