无服务器框架:如何添加外部NPM包?

25

我的情况是,在将外部NPM包添加到我的Serverless框架项目中(特定的包是geopoint)方面,我遇到了一些困难。

我进入了Serverless项目的根目录,并运行了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模块正确地添加到Serverless Framework项目中?


1
你为什么要解决../geopoint../../geopoint呢?这与Serverless有关吗? - E net4
4个回答

28

我认为您所经历的问题与我最近经历的问题相同。我可以在应用程序的根目录中安装npm包,但是没有东西会部署到lambda。

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

我在serverless文档中没有找到相关内容,但我所做的是在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需要部署资源的依赖项。

希望这可以帮助您-再次强调,不确定这是否是最佳实践,只是我这样做的原因是在Serverless存储库或任何示例代码中都找不到此文档。


4
谢谢你的回答,但我已经找到另一种方法。在函数的s-functions.json文件中,我将“handler”行从“handler.handler”编辑为“functions/geospatial/get_bounding_coordinates/handler.handler”,这样它就会将函数根目录设置为节点模块的目录。 - taptipblard
1
嘿,谢谢你发来的内容。我发现虽然你的建议可行,但是 sls dash deploy 花费了很长时间,因为它还尝试从我的根目录下的 node_modules 文件夹中捆绑开发依赖项。虽然我可以使用 npm prune --prod,但出于更快速部署和不必每次部署时修剪 dev 依赖项的好处,我认为我会保留第二个 node_modules,就像我在答案中使用的那样。 - e_m0ney
1
你是正确的,编辑用于处理程序属性的值是正确的方法。您应该能够构建函数,以便可以将node_modules非常特定(如您所需)保持为给定的函数集。例如,我有一个针对我的主项目的package.json文件,然后是另外两个package.json文件,每个文件都是针对一组Lambda函数。 - Mikelax
太好了,@Mikelax,尽可能保持每个Lambda函数的大小尽可能小,在我看来是一件好事。 - e_m0ney

8

1
可以确认这一点。运行得非常完美。 - Jens Væver Hartfelt
我也试过了,有效! - lmgonzalves

5
你可以执行以下操作:
# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.

Reference document


这太棒了!谢谢伙计。 - Joimee Cajandab

0
如果有人遇到这个问题,上面的任何答案都没有帮助,请尝试这个(对我有效):
custom: 
  webpack:
    webpackIncludeModules: true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接