24

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

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

我的文件夹结构如下所示:
root-project-folder
-functions
--geospatial
---
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 模块添加到无服务器框架项目?

4

4 回答 4

28

我想你所经历的和我最近所经历的一样。我可以在我的应用程序根目录中安装 npm 包,但没有任何东西可以部署到 lambda。

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

我在无服务器文档中找不到太多关于此的内容,但我所做的是package.json在我的functions文件夹下定义一个文件,然后在该子目录中运行 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 需要部署你的资源的依赖项。

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

于 2016-05-11T23:56:29.660 回答
7

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

无服务器插件包含依赖项

于 2017-12-05T11:37:59.753 回答
4

您可以执行以下操作:

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

参考文件

于 2019-06-21T16:53:40.563 回答
0

如果有人遇到这个问题并且上面的答案都没有帮助,试试这个(为我工作):

custom: 
  webpack:
    webpackIncludeModules: true
于 2021-11-11T02:21:10.467 回答