Cloud फ़ंक्शन के लिए TypeScript का इस्तेमाल करना

ऐसे डेवलपर जो TypeScript में फ़ंक्शन लिखना पसंद करते हैं उनके लिए, Cloud Functions दो तरह की सुविधाएं उपलब्ध कराता है:

  • शुरू करने के समय (firebase init functions) अपने-आप ट्रांसपाइल होने के लिए, TypeScript प्रोजेक्ट बनाएं और उन्हें कॉन्फ़िगर करें.
  • डिप्लॉय करने के समय, पहले से मौजूद TypeScript सोर्स को JavaScript में ट्रांसपाइल करने के लिए, predeploy हुक का इस्तेमाल करें.

इस गाइड में दिए गए निर्देशों का पालन करके, JavaScript के किसी मौजूदा प्रोजेक्ट को TypeScript में माइग्रेट किया जा सकता है. साथ ही, सोर्स कोड को ट्रांसपाइल करने के लिए, predeploy हुक का इस्तेमाल करके फ़ंक्शन डिप्लॉय किए जा सकते हैं. फ़ंक्शन लिखते समय, TypeScript के कई फ़ायदे होते हैं. जैसे:

  • TypeScript, JavaScript की नई सुविधाओं के साथ काम करता है. जैसे, async/await. इससे प्रॉमिस मैनेजमेंट आसान हो जाता है
  • एक Cloud Functions लिंटर, कोडिंग के दौरान होने वाली सामान्य समस्याओं को हाइलाइट करता है
  • टाइप सेफ़्टी की मदद से, डिप्लॉय किए गए फ़ंक्शन में रनटाइम से जुड़ी गड़बड़ियां होने से बचा जा सकता है

अगर आपके लिए TypeScript नया है, तो TypeScript in 5 minutes लेख पढ़ें.

TypeScript की मदद से, नया Cloud Functions प्रोजेक्ट शुरू करना

नई डायरेक्ट्री में firebase init functions कमांड चलाएं. यह टूल, JavaScript या TypeScript की मदद से प्रोजेक्ट बनाने के विकल्प देता है. प्रोजेक्ट का यह स्ट्रक्चर पाने के लिए, TypeScript को चुनें:

myproject
 +- functions/     # Directory containing all your functions code
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- tsconfig.json
      |
      +- .eslintrc.js # Optional file if you enabled ESLint
      +- tsconfig.dev.json # Optional file that references .eslintrc.js
      |
      +- src/     # Directory containing TypeScript source
      |   |
      |   +- index.ts  # main source file for your Cloud Functions code
      |
      +- lib/
          |
          +- index.js  # Built/transpiled JavaScript code
          |
          +- index.js.map # Source map for debugging

शुरू करने की प्रोसेस पूरी होने के बाद, index.ts में दिए गए सैंपल से टिप्पणी हटाएं. इसके बाद, npm run serve कमांड चलाएं. इससे आपको "Hello World" फ़ंक्शन दिखेगा.

TypeScript के किसी मौजूदा प्रोजेक्ट का इस्तेमाल करना

अगर आपके पास TypeScript का कोई मौजूदा प्रोजेक्ट है, तो उसमें predeploy हुक जोड़ा जा सकता है. इससे यह पक्का किया जा सकेगा कि कोड डिप्लॉय करने पर, आपका प्रोजेक्ट हर बार ट्रांसपाइल हो. Cloud Functions for Firebase इसके लिए, आपके पास सही फ़ॉर्मैट वाली tsconfig.json फ़ाइल और Firebase प्रोजेक्ट होना चाहिए. साथ ही, आपको Firebase के कॉन्फ़िगरेशन में ये बदलाव करने होंगे:

  1. अपने TypeScript प्रोजेक्ट को बनाने के लिए, package.json में बदलाव करके बैश स्क्रिप्ट जोड़ें. उदाहरण के लिए:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  2. बिल्ड स्क्रिप्ट चलाने के लिए, firebase.json में बदलाव करके predeploy हुक जोड़ें. उदाहरण के लिए:

     {
       "functions": {
         "predeploy": "npm --prefix functions run build",
       }
     }
    

