Ikuti sorotan dari Firebase di Google I/O 2023. Pelajari lebih lanjut

Menangani dependensi

Fungsi diizinkan untuk menggunakan modul Node.js eksternal serta data lokal. Dependensi pada Node.js dikelola dengan npm dan dinyatakan dalam file metadata bernama package.json. Runtime Node.js Cloud Functions umumnya mendukung penginstalan menggunakan npm atau yarn.

Untuk menentukan dependensi bagi fungsi Anda, tambahkan dependensi tersebut ke file package.json.

Dalam contoh ini, dependensi tercantum dalam file package.json:

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

Kemudian, dependensi tersebut akan diimpor dalam fungsi:

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

Menyertakan modul Node.js lokal

Anda juga dapat menyertakan modul Node.js lokal sebagai bagian dari fungsi Anda. Caranya, deklarasikan modul Anda di package.json menggunakan awalan file:. Dalam contoh berikut, mymodule merujuk ke nama modul Anda dan mymoduledir adalah direktori yang berisi modul Anda:

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

Kode untuk modul lokal ini tidak boleh disimpan di folder node_modules dalam direktori root fungsi Anda.

Langkah tambahan untuk TypeScript

TypeScript sangat membantu saat Anda menggunakan library yang memiliki informasi jenis. Dengan begitu, TypeScript dapat mendeteksi error sintaksis dan editor dapat memberikan saran pelengkapan otomatis yang lebih baik kepada Anda. Beberapa library, seperti firebase-admin dan firebase-functions, dilengkapi dengan definisi TypeScript.

Banyak library yang tidak menyediakan definisi TypeScript-nya sendiri. Project DefinitelyTyped memberikan definisi yang dikelola komunitas untuk library node yang paling populer. DefinitelyTyped memublikasikan definisi ini dengan nama paket NPM yang sama, tetapi berada dalam organisasi "@types". Misalnya, Anda dapat menginstal informasi jenis untuk library uuid dengan perintah berikut ini:

npm install @types/uuid

Jika sudah terbiasa menggunakan TypeScript, Anda dapat menggabungkan kedua penginstalan:

npm install uuid @types/uuid

Dependensi jenis harus sama dengan dependensi library. Misalnya, Anda tidak boleh menyimpan uuid sebagai dependensi normal dan @types/uuid sebagai dependensi dev atau dependensi peer.

Memuat modul Node.js

Gunakan fungsi require() Node.js untuk memuat modul Node.js mana pun yang telah diinstal. Anda juga dapat menggunakan fungsi require() untuk mengimpor file lokal yang di-deploy bersama fungsi Anda.

Jika Anda menulis fungsi di TypeScript, gunakan pernyataan import dengan cara yang sama untuk memuat modul Node.js yang telah diinstal.

Menggunakan modul pribadi

Anda dapat menggunakan modul npm pribadi dengan menyediakan setelan untuk mengautentikasi dengan registry dalam file .npmrc di direktori fungsi. Jika Anda menggunakan Yarn v2 atau yang lebih baru sebagai pengelola paket, file ini akan diberi nama .yarnrc.yml.

Modul pribadi dari Artifact Registry

Repositori paket Node.js Artifact Registry dapat menghosting modul pribadi untuk fungsi Anda. Saat Anda men-deploy fungsi Google Cloud Functions, proses build secara otomatis akan menghasilkan kredensial Artifact Registry untuk akun layanan Cloud Build. Anda hanya perlu mencantumkan repositori Artifact Registry di .npmrc tanpa membuat kredensial tambahan. Contoh:

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

Pendekatan ini juga berfungsi untuk pengelola paket Yarn v1. Jika Anda menggunakan Yarn v2 atau yang lebih baru, Anda hanya perlu mencantumkan repositori Artifact Registry di .yarnrc.yml tanpa kredensial tambahan. Contoh:

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

Modul pribadi dari repositori lain

Dokumentasi npm menjelaskan cara membuat token akses hanya baca kustom. Sebaiknya jangan gunakan file .npmrc yang dibuat di direktori home karena file tersebut berisi token baca-tulis. Izin operasi tulis tidak diperlukan selama deployment, dan dapat menimbulkan risiko keamanan.

Jangan menyertakan file .npmrc jika Anda tidak menggunakan repositori pribadi, karena dapat memperlama waktu deployment untuk fungsi Anda.

Format file

Jika Anda menggunakan file .npmrc untuk menetapkan token autentikasi kustom, file tersebut harus menyertakan baris yang ditampilkan di bawah.

//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN

Replace:

  • REGISTRY_DOMAIN: nama domain registry npm pribadi Anda. Jika repositori Anda dihosting dengan npmjs.org, tetapkan kolom ini ke registry.npmjs.org.
  • AUTH_TOKEN: token otorisasi untuk registry npm Anda. Token ini dapat berupa nilai teks literal dari token atau string teks ${NPM_TOKEN}, yang diganti dengan npm dengan nilai token sebenarnya dari lingkungan.

    Anda dapat menetapkan variabel lingkungan $NPM_TOKEN dengan argumen --set-build-env-vars ke perintah gcloud functions deploy. Lihat tutorial NPM tentang modul pribadi untuk mengetahui detail lebih lanjut tentang token autentikasi NPM.