我的情况是我在向我的无服务器框架项目添加外部NPM包时遇到了一些麻烦(特定包是geopoint)。
我转到了无服务器项目的根文件夹并运行了npm install geopoint --save
。 package.json更新了dependencies": { "geopoint": "^1.0.1" }
并创建了node_modules文件夹。
我的文件夹结构如下所示:
根项目文件夹
-functions
--geospatial
--- handler.js
-node_modules
--geopoint
在我的函数/ 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模块添加到无服务器框架项目?
答案 0 :(得分:24)
我认为您遇到的情况与我最近遇到的情况相同。我可以在我的应用程序根目录中安装npm软件包,但什么都不会部署到lambda。
我的理解是无服务器在每个组件目录(应用程序根目录下的子目录)下部署所有内容。在您的情况下,在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依赖项,而无需无服务器部署资源所需的那些。
希望这有助于 - 再一次,不确定这是最佳做法,也就是我所做的事情,因为我没有记录在无服务器存储库或任何示例代码中的任何地方。
答案 1 :(得分:1)
对我来说,最好的解决方案是无服务器插件:无服务器插件 - 包含依赖性
答案 2 :(得分:0)
您可以执行以下操作:
# serverless.yml
custom:
webpack:
includeModules:
packagePath: '../package.json' # relative path to custom package.json file.