ฟังก์ชันได้รับอนุญาตให้ใช้โมดูล Node.js ภายนอกและข้อมูลในเครื่อง Dependency ใน Node.js จัดการด้วย npm และแสดงในไฟล์ข้อมูลเมตาชื่อ package.json
รันไทม์ Node.js ของ Cloud Functions รองรับการติดตั้งโดยใช้ npm, yarn หรือ pnpm
หากต้องการระบุทรัพยากร Dependency ของฟังก์ชัน ให้เพิ่มลงในไฟล์ package.json
ในตัวอย่างนี้ รายการที่ต้องใช้จะแสดงอยู่ในไฟล์ package.json
{ "dependencies": { "escape-html": "^1.0.3" } }
จากนั้นนําเข้าข้อมูลดังกล่าวในฟังก์ชัน
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')}!`);
});
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')}!`);
}
รวมถึงโมดูล Node.js ในเครื่อง
นอกจากนี้ คุณยังรวมโมดูล Node.js ในเครื่องเป็นส่วนหนึ่งของฟังก์ชันได้ด้วย ซึ่งทำได้โดยการประกาศโมดูลใน package.json
โดยใช้คำนำหน้า file:
ในตัวอย่างนี้ mymodule
หมายถึงชื่อโมดูลและ mymoduledir
คือไดเรกทอรีที่มีโมดูล
{ "dependencies": { "mymodule": "file:mymoduledir" } }
โค้ดสําหรับโมดูลในเครื่องนี้ควรจัดเก็บไว้ที่อื่นนอกเหนือจากโฟลเดอร์ node_modules
ในไดเรกทอรีรูทของฟังก์ชัน
ขั้นตอนเพิ่มเติมสำหรับ TypeScript
TypeScript มีประโยชน์มากที่สุดเมื่อคุณใช้ไลบรารีที่มีข้อมูลประเภท
ซึ่งจะช่วยให้ TypeScript ตรวจจับข้อผิดพลาดทางไวยากรณ์ได้ และช่วยให้เครื่องมือแก้ไขแสดงคำแนะนำการเติมข้อความอัตโนมัติที่ดีขึ้น ไลบรารีบางรายการ เช่น firebase-admin
และ
firebase-functions
จะมาพร้อมกับคําจํากัดความ TypeScript
ไลบรารีจํานวนมากไม่ได้ให้คําจํากัดความ TypeScript ของตนเอง โปรเจ็กต์ DefinitelyTyped มีคำจำกัดความที่ชุมชนดูแลรักษาสำหรับไลบรารี Node ที่ได้รับความนิยมสูงสุด
DefinitelyTyped จะเผยแพร่คําจํากัดความเหล่านี้ภายใต้ชื่อแพ็กเกจ NPM เดียวกัน แต่ภายในองค์กร "@types" ตัวอย่างเช่น คุณสามารถติดตั้งข้อมูลประเภทสำหรับไลบรารี uuid
โดยใช้คำสั่งต่อไปนี้
npm install @types/uuid
เมื่อคุ้นเคยกับ TypeScript มากขึ้น คุณอาจพบว่าตัวเองใช้การติดตั้งทั้ง 2 แบบร่วมกัน ดังนี้
npm install uuid @types/uuid
ประเภทของข้อกําหนดควรเป็นประเภทเดียวกับข้อกําหนดของไลบรารี เช่น คุณไม่ควรบันทึก uuid
เป็นการพึ่งพาตามปกติและ @types/uuid
เป็นการพึ่งพาของนักพัฒนาซอฟต์แวร์หรือการพึ่งพาแบบคู่
กำลังโหลดโมดูล Node.js
ใช้ฟังก์ชัน Node.js
require()
เพื่อโหลดโมดูล Node.js ที่คุณติดตั้งไว้ นอกจากนี้ คุณยังใช้ฟังก์ชัน
require()
เพื่อนำเข้าไฟล์ในเครื่องที่ติดตั้งใช้งานพร้อมกับฟังก์ชันได้ด้วย
import
ในรูปแบบเดียวกันเพื่อโหลดโมดูล Node.js ที่คุณติดตั้งไว้
การใช้โมดูลส่วนตัว
คุณสามารถใช้โมดูล npm ส่วนตัวได้โดยระบุการตั้งค่าสำหรับการตรวจสอบสิทธิ์กับรีจิสทรีในไฟล์ .npmrc
ในไดเรกทอรีของฟังก์ชัน หากคุณใช้ Yarn v2 ขึ้นไปเป็นเครื่องมือจัดการแพ็กเกจ ไฟล์นี้จะชื่อว่า .yarnrc.yml
โมดูลส่วนตัวจาก Artifact Registry
ที่เก็บแพ็กเกจ Node.js ของ Artifact Registry สามารถโฮสต์โมดูลส่วนตัวสำหรับฟังก์ชันของคุณได้ เมื่อคุณทำให้ฟังก์ชัน Google Cloud Functions ใช้งานได้ กระบวนการสร้างจะสร้างข้อมูลเข้าสู่ระบบของ Artifact Registry ให้กับบัญชีบริการ Cloud Build โดยอัตโนมัติ
คุณเพียงต้องระบุที่เก็บ Artifact Registry ใน .npmrc
โดยไม่ต้องสร้างข้อมูลเข้าสู่ระบบเพิ่มเติม เช่น
@SCOPE :registry=https://REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME
//REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME :always-auth=true
วิธีนี้ใช้ได้กับเครื่องมือจัดการแพ็กเกจ Yarn v1 ด้วย
หากคุณใช้ Yarn v2 ขึ้นไป เพียงระบุที่เก็บ Artifact Registry ใน .yarnrc.yml
โดยไม่ต้องระบุข้อมูลเข้าสู่ระบบเพิ่มเติม
เช่น
npmScopes:
SCOPE :
npmRegistryServer: https://REGION_ID -npm.pkg.dev/PROJECT_ID /REPOSITORY_NAME
npmAlwaysAuth: true
โมดูลส่วนตัวจากที่เก็บข้อมูลอื่นๆ
เอกสารประกอบของ npm จะอธิบายวิธีสร้างโทเค็นการเข้าถึงแบบอ่านอย่างเดียวที่กําหนดเอง เราขอไม่แนะนําให้ใช้ไฟล์ .npmrc
ที่สร้างขึ้นในห้องสมุดของไดเรกทอรีหลัก เนื่องจากมีโทเค็นอ่าน/เขียน คุณไม่จำเป็นต้องมีสิทธิ์เขียนระหว่างการติดตั้งใช้งาน และอาจก่อให้เกิดความเสี่ยงด้านความปลอดภัย
อย่ารวมไฟล์ .npmrc
ไว้ด้วยหากคุณไม่ได้ใช้ที่เก็บข้อมูลส่วนตัว เนื่องจากอาจเพิ่มเวลาในการติดตั้งใช้งานฟังก์ชัน
รูปแบบไฟล์
หากคุณใช้ไฟล์ .npmrc
เพื่อตั้งค่าโทเค็นการตรวจสอบสิทธิ์ที่กําหนดเอง ไฟล์ดังกล่าวควรมีบรรทัดดังที่แสดงด้านล่าง
//REGISTRY_DOMAIN /:_authToken=AUTH_TOKEN
แทนที่
- REGISTRY_DOMAIN: ชื่อโดเมนของรีจิสทรี npm ส่วนตัว หากที่เก็บข้อมูลของคุณโฮสต์กับ
npmjs.org
ให้ตั้งค่าช่องนี้เป็นregistry.npmjs.org
AUTH_TOKEN: โทเค็นการให้สิทธิ์สำหรับรีจิสทรี npm ซึ่งอาจเป็นค่าข้อความตามตัวอักษรของโทเค็นหรือสตริงข้อความ
${NPM_TOKEN}
ซึ่งnpm
จะแทนที่ด้วยค่าโทเค็นจริงจากสภาพแวดล้อมคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม
$NPM_TOKEN
ด้วยอาร์กิวเมนต์--set-build-env-vars
ให้กับคำสั่งgcloud functions deploy
ดูรายละเอียดเพิ่มเติมเกี่ยวกับโทเค็นการตรวจสอบสิทธิ์ NPM ได้ที่บทแนะนำ NPM เกี่ยวกับโมดูลส่วนตัว
สร้างฟังก์ชันด้วยทรัพยากรของผู้ให้บริการ
ไลบรารีของผู้ให้บริการคือไลบรารีที่มีแหล่งที่มารวมอยู่ในแพ็กเกจซอร์สโค้ดของคุณโดยตรงและสร้างขึ้นใหม่ควบคู่ไปกับโค้ดของคุณเอง คุณสร้างการอ้างอิง Node.js ของผู้ให้บริการและข้ามการติดตั้งในระหว่างการทำให้ใช้งานได้โดยใช้ตัวแปรสภาพแวดล้อมการสร้าง GOOGLE_VENDOR_NPM_DEPENDENCIES
ข้อกําหนดเบื้องต้นสําหรับทรัพยากร 3rd party
ตรวจสอบว่าคุณมีฟังก์ชันที่ใช้งานได้ซึ่งมีทรัพยากรทั้งหมดที่คุณต้องการให้ผู้ให้บริการกำหนดไว้ในไฟล์
package.json
ติดตั้งการอ้างอิงเหล่านี้ในเครื่องโดยเรียกใช้
npm install
นำ
node_modules
ออกจากไฟล์ .gcloudignore ในไดเรกทอรีการทำงานติดตั้งใช้งานฟังก์ชัน โดยตรวจสอบว่าเวอร์ชัน Node.js ในพื้นที่ของคุณเหมือนกับเวอร์ชันที่คุณระบุไว้ระหว่างการติดตั้งใช้งาน
ติดตั้งใช้งานฟังก์ชันและทรัพยากร Dependencies ของผู้ให้บริการด้วยคำสั่งต่อไปนี้
gcloud functions deploy
FUNCTION_NAME \ --runtimeRUNTIME_NAME \ --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=trueแทนที่
- FUNCTION_NAME: ชื่อของฟังก์ชัน Cloud Functions ที่คุณกำลังทำให้ใช้งานได้
- RUNTIME_NAME: ชื่อรันไทม์ Node.js เพื่อเรียกใช้ฟังก์ชันที่ติดตั้ง โดยต้องเป็น Node.js เวอร์ชันเดียวกับที่คุณใช้ในสภาพแวดล้อมการพัฒนาในเครื่อง
แพ็กเกจเฟรมเวิร์ก Functions เป็นทรัพยากรที่จำเป็นสำหรับฟังก์ชัน เราขอแนะนำให้ใช้แพ็กเกจนี้กับผู้ให้บริการเพื่อให้บิลด์เร็วขึ้น หากไม่ จะมีการดาวน์โหลดและติดตั้งเมื่อคุณสร้างฟังก์ชัน
หากคุณระบุเครื่องมือ npm ในไฟล์ package.json ระบบจะดาวน์โหลด npm เวอร์ชันที่ระบุ ณ เวลาที่สร้าง หากต้องการระงับลักษณะการทำงานนี้ ให้นำออกจากไฟล์ package.json