Obsługa zależności


Funkcja może korzystać z zewnętrznych modułów Node.js, a także z danych lokalnych. Zależności w Node.js są zarządzane za pomocą npm i wyrażane w pliku metadanych o nazwie package.json. Środowiska wykonawcze Node.js w Cloud Functions obsługują instalację za pomocą npm, yarn lub pnpm.

Aby określić zależność funkcji, dodaj ją do pliku package.json.

W tym przykładzie w pliku package.json wymieniona jest zależność:

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

Zależność zostanie zaimportowana do funkcji:

JavaScript

const onRequest = require("firebase-functions/https");
const escapeHtml = require("escape-html");

// Return a greeting with the input HTML-escaped.
exports.hello = onRequest((req, res) => {
  res.send(Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);
});

TypeScript

import { onRequest } from "firebase-functions/https";
import * as escapeHtml from "escape-html";

// Return a greeting with the input HTML-escaped.
export let hello = onRequest((req, res) => {
  res.send(`Hello ${escapeHtml(req.query.name || req.body.name || "World")}!`);

Uwzględnianie lokalnych modułów Node.js

Możesz też uwzględnić lokalne moduły Node.js jako część funkcji. Możesz to zrobić, deklarując moduł w package.json za pomocą file: prefiksu. W tym przykładzie mymodule to nazwa modułu, a mymoduledir to katalog zawierający moduł:

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

Kod tego modułu lokalnego powinien być przechowywany w innym miejscu niż folder node_modules w katalogu głównym funkcji.

Dodatkowe czynności w przypadku TypeScriptu

TypeScript jest najbardziej przydatny, gdy używasz bibliotek zawierających informacje o typach. Dzięki temu TypeScript może wykrywać błędy składni, a edytory mogą wyświetlać trafniejsze sugestie autouzupełniania. Niektóre biblioteki, np. firebase-adminfirebase-functions, zawierają definicje TypeScript.

Wiele bibliotek nie udostępnia własnej definicji TypeScript. Projekt DefinitelyTyped udostępnia definicje najpopularniejszych bibliotek węzłów, które są utrzymywane przez społeczność. Projekt DefinitelyTyped publikuje te definicje pod tą samą nazwą pakietu NPM, ale w organizacji „@types”. Możesz na przykład zainstalować informacje o typie biblioteki uuid za pomocą tego polecenia:

npm install @types/uuid

Gdy lepiej poznasz TypeScript, możesz połączyć obie instalacje:

npm install uuid @types/uuid

Zależności typu powinny być tego samego rodzaju co zależność biblioteki. Nie należy na przykład zapisywać uuid jako normalnej zależności, a @types/uuid jako zależności deweloperskiej lub zależności równorzędnej.

Wczytywanie modułów Node.js

Użyj funkcji Node.js require() , aby wczytać dowolny zainstalowany moduł Node.js. Możesz też użyć funkcji require(), aby zaimportować pliki lokalne wdrażane razem z funkcją.

Jeśli piszesz funkcje w TypeScript, użyj instrukcji import w ten sam sposób, aby załadować dowolny zainstalowany moduł Node.js.

Korzystanie z modułów prywatnych

Możesz użyć prywatnego modułu npm, podając ustawienia uwierzytelniania w rejestrze w pliku .npmrc w katalogu funkcji. Jeśli używasz Yarn w wersji 2 lub nowszej jako menedżera pakietów, ten plik ma nazwę.yarnrc.yml.

Prywatne moduły z Artifact Registry

Repozytorium pakietów Node.js w Artifact Registry może hostować prywatne moduły funkcji. Gdy wdrażasz funkcję Google Cloud Functions, proces kompilacji automatycznie generuje dane logowania Artifact Registry dla konta usługi Cloud Build. Wystarczy, że wymienisz repozytorium Artifact Registry w .npmrc bez generowania dodatkowych danych logowania. Przykład:

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

To podejście działa też w przypadku menedżera pakietów Yarn v1. Jeśli używasz Yarn w wersji 2 lub nowszej, wystarczy, że umieścisz repozytorium Artifact Registry w pliku .yarnrc.yml bez dodatkowych danych logowania. Przykład:

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

Moduły prywatne z innych repozytoriów

W dokumentacji npm znajdziesz informacje o tym, jak tworzyć niestandardowe tokeny dostępu tylko do odczytu. Nie zalecamy używania pliku .npmrc utworzonego w katalogu domowym, ponieważ zawiera on token odczytu i zapisu. Uprawnienia do zapisu nie są wymagane podczas wdrażania i mogą stanowić zagrożenie dla bezpieczeństwa.

Jeśli nie używasz prywatnych repozytoriów, nie uwzględniaj pliku .npmrc, ponieważ może to wydłużyć czas wdrażania funkcji.

Format pliku

Jeśli do ustawienia niestandardowego tokena uwierzytelniania używasz pliku .npmrc, powinien on zawierać wiersz pokazany poniżej.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Zastąp:

  • REGISTRY_DOMAIN: nazwa domeny prywatnego rejestru npm. Jeśli Twoje repozytorium jest hostowane w npmjs.org, ustaw w tym polu wartość registry.npmjs.org.
  • AUTH_TOKEN: token autoryzacji dla rejestru npm. Może to być dosłowna wartość tekstowa tokena lub ciąg tekstowy${NPM_TOKEN}, który npm zastępuje rzeczywistą wartością tokena z ${NPM_TOKEN}środowiska.

    Zmienną środowiskową $NPM_TOKEN możesz ustawić za pomocą argumentu --set-build-env-vars polecenia gcloud functions deploy. Więcej informacji o tokenie uwierzytelniania NPM znajdziesz w samouczku NPM dotyczącym modułów prywatnych.