Serverless Framework 是一款通过 AWS Lambda 服务快速构建无服务器应用的框架,它支持 Node.js 开发者在 AWS Lambda 上构建、部署和运行应用程序。在开发 Serverless 应用程序时,我们通常需要引入一些外部 Node.js 模块,例如第三方库或自定义函数。
但是,由于 AWS Lambda 函数在执行时默认情况下没有 Node.js 模块的可用性,因此在 Serverless Framework 中引用外部 Node.js 模块是一件需要注意的问题。本文将详细介绍在 Serverless Framework 中如何引用外部 Node.js 模块,并提供示例代码和指导意义。
1. 背景和问题
在运行 AWS Lambda 函数时,默认情况下只有一个最小的 Node.js 环境,所有的依赖库都必须位于 AWS Lambda 包内。这使得指定所需的包和其版本变得很困难,因此外部模块的使用成为了一个挑战。
一般来说,开发人员可以将特定模块的代码复制粘贴到 AWS Lambda 包中,或将整个 node_modules 目录打包成 zip 文件并上传到 AWS Lambda 函数。但这种方式非常麻烦,并且可能会导致依赖项冲突、版本混乱和安全漏洞等问题。
那么在 Serverless Framework 中,该如何引用外部 Node.js 模块呢?下面将从两个方面进行阐述:本地安装和部署打包。
2. 本地安装
本地安装是指在本地开发环境下安装和使用所需的 Node.js 模块,然后在将代码上传到 AWS Lambda 函数之前将它们打包在一起。
这种方式的优点是可以在开发过程中方便地使用外部模块,并且可以更好地控制它们的版本和依赖项。而缺点是可能会有依赖项重复或不一致的情况,而且即使是在本地环境中也需要手动维护这些模块。
下面是在 Serverless Framework 中如何使用本地安装功能:
首先,我们需要在本地项目目录中安装所需的 Node.js 模块。并在项目根目录下创建一个 package.json 文件,然后在里面列出这些依赖项:
{ "name": "my-example-serverless-app", "dependencies": { "jquery": "^3.6.0" } }
接下来,在项目目录中创建一个 index.js 文件,并在其中引用外部模块 jquery:
-- -------------------- ---- ------- ----- - - ------------------ ---------------------- - ----- ------- -------- -- - ----- ------- - ------- -------- ----- ---- - - -------- ------- -- ----- -------- - - ----------- ---- -------- - --------------- ------------------ -- ----- -------------------- -- --------------- ------ --------- --
最后,在 package.json 中添加以下 scripts,用于执行本地构建和打包:
-- -------------------- ---- ------- - ------- ---------------------------- --------------- - --------- -------- -- ---------- - -------- --- --- ---- -- ----- ---- -- -- -- - ----- -- -- ---- -- --- ------- ------------------- --------- ----------- ------- - -
使用 npm run build 命令构建代码并打包到一个 dist 目录中。这样产生的文件夹就可以作为部署包上传到 AWS Lambda 了。
3. 部署打包
除了本地安装之外,我们还可以通过将所需的 Node.js 模块打包并部署到 AWS Lambda 函数来解决该问题。这种部署打包方式的优点是非常容易实现,并且可以确保所有依赖项都在一起,不会出现依赖项问题。
但是,这种方法的缺点是可能会将多余的代码打包进 AWS Lambda 函数中,导致部署时间变长,而且难以掌控所有依赖项的版本和依赖关系。
下面是在 Serverless Framework 中如何对 Node.js 模块进行部署打包:
首先,我们需要在项目目录下创建一个 package.json 文件,并在其中列出需要打包的 Node.js 模块及其版本:
{ "name": "serverless-demo", "dependencies": { "request": "^2.88.2", "jmespath": "^0.15.0", "uuid": "^8.3.2" } }
接下来,在项目目录下创建一个 index.js 文件,并在其中引用这些 Node.js 模块:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- ---- - ---------------- ---------------------- - ----- ------- -------- -- - ----- ------- - ------- -------- ----- ---- - - -------- ------- -- ----- -------- - - ----------- ---- -------- - --------------- ------------------ -- ----- -------------------- -- -------------------- --------- ------ ------ --------- --
然后,使用 npm pack 命令打包项目,并上传 *.tgz 打包文件到 S3 存储桶中,以供部署使用:
$ npm pack $ aws s3 cp serverless-demo-1.0.0.tgz s3://my-lambda-packages/
最后,在 serverless.yml 文件中指定部署包文件和手动指定运行时和内存,代码如下:
-- -------------------- ---- ------- -------- ------- --------- ----- --- -------- ---------- ----------- --- ------ --- ---------- ------ -------- ------------------- -------- --------- -------------------------------------------------
部署应用程序时,Serverless Framework 将下载指定的打包文件并将函数代码和打包文件打包在一起上传到 AWS Lambda。这样就可以在函数中使用外部 Node.js 模块了。
4. 总结
在 Serverless Framework 中引用外部 Node.js 模块是构建 Serverless 应用程序时遇到的常见问题之一。本文介绍了两种解决方案:本地安装和部署打包。每个方案都有自己的优点和缺点,开发人员需要根据自己的喜好和需求来选择适合自己的方案。
无论使用哪种方案,在 Serverless Framework 中都可以轻松引用外部 Node.js 模块,这为开发更加高效和便捷的 Serverless 应用程序提供了有力的支持。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c4cc3d83d39b4881836f3e