ساخت اپ‌های Node.Js با استفاده از TypeScript

در این مقاله میخوایم یاد بگیریم که چطور میشه با استفاده از TypeScript یه اَپ Node.Js نوشت و اون رو تست و دیباگ کرد. مدیریت پروژه‌های بزرگ JavaScript می‌تونه چالش برانگیز باشه. مخصوصا که باید تمام بخش‌های پروژه هماهنگ باشن. شما میتونید از یونیت تست و تایپ‌ها (که جاوا اسکریپت ندارد) یا ترکیب هر دو با هم برای حل این مشکل استفاده کنید.

اینجاست که TypeScript خودش رو نشون میده. TypeScript یک نسخه استاندارد شده از JavaScript هست که به سادگی کامپایل میشه.

چیزایی که توی این مقاله یاد می‌گیریم:


TypeScript چیست؟

با رشد روز افزون قدرت و توسعه حوزه‌های استفاده از JavaScript مثلا توسعه اپ‌های Native و استفاده از آن در وب سرویس‌هاو برنامه‌های سمت سرور باعث آن شد که شاهد پیداش برنامه‌های مبتنی بر JavaScript با سایزهای بی سابقه‌ای باشیم و این بیانگر این بود که تولید برنامه‌های مبتنی بر JavaScript در مقیاس‌های بزرگ امر دشواری است. و در اینجا بود که زبان TypeScript توسط ماکروسافت ارائه شد. و مشکل توسعه نرم‌افزارهای JavaScriptی با مقیاس بالا را حل کرد. این زبان از شئ‌گرایی پشتیبانی می‌کند و کدهای این زبان در نهایت به کدهای JavaScript ترجمه می‌شوند.


مزایای استفاده از TypeScript چیست؟


شروع با TypeScript و Node

TypeScript یک چک کننده نوع استاتیک برای JavaScript است. این بدین معناست که برای یافتن اشکالات از اطلاعات درون نوع‌های (تایپ‌های) مختلف استفاده می‌کند. مثلا: یک رشته (String) یک متد toLowerCase() دارد, اما یک parseInt() ندارد. البته می‌توانید Type Systemهای TypeScript را نسبت به تعاریف خودتون تغییر بدید.

از آنجا که TypeScript یک نسخه استاندارد شده از JavaScript است. فقط با تغییر فرمت (پسوند) فایل‌های JavaScript از .js به .ts آن‌ها را اجرا کنید. بنابر این می‌تونید به سادگی و آرام آرام TypeScript رو به تیمتون معرفی کنید.

نکته: TypeScript هیچ کاری در زمان اجرا انجام نمی دهد، فقط در طی زمان کامپایل کار می کند. بدین معنا که شما تنها فایل‌های JavaScript را اجرا می کنید.


برای شروع با TypeScript، اون رو از npm دریافت/نصب می‌کنیم:
  
        $ npm install -g typescript
  


خب اولین برنامه TypeScriptمون رو می‌نویسیم. یک تابع ساده برای سلام به یک شخص که پارامتری به نام person دریافت می‌کند!

        //first.ts
        function first(person: string) {
          return `Hello ${person}!`
        }
        
        const name = 'Gashtasb'
        
        console.log(first(name))



یکی از مواردی که باید بهش دقت کنید String جلوی پارامتر درون تابع first هست که به کامپایلر TypeScript میگه تابع first انتظار یک ورودی از نوع String را می‌کشد.

خب دیگه وقتش کامپایلش کنیم!

        tsc first.ts


بایید نگاهی به خروجی کامپایل داشته باشیم! همانطور که می‌بینید چیز آنچنانی تغییر نکرده و فقط String جلوی پارامتر تابع first حذف شده است.
    
        function first(person) {
            return "Hello " + person + "!";
        }
        var Name = 'Node Hero';
        console.log(first(Name));
    

شاید از خودتون بپرسید چی می‌شد اگر یک مقدار عددی بجای رشته به متغیر Name اختصاص میدادیم؟ ۱۰۰٪ برنامه ارور می‌داد.
    
        first.ts(10,21): error TS2345: Argument of type '3' 
        is not assignable to parameter of type 'string'.
    

ساخت یک اَپ Node.Js با استفاده از TypeScript

۱. محیط توسعه (IDE) خودتون رو باز کنید.

برای ساخت اَپ با استفاده از TypeScript مطمئن بشید که NodeJs رو سیستمون نصب هست. در این مقاله از Node.Js ۸ استفاده شده.
پیشنهاد می‌کنم Node.Js رو با استفاده از nvm نصب کنید. با استفاده از nvm می‌تونید چند نسخه متفاوت از node رو نصب کنید و در مواقع مورد نیاز بین اون‌ها جابجا بشید! (سویچ کنید)

               
        # install nvm
        curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
        
        # install node 8
        nvm install 8
        
        # to make node 8 the default
        nvm alias default 8
               
           

پس از آنکه Node.Js ۸ را نصب کردید. شاخه‌ای (دایرکتوری) که قرار است پروژه در آن قرار بگیرد را ایجاد کنید و فایل package.json پروژه را در آن ایجاد کنید.

              
        npm init
              
          

۲. ایجاد ساختار پروژه

هنگام استفاده از TypeScript، توصیه می شود تمام فایل های خود را در پوشه src قرار دهید.

در انتهای این آموزش، ما با ساختار پروژه زیر روبرو خواهیم شد:

