函数可以使用外部 Node.js 模块以及本地数据。Node.js 中的依赖项可通过 npm 进行管理,并在名为 package.json
的元数据文件中表示。Cloud Functions Node.js 运行时支持使用 npm、yarn 或 pnpm 进行安装。
要为您的函数指定依赖项,请将依赖项添加到 package.json
文件中。
在此示例中,package.json
文件中列出了一个依赖项:
{ "dependencies": { "escape-html": "^1.0.3" } }
此依赖项随后被导入函数中:
const escapeHtml = require('escape-html');
// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});
import * as escapeHtml from 'escape-html';
// Return a greeting with the input HTML-escaped.
export let hello = functions.https.onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
}
包括本地 Node.js 模块
您还可以将本地 Node.js 模块作为函数的一部分。要实现此目的,您可在 package.json
中使用 file:
前缀声明相关模块。在以下示例中,mymodule
引用您的模块名称,而 mymoduledir
是包含您的模块的目录:
{ "dependencies": { "mymodule": "file:mymoduledir" } }
此本地模块的代码应存储在函数根目录内的 node_modules
文件夹之外。
针对 TypeScript 的额外步骤
使用包含类型信息的库时,TypeScript 最为有用。
这种情况下,TypeScript 可以发现语法错误,并使编辑器提供更好的自动填充建议。有些库(例如 firebase-admin
和 firebase-functions
)本身就带有 TypeScript 定义。
许多库没有自己的 TypeScript 定义。DefinitelyTyped 项目提供适用于大多数常用库的社区维护的定义。
DefinitelyTyped 以同一个 NPM 软件包名发布这些定义,但这些定义位于“@types”组织内。例如,您可以使用以下命令为 uuid
库安装类型信息:
npm install @types/uuid
随着对 TypeScript 越来越熟悉,您可以将两种安装方法结合使用:
npm install uuid @types/uuid
类型依赖项应与库依赖项为同一种类。例如,不应将 uuid
保存为普通依赖项,而将 @types/uuid
保存为开发依赖项或对等依赖项。
加载 Node.js 模块
使用 Node.js require()
函数加载已安装的任何 Node.js 模块。您还可以使用 require()
函数导入与您的函数一起部署的本地文件。
import
语句来加载您已安装的任何 Node.js 模块。
使用专用模块
您可以使用专用 npm 模块,方法是在函数目录下的 .npmrc
文件中提供向注册表进行身份验证的设置。如果您使用 Yarn v2 或更高版本作为软件包管理系统,则此文件的名称为 .yarnrc.yml
。
Artifact Registry 中的专用模块
Artifact Registry Node.js 软件包代码库可以托管您的函数的专用模块。部署 Google Cloud Functions 函数时,构建流程会自动为 Cloud Build 服务账号生成 Artifact Registry 凭据。您只需在 .npmrc
中列出 Artifact Registry 代码库,而不需要生成额外的凭据。例如:
@SCOPE :registry=https://REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME
//REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME :always-auth=true
此方法也适用于 Yarn v1 软件包管理系统。如果您使用的是 Yarn v2 或更高版本,则只需在 .yarnrc.yml
中列出 Artifact Registry 代码库,不需要额外凭据。例如:
npmScopes:
SCOPE :
npmRegistryServer: https://REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME
npmAlwaysAuth: true
其他代码库中的专用模块
npm 文档说明了如何创建自定义只读访问令牌。我们不建议使用在主目录中创建的 .npmrc
文件,因为它包含读写令牌。部署期间不需要写入权限,写入权限可能会带来安全风险。
如果您未使用私有代码库,请勿添加 .npmrc
文件,因为该文件可能会延长函数的部署时间。
文件格式
如果您使用 .npmrc
文件设置自定义身份验证令牌,则应包含下面所示的一行内容。
//REGISTRY_DOMAIN /:_authToken=AUTH_TOKEN
您需要进行如下替换:
- REGISTRY_DOMAIN:您的私有 npm 注册表的域名。如果您的代码库由
npmjs.org
托管,请将此字段设置为registry.npmjs.org
。 AUTH_TOKEN:npm 注册表的授权令牌。它可以是令牌的字面量文本值或文本字符串
${NPM_TOKEN}
(npm
会将其替换为环境中的实际令牌值)。您可以使用
gcloud functions deploy
命令的--set-build-env-vars
参数设置$NPM_TOKEN
环境变量。如需详细了解 NPM 身份验证令牌,请参阅有关专用模块的 NPM 教程。
使用 vendored 依赖项构建函数
Vendored 依赖项是其源代码直接包含在源代码包中并与您自己的代码一起重新构建的项目。您可以使用 GOOGLE_VENDOR_NPM_DEPENDENCIES 构建环境变量,创建 vendored Node.js 依赖项并在部署期间跳过其安装。
vendored 依赖项的前提条件
确保您拥有有效的函数,其中包含您希望在
package.json
文件中定义 vendor 的所有依赖项。通过运行以下命令在本地安装这些依赖项
npm install
从工作目录的 .gcloudignore 文件中移除
node_modules
。部署函数,确保本地 Node.js 版本与您在部署期间指定的版本相同。
使用以下命令部署函数和 vendored 依赖项:
gcloud functions deploy
FUNCTION_NAME \ --runtimeRUNTIME_NAME \ --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true您需要进行如下替换:
- FUNCTION_NAME:要部署的 Cloud Functions 函数的名称
- RUNTIME_NAME:要在其中运行已部署函数的 Node.js 运行时的名称。其必须与您在本地开发环境中使用的 Node.js 版本相同
Functions 框架软件包是函数必需的依赖项。为加快构建速度,我们建议 vendoring 此软件包。否则,其会在您的函数构建时被下载并安装。
如果您在 package.json 文件中指定了 npm 引擎,则系统会在构建时下载指定的 npm 版本。如需抑制此行为,请从 package.json 文件中将其移除。