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-admin i firebase-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órynpmzastępuje rzeczywistą wartością tokena z${NPM_TOKEN}środowiska.Zmienną środowiskową
$NPM_TOKENmożesz ustawić za pomocą argumentu--set-build-env-varspoleceniagcloud functions deploy. Więcej informacji o tokenie uwierzytelniania NPM znajdziesz w samouczku NPM dotyczącym modułów prywatnych.