ابتدا فایل app.ts را می‌سازیم که منطق وب سرور ما را در خود جای می‌دهد و از express استفاده می‌کند.
در این فایل یک کلاس به نام app می‌سازیم. که وب سرور ما را encapsulate می‌کند و متدی به نام mountRoutes را به ما ارائه می‌دهد که .

          
    import * as express from 'express'

    class App {
      public express
    
      constructor () {
        this.express = express()
        this.mountRoutes()
        }
    
      private mountRoutes (): void {
        const router = express.Router()
        router.get('/', (req, res) => {
          res.json({
            message: 'Hello World!'
          })
        })
        this.express.use('/', router)
      }
    }
    
    export default new App().express
    
          
      

همچنین یک فایل به نام index.ts می‌سازیم تا وب سرور اجرا شود.

            
    import app from './App'

    const port = process.env.PORT || 3000
    
    app.listen(port, (err) => {
      if (err) {
        return console.log(err)
      }
    
      return console.log(`server is listening on ${port}`)
    })
      
    

با این کار ما حداقل در تئوری یک وب سرور فانکشنال داریم. برای اجرای پروژه باید کدهای TypeScript خودمون رو به JavaScript کامپایل کنیم!

۳. تنظیمات TypeScript

ما می‌توانیم با استفاده از CLI یا یک فایل به نام tsconfig.json تنظیمات مورد نظر خودمون رو بر کامپایلر TypeScript اعمال کنیم.

با استفاده از این فایل تنظیمات ما به کاپایلر TypeScript می‌گیم که خروجی کامپایل ما چی باشه (مثل ES5, ES6, ES7 و...) و از چه ماژولی استفاده کنه و مسیر ذخیره خروجی JavaScript کجا باشه یا مثلا نقشه منبع ایجاد بشه یا نه!

            
    {
      "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "outDir": "dist",
        "sourceMap": true
      },
      "files": [
        "./node_modules/@types/mocha/index.d.ts",
        "./node_modules/@types/node/index.d.ts"
      ],
      "include": [
        "src/**/*.ts"
      ],
      "exclude": [
        "node_modules"
      ]
    }
      
    

بعد از اینکه فایل پیکربندی TypeScript رو به پروژه اضافه کردید می‌تونید با دستور tsc برنامه رو کامپایل و اجرا کنید.


نکته: اگر نمی‌تونید TypeScript رو به صورت سراسری نصب کنید بهترین کار اینه که اون رو به پیشنیازهای پروژه اضافه کنید.

۴- اضافه کردن ESLint

مثل خیلی از پروژه‌ها شما به linterها برای چک کردن مشکلات استایل کدتون نیاز دارید و TypeScript هم مستثنا نیست.

برای استفاده از ESLint با TypeScript باید یه بسته اضافه نسب کنیم (یک پارسر) خب با این بسته ESLint میتونه TypeScript رو درک کنه. وقتی که بسته‌ی typescript-eslint-parser رو نصب کردید. باید اون رو به عنوان پارسر ESLint تنظیم کنید:

      
        # .eslintrc.yaml
        ---
          extends: airbnb-base
          env:
            node: true
            mocha: true
            es6: true
          parser: typescript-eslint-parser
          parserOptions:
            sourceType: module
            ecmaFeatures: 
              modules: true


زمانی که eslint src --ext ts رو اجرا می‌کنید دقیقا همون ارورها و هشدارهای زمان اجرای فایل‌های TypeScript رو دریافت می‌کنید.

۵- تست اپلیکیشن

تست اپلیکیشن‌های مبتنی بر TypeScript اساساً همانند تست سایر برنامه‌های مبتنی بر Node.Js هست.

تنها چیزی که باید به خاطر داشته باشید اینه که قبل از تست باید برنامه رو کامپایل کنید. و انجام اینکار به سادگی اجرای دستور tsc && mocha dist/**/*.spec.js هست.

۶- ساخت Docker image

هنگامی که اپ خودتون رو آماده کردید احتمالا میخواید که اون رو به صورت یک Docker image در بیارید. برای این کار باید این دو قدم رو بردارید:

  
    FROM risingstack/alpine:3.4-v6.9.4-4.2.0

    ENV PORT 3001
    
    EXPOSE 3001
    
    COPY package.json package.json
    RUN npm install
    
    COPY . .
    RUN npm run build
    
    CMD ["node", "dist/"]


۷- اشکال‌زدایی (دیباگ) با استفاده از source-maps

همانطور که ساختن source-maps رو شروع می‌کنیم. میتونیم از اونها برای پیداکردن اشکالات برنامه استفاده کنیم. برای پیدا کردن اشکالات برنامه با دستور زیر پروسس‌های Node.js را شروع می‌کنیم:

  
    node --inspect dist/


خروجی چیزی شبیه به این خواهد بود:

  
    To start debugging, open the following URL in Chrome:
    chrome-devtools://devtools/remote/serve_file/@60cd6e859b9f557d2312f5bf532f6aec5f284980/
    inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/23cd0c34-3281-49d9-81c8-8bc3e0bc353a
  server is listening on 3000


برای شروع واقعی پروسه اشکال‌زدایی گوگل کروم خودتون رو باز کنید و به chrome://inspect برید. یک هدف از راه دور باید اونجا باشه :) فقط روی inspect کلیک کنید. این Chrome DevTools رو براتون اجرا می‌کنه.

در اینجا می‌تونید سورس رو مستقیم مشاهده کنید و از breakpoints و watchers در TypeScript استفاده کنید.
پ.ن: source-map تنها در Node.Js 8 به بالا پشتیبانی می‌شود.

نویسنده: گشتاسب مظفریان | تاریخ: ۱۱ خرداد ۱۳۹۷