इस कॉन्फ़िगरेशन के साथ, firebase deploy --only functions कमांड, आपके TypeScript कोड को बिल्ड करता है और उसे फ़ंक्शन के तौर पर डिप्लॉय करता है.

JavaScript के किसी मौजूदा प्रोजेक्ट को TypeScript में माइग्रेट करना

अगर आपके पास कोई ऐसा Cloud Functions प्रोजेक्ट है जिसे आपने JavaScript में शुरू और डेवलप किया है, तो उसे TypeScript में माइग्रेट किया जा सकता है. हमारा सुझाव है कि शुरू करने से पहले, गिट चेकपॉइंट या कोई अन्य बैकअप बनाएं.

JavaScript के किसी मौजूदा Cloud Functions प्रोजेक्ट को माइग्रेट करने के लिए:

  1. गिट चेकपॉइंट बनाएं और JavaScript की मौजूदा सोर्स फ़ाइलों की कॉपी सेव करें.
  2. प्रोजेक्ट डायरेक्ट्री में, firebase init functions कमांड चलाएं. इसके बाद, फ़ंक्शन लिखने के लिए भाषा चुनने का प्रॉम्प्ट दिखने पर, TypeScript को चुनें.
  3. मौजूदा package.json फ़ाइल को ओवरराइट करने के बारे में पूछे जाने पर, नहीं को चुनें. हालांकि, अगर आपको मौजूदा फ़ाइल नहीं रखनी है, तो हां को चुना जा सकता है.
  4. functions/src डायरेक्ट्री में मौजूद index.ts को मिटाएं और उसकी जगह अपना मौजूदा सोर्स कोड डालें.
  5. शुरू करने के समय बनाई गई tsconfig.json फ़ाइल में, कंपाइलर के विकल्प सेट करके JavaScript को अनुमति दें: "allowJs": true.
  6. सेव की गई package.json फ़ाइल को functions डायरेक्ट्री में कॉपी करें. इसके बाद, इसमें बदलाव करके "main" को "lib/index.js" पर सेट करें.
  7. package.json में, TypeScript के लिए कोई बिल्ड स्क्रिप्ट जोड़ें. जैसे:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  8. npm install --save-dev typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser कमांड चलाकर, "typescript" को डेवलपमेंट डिपेंडेंसी के तौर पर जोड़ें.

  9. सभी डिपेंडेंसी के लिए, npm install --save @types/<dependency> कमांड चलाएं.

  10. ज़रूरत के हिसाब से, सोर्स कोड को .js से .ts में फिर से लिखें.

TypeScript के फ़ंक्शन का इम्यूलेशन करना

TypeScript के फ़ंक्शन को स्थानीय तौर पर टेस्ट करने के लिए, स्थानीय तौर पर फ़ंक्शन चलाना लेख में बताए गए इम्यूलेशन टूल का इस्तेमाल किया जा सकता है. इन टूल का इस्तेमाल करने से पहले, अपने कोड को कंपाइल करना ज़रूरी है. इसलिए, firebase emulators:start या firebase functions:shell कमांड चलाने से पहले, अपनी फ़ंक्शन डायरेक्ट्री में npm run build कमांड ज़रूर चलाएं. इसके अलावा, शॉर्टकट के तौर पर npm run serve या npm run shell कमांड चलाएं. इन दोनों कमांड से, बिल्ड चलता है और फ़ंक्शन शेल शुरू होता है.

TypeScript प्रोजेक्ट के लिए फ़ंक्शन के लॉग

firebase deploy के दौरान, आपके प्रोजेक्ट का index.ts, index.js में ट्रांसपाइल हो जाता है. इसका मतलब है कि Cloud Functions के लॉग में, index.js फ़ाइल के लाइन नंबर दिखेंगे. इसमें आपके लिखे गए कोड के लाइन नंबर नहीं दिखेंगे. index.ts में, पाथ और लाइन नंबर ढूंढने में आपकी मदद करने के लिए, firebase deploy, functions/lib/index.js.map बनाता है. इस सोर्स मैप का इस्तेमाल, अपने पसंदीदा IDE में या नोड मॉड्यूल के ज़रिए किया जा सकता है.