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

Gestione delle dipendenze

Una funzione può utilizzare moduli Node.js esterni e dati locali. Le dipendenze in Node.js sono gestite con npm ed espresse in un file di metadati denominato package.json . I runtime di Cloud Functions Node.js supportano l'installazione tramite npm , yarn o pnpm .

Per specificare una dipendenza per la tua funzione, aggiungila al tuo file package.json .

In questo esempio, una dipendenza è elencata nel file package.json :

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

La dipendenza viene quindi importata nella funzione:

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

Dattiloscritto

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

Compresi i moduli Node.js locali

Puoi anche includere moduli Node.js locali come parte della tua funzione. Puoi ottenere ciò dichiarando il tuo modulo in package.json usando il file: prefix . Nell'esempio seguente, mymodule si riferisce al nome del tuo modulo e mymoduledir è la directory contenente il tuo modulo:

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

Il codice per questo modulo locale deve essere archiviato in un luogo diverso dalla cartella node_modules all'interno della directory principale della funzione.

Passaggi aggiuntivi per TypeScript

TypeScript ti aiuta di più quando usi librerie che hanno informazioni sul tipo. Ciò consente a TypeScript di rilevare errori di sintassi e consente agli editor di fornire suggerimenti di completamento automatico migliori. Alcune librerie, come firebase-admin e firebase-functions , vengono fornite con definizioni TypeScript incluse.

Molte librerie non forniscono la propria definizione TypeScript. Il progetto DefinitelyTyped fornisce definizioni gestite dalla comunità per le librerie di nodi più popolari. DefinitelyTyped pubblica queste definizioni con lo stesso nome del pacchetto NPM, ma all'interno dell'organizzazione "@types". Ad esempio, puoi installare le informazioni sul tipo per la libreria uuid con quanto segue:

npm install @types/uuid

Man mano che acquisisci familiarità con TypeScript, potresti ritrovarti a combinare entrambe le installazioni:

npm install uuid @types/uuid

Le dipendenze di tipo devono essere dello stesso tipo della dipendenza dalla libreria. Ad esempio, non dovresti salvare uuid come dipendenza normale e @types/uuid come dipendenza dev o dipendenza peer.

Caricamento dei moduli Node.js

Usa la funzione Node.js require() per caricare qualsiasi modulo Node.js che hai installato. Puoi anche utilizzare la funzione require() per importare i file locali che distribuisci insieme alla tua funzione.

Se stai scrivendo funzioni in TypeScript, usa l'istruzione import nello stesso modo per caricare qualsiasi modulo Node.js che hai installato.

Utilizzo di moduli privati

È possibile utilizzare un modulo npm privato fornendo le impostazioni per l'autenticazione con il registro in un file .npmrc nella directory della funzione. Se utilizzi Yarn v2 o versioni successive come gestore di pacchetti, questo file è denominato .yarnrc.yml .

Moduli privati ​​da Artifact Registry

Un repository di pacchetti Artifact Registry Node.js può ospitare moduli privati ​​per la tua funzione. Quando esegui il deployment di una funzione Google Cloud Functions, il processo di compilazione genera automaticamente le credenziali Artifact Registry per l' account di servizio Cloud Build . Devi solo elencare il repository Artifact Registry nel tuo .npmrc senza generare credenziali aggiuntive. Per esempio:

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

Questo approccio funziona anche per il gestore di pacchetti Yarn v1. Se utilizzi Yarn v2 o versioni successive, devi solo elencare il repository Artifact Registry nel tuo .yarnrc.yml senza credenziali aggiuntive. Per esempio:

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

Moduli privati ​​da altri repository

La documentazione di npm spiega come creare token di accesso di sola lettura personalizzati. Si sconsiglia di utilizzare il file .npmrc creato nella directory home perché contiene un token di lettura-scrittura. Le autorizzazioni di scrittura non sono necessarie durante la distribuzione e potrebbero rappresentare un rischio per la sicurezza.

Non includere il file .npmrc se non stai usando repository privati, in quanto può aumentare il tempo di distribuzione per le tue funzioni.

Formato del file

Se stai utilizzando un file .npmrc per impostare un token di autenticazione personalizzato, dovrebbe includere la riga mostrata di seguito.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Sostituire:

  • REGISTRY_DOMAIN : il nome di dominio del tuo registro npm privato. Se il tuo repository è ospitato con npmjs.org , imposta questo campo su registry.npmjs.org .
  • AUTH_TOKEN : il token di autorizzazione per il tuo registro npm. Questo può essere il valore di testo letterale del token o la stringa di testo ${NPM_TOKEN} , che npm sostituisce con il valore effettivo del token dall'ambiente.

    Puoi impostare la variabile di ambiente $NPM_TOKEN con l'argomento --set-build-env-vars nel comando gcloud functions deploy . Consulta il tutorial NPM sui moduli privati ​​per maggiori dettagli sul token di autenticazione NPM.