Esegui la migrazione di Cloud Functions ai runtime Node.js più recenti

Questo documento descrive le differenze tra le versioni di runtime Node.js per aiutarti a eseguire la migrazione del tuo codice Cloud Functions.

Migrazione a un runtime più recente

Per eseguire la migrazione a un runtime più recente:

  1. Leggi informazioni sul runtime di destinazione in questo documento per comprendere le differenze che introduce e apportare eventuali modifiche necessarie al codice. In particolare, fai attenzione alle modifiche alle variabili di ambiente introdotte nel runtime Node.js 10.
  2. Esegui il deployment della funzione, specificando il runtime Node.js di destinazione:

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Differenze nel runtime Node.js 14

Node.js 14 introduce alcuni nuovi concetti e funzionalità. Punti salienti:

  • Concatenamento facoltativo. Il concatenamento facoltativo ha il seguente aspetto: {"hello": null}?.hello?.neat. Consente l'accesso sicuro alle chiavi profonde su oggetti che potrebbero non esistere.
  • Coalescenza nullo. In questo modo introduce ??, che è più sicuro rispetto all'utilizzo di || per l'assegnazione (poiché valuta solo false per null o undefined).

Puoi scoprire di più sulle funzionalità di Node.js 14 qui.

Differenze nel runtime Node.js 12

Node.js 12 utilizza npm ci, che esegue sempre lo script prepare in package.json.

Le principali differenze tra l'uso di npm install e npm ci sono:

  • Il progetto deve avere un elemento package-lock.json o npm-shrinkwrap.json esistente.
  • Se le dipendenze nel blocco pacchetto non corrispondono a quelle in package.json, npm ci uscirà con un errore, anziché aggiornare il blocco del pacchetto.
  • Se è già presente un elemento node_modules, verrà rimosso automaticamente prima che npm ci inizi la sua installazione.

Per eseguire l'upgrade da Node.js 10 a Node.js 12, sposta le dipendenze utilizzate in prepare da devDependencies a dependencies.

Per Node.js 12 e versioni successive, le funzioni con limiti di memoria superiori a 2 GiB richiedono agli utenti di configurare NODE_OPTIONS in modo che abbia max_old_space_size. Ad esempio:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Differenze nel runtime Node.js 10

Il runtime Node.js 10 ha introdotto modifiche che potrebbero richiedere la modifica del codice sorgente della funzione per utilizzare i runtime più recenti.

Per la maggior parte delle applicazioni, l'upgrade dal nodo 8 al nodo 10 non prevede modifiche al codice (la differenza principale sono le modifiche alle variabili di ambiente su GCF).

Node 10 introduce una serie di nuove ed entusiasmanti funzionalità, come iteratori asincroni e un'API file basata sulle promesse, oltre a miglioramenti delle prestazioni e patch di sicurezza.

Logging

Se non hai utilizzato JSON.stringify durante il logging di oggetti e/o raccolte in Node.js 8, potresti notare un aumento dei volumi di log in seguito all'upgrade a Node.js 10. Ciò potrebbe comportare costi aggiuntivi. Ti consigliamo di utilizzare JSON.stringify per raggruppare le istruzioni di log, come mostrato in Scrittura, visualizzazione e risposta ai log.

Modifiche alle variabili di ambiente

Il runtime Node.js 10 ha introdotto modifiche alle variabili di ambiente predefinite dal runtime. Consulta Variabili di ambiente impostate automaticamente per una descrizione completa delle differenze tra le variabili di ambiente impostate dal runtime Node.js 10 e i runtime precedenti.

Per eseguire le funzioni Node.js precedenti nel runtime Node.js 10 (e versioni successive), potrebbe essere necessario apportare modifiche a tutte le variabili di ambiente predefinite che stai utilizzando. Aggiorna il codice per utilizzare le variabili di sostituzione, ove possibile, oppure impostale autonomamente quando esegui il deployment della funzione. Come best practice, ti consigliamo di non fare affidamento su variabili di ambiente che non hai impostato esplicitamente.

Le seguenti variabili di ambiente non sono più impostate dal runtime Node.js 10:

Variabile di ambiente Migrazione
CODE_LOCATION Impostala durante il deployment della funzione. La posizione del codice è /srv.
ENTRY_POINT Utilizza invece la variabile di ambiente FUNCTION_TARGET.
GOOGLE_CLOUD_PROJECT Impostala durante il deployment della funzione.
GCP_PROJECT Impostala durante il deployment della funzione.
GCLOUD_PROJECT Impostala durante il deployment della funzione.
GOOGLE_CLOUD_REGION Impostala durante il deployment della funzione.
FUNCTION_REGION Impostala durante il deployment della funzione.
FUNCTION_NAME Utilizza invece la variabile di ambiente K_SERVICE.
FUNCTION_IDENTITY Impostala durante il deployment della funzione.
FUNCTION_MEMORY_MB Impostala durante il deployment della funzione.
FUNCTION_TIMEOUT_SEC Impostala durante il deployment della funzione.
FUNCTION_TRIGGER_TYPE Utilizza invece la variabile di ambiente FUNCTION_SIGNATURE_TYPE. Per i dettagli di utilizzo, consulta Utilizzo delle variabili di ambiente.
OLDPWD Non più disponibili
SHLVL Non più disponibili

Differenze nel runtime Node.js 8

La firma per le funzioni in background è cambiata tra i runtime Node.js 6 e Node.js 8, passando a Node.js 10.

Un esempio di funzione in background Node.js 6 potrebbe avere il seguente aspetto:

exports.nodejs6BackgroundFunction = (event, callback) => {
  let data = event.data;
  let context = event.context;
  // ... the rest of your function
};

Tieni presente che l'argomento event contiene le proprietà data e context. Nel runtime Node.js 10, le proprietà data e context sono state estratte dall'oggetto event e ora sono incluse nella firma della funzione:

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

Questa modifica semplifica i riferimenti agli oggetti data e context precedentemente contenuti nell'argomento event. Per ulteriori informazioni, consulta Parametri della funzione in background.

Se utilizzi la firma della funzione in background di Node.js 6, apporta le seguenti modifiche per eseguire la funzione in un runtime Node.js più recente:

  1. Modifica la firma della funzione da (event, callback) a (data, context, callback).

  2. Modifica i riferimenti in event.data e event.context in data e context, rispettivamente.

Deprecazioni: Node.js 6 e Node.js 8

I runtime Node.js 6 e Node.js 8 sono stati deprecati. Per assicurarti che le funzioni utilizzino una versione supportata di Node.js, eseguine la migrazione a Node.js 10 o versioni successive.

Dopo il 05/08/2020, i deployment delle funzioni che utilizzano Node.js 6 verranno bloccati. Le funzioni Cloud Functions che continueranno a utilizzare Node.js 6 dopo questo periodo di tempo potrebbero essere disabilitate.