Catch up on highlights from Firebase at Google I/O 2023. Learn more

Umgang mit Abhängigkeiten

Eine Funktion darf sowohl externe Node.js-Module als auch lokale Daten verwenden. Abhängigkeiten in Node.js werden mit npm verwaltet und in einer Metadatendatei namens package.json ausgedrückt. Die Cloud Functions Node.js-Laufzeiten unterstützen die Installation mit npm , Yarn oder pnpm .

Um eine Abhängigkeit für Ihre Funktion anzugeben, fügen Sie sie Ihrer package.json -Datei hinzu.

In diesem Beispiel ist eine Abhängigkeit in der Datei package.json aufgeführt:

{
  "dependencies": {
    "escape-html": "^1.0.3"
  }
}

Die Abhängigkeit wird dann in die Funktion importiert:

JavaScript

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')}!`);
});

Typoskript

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')}!`);
}

Einschließlich lokaler Node.js-Module

Sie können auch lokale Node.js-Module als Teil Ihrer Funktion einbinden. Sie können dies erreichen, indem Sie Ihr Modul in package.json mit dem file: deklarieren. Im folgenden Beispiel bezieht sich mymodule auf Ihren Modulnamen und mymoduledir ist das Verzeichnis, das Ihr Modul enthält:

{
  "dependencies": {
    "mymodule": "file:mymoduledir"
  }
}

Der Code für dieses lokale Modul sollte an einem anderen Ort als dem Ordner node_modules im Stammverzeichnis Ihrer Funktion gespeichert werden.

Zusätzliche Schritte für TypeScript

TypeScript hilft Ihnen am meisten, wenn Sie Bibliotheken verwenden, die über Typinformationen verfügen. Dadurch kann TypeScript Syntaxfehler erkennen und Redakteure können Ihnen bessere Vorschläge zur automatischen Vervollständigung machen. Einige Bibliotheken wie firebase-admin und firebase-functions werden mit TypeScript-Definitionen ausgeliefert.

Viele Bibliotheken stellen keine eigene TypeScript-Definition bereit. Das DefinitelyTyped- Projekt stellt von der Community verwaltete Definitionen für die beliebtesten Knotenbibliotheken bereit. DefinitelyTyped veröffentlicht diese Definitionen unter demselben NPM-Paketnamen, jedoch innerhalb der Organisation „@types“. Sie können die Typinformationen für die uuid Bibliothek beispielsweise wie folgt installieren:

npm install @types/uuid

Wenn Sie mit TypeScript vertrauter werden, werden Sie möglicherweise feststellen, dass Sie beide Installationen kombinieren:

npm install uuid @types/uuid

Typabhängigkeiten sollten von derselben Art sein wie die Bibliotheksabhängigkeit. Beispielsweise sollten Sie uuid nicht als normale Abhängigkeit und @types/uuid als Dev-Abhängigkeit oder Peer-Abhängigkeit speichern.

Laden von Node.js-Modulen

Verwenden Sie die Node.js-Funktion require() um jedes von Ihnen installierte Node.js-Modul zu laden. Sie können die Funktion require() auch verwenden, um lokale Dateien zu importieren, die Sie neben Ihrer Funktion bereitstellen.

Wenn Sie Funktionen in TypeScript schreiben, verwenden Sie die import auf die gleiche Weise, um jedes installierte Node.js-Modul zu laden.

Verwendung privater Module

Sie können ein privates npm-Modul verwenden, indem Sie Einstellungen für die Authentifizierung bei der Registrierung in einer .npmrc Datei im Verzeichnis der Funktion bereitstellen. Wenn Sie Yarn v2 oder höher als Paketmanager verwenden, heißt diese Datei .yarnrc.yml .

Private Module von Artifact Registry

Ein Artifact Registry Node.js-Paket-Repository kann private Module für Ihre Funktion hosten. Wenn Sie eine Google Cloud Functions-Funktion bereitstellen, generiert der Build-Prozess automatisch Artifact Registry-Anmeldeinformationen für das Cloud Build-Dienstkonto . Sie müssen lediglich das Artifact Registry-Repository in Ihrer .npmrc auflisten, ohne zusätzliche Anmeldeinformationen zu generieren. Zum Beispiel:

@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true

Dieser Ansatz funktioniert auch für den Paketmanager Yarn v1. Wenn Sie Yarn v2 oder höher verwenden, müssen Sie nur das Artifact Registry-Repository in Ihrer .yarnrc.yml ohne zusätzliche Anmeldeinformationen auflisten. Zum Beispiel:

npmScopes:
  SCOPE:
    npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
    npmAlwaysAuth: true

Private Module aus anderen Repositorys

In der npm-Dokumentation wird erläutert, wie benutzerdefinierte schreibgeschützte Zugriffstoken erstellt werden. Wir raten davon ab, die im Home-Verzeichnis erstellte .npmrc Datei zu verwenden, da sie ein Lese-/Schreibtoken enthält. Schreibberechtigungen sind während der Bereitstellung nicht erforderlich und könnten ein Sicherheitsrisiko darstellen.

Schließen Sie die .npmrc Datei nicht ein, wenn Sie keine privaten Repositorys verwenden, da dies die Bereitstellungszeit für Ihre Funktionen verlängern kann.

Datei Format

Wenn Sie eine .npmrc Datei zum Festlegen eines benutzerdefinierten Authentifizierungstokens verwenden, sollte diese die unten gezeigte Zeile enthalten.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Ersetzen:

  • REGISTRY_DOMAIN : der Domänenname Ihrer privaten NPM-Registrierung. Wenn Ihr Repository bei npmjs.org gehostet wird, legen Sie dieses Feld auf registry.npmjs.org fest.
  • AUTH_TOKEN : das Autorisierungstoken für Ihre npm-Registrierung. Dies kann entweder der literale Textwert des Tokens oder die Textzeichenfolge ${NPM_TOKEN} sein, die npm durch den tatsächlichen Tokenwert aus der Umgebung ersetzt.

    Sie können die Umgebungsvariable $NPM_TOKEN mit dem Argument --set-build-env-vars für Ihren gcloud functions deploy festlegen. Weitere Informationen zum NPM-Authentifizierungstoken finden Sie im NPM-Tutorial zu privaten Modulen .