Funkcja może używać zewnętrznych modułów Node.js, a także lokalnych danych. Zależnośćami w Node.js zarządza się za pomocą npm i wyraża się je 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 zależność jest wymieniona w pliku package.json
:
{ "dependencies": { "escape-html": "^1.0.3" } }
Następnie zależność jest importowana w funkcji:
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')}!`);
});
TypeScript
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')}!`);
}
Włączanie lokalnych modułów Node.js
W ramach funkcji możesz też uwzględniać lokalne moduły Node.js. Aby to zrobić, zadeklaruj moduł w pliku package.json
, używając prefiksu file:
. 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 folderze niż node_modules
w katalogu głównym funkcji.
Dodatkowe kroki w przypadku TypeScript
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ć lepsze 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 tworzone przez społeczność dla najpopularniejszych bibliotek node.
Definicje te są publikowane przez DefinitelyTyped pod tą samą nazwą pakietu NPM, ale w ramach organizacji „@types”. Możesz na przykład zainstalować informacje o typie dla biblioteki uuid
, korzystając z tych opcji:
npm install @types/uuid
Gdy zapoznasz się z 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. Na przykład nie należy zapisywać uuid
jako zwykłej zależności, a @types/uuid
jako zależności od wersji deweloperskiej lub zależności od wersji równorzędnej.
Wczytywanie modułów Node.js
Użyj funkcji Node.js
require()
, aby załadować dowolny zainstalowany moduł Node.js. Możesz też użyć funkcji require()
, aby zaimportować pliki lokalne, które wdrażasz razem z funkcją.
import
w taki 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 jako menedżera pakietów używasz Yarn w wersji 2 lub nowszej, ten plik ma nazwę .yarnrc.yml
.
Prywatne moduły z Artifact Registry
Repozytorium pakietów Node.js w rejestrze artefaktów może hostować prywatne moduły Twojej funkcji. Gdy wdrażasz funkcję Google Cloud Functions, proces kompilacji automatycznie generuje dane uwierzytelniające rejestru artefaktów dla konta usługi Cloud Build.
Wystarczy, że dodasz repozytorium Artifact Registry do pliku .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 w wersji 1.
Jeśli używasz Yarn w wersji 2 lub nowszej, wystarczy, że umieścisz w pliku .yarnrc.yml
repozytorium Artifact Registry 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 repozytoriów prywatnych, nie dołączaj pliku .npmrc
, ponieważ może to wydłużyć czas wdrażania funkcji.
Format pliku
Jeśli do ustawienia niestandardowego tokena autoryzacji 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 repozytorium jest hostowane w
npmjs.org
, ustaw to pole naregistry.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órynpm
zastępuje rzeczywistą wartością tokena z otoczenia.Zmienną środowiskową
$NPM_TOKEN
możesz ustawić za pomocą argumentu--set-build-env-vars
w poleceniugcloud functions deploy
. Więcej informacji o tokenie autoryzacji NPM znajdziesz w samouczku NPM dotyczącym modułów prywatnych.
Tworzenie funkcji z zależnymi bibliotekami dostawcy
Zależności dostawcy to te, których źródło jest zawarte bezpośrednio w pakiecie kodu źródłowego i jest odtwarzane wraz z Twoim kodem. Tworzysz zależności dostawcy Node.js i pomijasz ich instalowanie podczas wdrażania, używając zmiennej środowiskowej GOOGLE_VENDOR_NPM_DEPENDENCIES.
Wymagania wstępne dotyczące zależności od dostawcy
Upewnij się, że masz działającą funkcję ze wszystkimi zależnościami, które chcesz zdefiniować w pliku
package.json
.Zainstaluj te zależności lokalnie, uruchamiając
npm install
Usuń
node_modules
z pliku .gcloudignore w katalogu roboczym.Wdróż funkcję, upewniając się, że lokalna wersja Node.js jest taka sama jak ta, którą określisz podczas wdrażania.
Wdróż funkcję i zależne biblioteki za pomocą tego polecenia:
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME_NAME \ --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true
Zastąp:
- FUNCTION_NAME: nazwa funkcji Cloud Functions, którą wdrażasz
- RUNTIME_NAME: nazwa środowiska wykonawczego Node.js, w którym ma być wykonywana wdrożona funkcja. Musi to być ta sama wersja Node.js, której używasz w lokalnym środowisku programistycznym.
Pakiet Functions framework jest wymaganą zależnością dla funkcji. Aby przyspieszyć kompilację, zalecamy użycie tego pakietu. Jeśli tego nie zrobisz, zostanie ona pobrana i zainstalowana podczas kompilacji funkcji.
Jeśli w pliku package.json określisz silnik npm, podczas kompilacji zostanie pobrana określona wersja npm. Aby zablokować to zachowanie, usuń ten element z pliku package.json.