Memigrasikan Cloud Functions ke runtime Node.js yang lebih baru

Dokumen ini menjelaskan perbedaan antara versi runtime Node.js, untuk membantu Anda memigrasikan kode Cloud Functions.

Melakukan migrasi ke runtime yang lebih baru

Untuk melakukan migrasi ke runtime yang lebih baru:

  1. Baca tentang runtime target Anda dalam dokumen ini untuk memahami perbedaan yang ditimbulkannya, dan membuat perubahan yang diperlukan pada kode Anda. Secara khusus, perhatikan perubahan variabel lingkungan yang diperkenalkan dalam runtime Node.js 10.
  2. Deploy fungsi Anda dengan menentukan runtime Node.js target:

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Perbedaan runtime Node.js 14

Node.js 14 memperkenalkan beberapa fitur dan konsep baru. Sorotan:

  • Perantaian opsional. Perantaian opsional terlihat seperti ini: {"hello": null}?.hello?.neat. Hal ini memungkinkan akses yang aman ke deep key pada objek yang mungkin tidak ada.
  • Penggabungan null. Hal ini memperkenalkan ?? yang lebih aman daripada menggunakan || untuk penetapan (karena hanya bernilai false untuk null atau undefined).

Anda dapat mempelajari fitur Node.js 14 lebih lanjut di sini.

Perbedaan runtime Node.js 12

Node.js 12 menggunakan npm ci, yang selalu menjalankan skrip prepare di package.json.

Perbedaan utama antara penggunaan npm install dan npm ci adalah:

  • Project harus sudah memiliki package-lock.json atau npm-shrinkwrap.json.
  • Jika dependensi dalam kunci paket tidak cocok dengan yang ada di package.json, npm ci akan keluar dengan error, bukan memperbarui kunci paket.
  • Jika sudah ada, node_modules akan otomatis dihapus sebelum npm ci memulai penginstalannya.

Untuk melakukan upgrade dari Node.js 10 ke Node.js 12, pindahkan dependensi yang digunakan dalam prepare dari devDependencies ke dependencies.

Untuk Node.js 12 dan yang lebih baru, fungsi dengan batas memori lebih dari 2 GiB mengharuskan pengguna mengonfigurasi NODE_OPTIONS agar memiliki max_old_space_size. Contoh:

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

Perbedaan runtime Node.js 10

Runtime Node.js 10 memperkenalkan perubahan yang mungkin mengharuskan Anda mengubah kode sumber fungsi agar dapat menggunakan runtime yang lebih baru.

Untuk sebagian besar aplikasi, upgrade dari Node 8 ke Node 10 tidak akan melibatkan perubahan kode (perbedaan utamanya adalah perubahan dalam variabel lingkungan pada GCF).

Node 10 memperkenalkan berbagai fitur baru yang menarik, seperti iterator asinkron dan API file berbasis promise, beserta peningkatan performa dan patch keamanan.

Logging

Jika Anda tidak menggunakan JSON.stringify saat mencatat objek dan/atau koleksi ke dalam log di Node.js 8, Anda mungkin akan melihat peningkatan volume log setelah melakukan upgrade ke Node.js 10. Hal ini dapat menimbulkan biaya tambahan. Sebaiknya gunakan JSON.stringify untuk mengelompokkan pernyataan log bersama-sama, seperti yang ditunjukkan dalam Menulis, Melihat, dan Merespons Log.

Perubahan variabel lingkungan

Runtime Node.js 10 memperkenalkan perubahan pada variabel lingkungan yang telah ditentukan oleh runtime. Baca Variabel lingkungan yang disetel secara otomatis untuk mengetahui deskripsi lengkap tentang perbedaan antara variabel lingkungan yang ditetapkan oleh runtime Node.js 10 dengan runtime sebelumnya.

Untuk menjalankan fungsi Node.js lama di runtime Node.js 10 (dan yang lebih tinggi), Anda mungkin perlu membuat perubahan pada variabel lingkungan yang telah ditetapkan yang Anda gunakan. Perbarui kode Anda untuk menggunakan variabel pengganti jika memungkinkan atau tetapkan sendiri saat men-deploy fungsi Anda. Sebagai praktik terbaik, sebaiknya Anda tidak bergantung pada variabel lingkungan yang belum ditetapkan secara eksplisit.

Variabel lingkungan berikut tidak lagi ditetapkan oleh runtime Node.js 10:

Variabel lingkungan Migrasi
CODE_LOCATION Tetapkan saat men-deploy fungsi Anda. Lokasi kode Anda adalah /srv.
ENTRY_POINT Sebagai gantinya, gunakan variabel lingkungan FUNCTION_TARGET.
GOOGLE_CLOUD_PROJECT Tetapkan saat men-deploy fungsi Anda.
GCP_PROJECT Tetapkan saat men-deploy fungsi Anda.
GCLOUD_PROJECT Tetapkan saat men-deploy fungsi Anda.
GOOGLE_CLOUD_REGION Tetapkan saat men-deploy fungsi Anda.
FUNCTION_REGION Tetapkan saat men-deploy fungsi Anda.
FUNCTION_NAME Sebagai gantinya, gunakan variabel lingkungan K_SERVICE.
FUNCTION_IDENTITY Tetapkan saat men-deploy fungsi Anda.
FUNCTION_MEMORY_MB Tetapkan saat men-deploy fungsi Anda.
FUNCTION_TIMEOUT_SEC Tetapkan saat men-deploy fungsi Anda.
FUNCTION_TRIGGER_TYPE Sebagai gantinya, gunakan variabel lingkungan FUNCTION_SIGNATURE_TYPE. Lihat Menggunakan variabel lingkungan untuk mengetahui detail penggunaan.
OLDPWD Tidak lagi tersedia.
SHLVL Tidak lagi tersedia.

Perbedaan runtime Node.js 8

Tanda tangan untuk fungsi latar belakang berubah antara runtime Node.js 6 dan Node.js 8, dan berlanjut ke Node.js 10.

Contoh fungsi latar belakang Node.js 6 mungkin terlihat seperti berikut:

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

Perhatikan bahwa argumen event berisi properti data dan context. Dalam runtime Node.js 10, properti data dan context telah diekstrak dari objek event dan sekarang disertakan sebagai bagian dari tanda tangan fungsi:

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

Perubahan ini menyederhanakan referensi ke objek data dan context yang sebelumnya dimuat dalam argumen event. Untuk mengetahui informasi selengkapnya, baca Parameter fungsi latar belakang.

Jika Anda menggunakan tanda tangan fungsi background Node.js 6, lakukan perubahan berikut untuk menjalankan fungsi Anda dalam runtime Node.js yang lebih baru:

  1. Ubah tanda tangan fungsi dari (event, callback) menjadi (data, context, callback).

  2. Ubah referensi ke event.data dan event.context menjadi data dan context.

Tidak digunakan lagi: Node.js 6 dan Node.js 8

Runtime Node.js 6 dan Node.js 8 sudah tidak digunakan lagi. Untuk memastikan fungsi Anda menggunakan versi Node.js yang didukung, migrasikan fungsi ke Node.js 10 atau yang lebih baru.

Setelah 05-08-2020, deployment fungsi yang menggunakan Node.js 6 akan diblokir. Cloud Functions yang terus menggunakan Node.js 6 setelah waktu ini mungkin akan dinonaktifkan.