ویژگی تصویر

استفاده از TypeScript در پروژه‌های Node.js — راهنمای کامل

  /  Node.js   /  استفاده از TypeScript در پروژه های Node.js
بنر تبلیغاتی الف
NodeJS - Node.js

TypeScript اکنون به یکی از ابزارهای اصلی برای توسعه سمت سرور با Node.js تبدیل شده است. ترکیب ایمنی نوع (type safety)، تکمیل خودکار بهتر در ویرایشگرها و قابلیت نگهداری بالا، TypeScript را برای پروژه‌های کوچک و بزرگ جذاب کرده است. در این مقاله به صورت عملی و گام‌به‌گام به نصب، پیکربندی، الگوهای توسعه و نکات بهینه‌سازی می‌پردازیم.

چرا TypeScript را در Node.js استفاده کنیم؟

  • کاهش خطاهای زمان اجرا: خطاهای تایپی و ناسازگاری APIها در زمان کامپایل مشخص می‌شوند.
  • خوانایی و نگهداری بهتر: تعریف اینترفیس‌ها و تایپ‌ها باعث مستندسازی خودکار کد می‌شود.
  • سرعت توسعه: ابزارهای IDE مانند autocomplete و refactor با TypeScript بسیار قدرتمندتر هستند.
  • همکاری تیمی: قراردادهای تایپ به هماهنگی بین اعضای تیم کمک می‌کند.

راه‌اندازی اولیه (پروژه جدید)

ابتدا Node.js و npm را نصب کنید، سپس یک پروژه جدید بسازید و TypeScript را اضافه کنید:

npm init -y
npm install typescript --save-dev
npx tsc --init

در اینجا فایل tsconfig.json ایجاد می‌شود که تنظیمات کامپایلر را در خود دارد. در ادامه تنظیمات پیشنهادی را می‌بینیم.

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "outDir": "./dist",
    "rootDir": "./src",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
    "sourceMap": true
  }
}

این تنظیمات مناسب اکثر اپلیکیشن‌های Node.js است. target و module بسته به نسخه Node و نیازتان قابل تنظیم‌اند. گزینه strict پیشنهاد می‌شود برای دریافت بیشترین سود از TypeScript.

نمونه ساده: Express با TypeScript

npm install express
npm install -D @types/express ts-node nodemon

// src/index.ts
import express, { Request, Response } from 'express';

const app = express();
app.use(express.json());

app.get('/hello', (req: Request, res: Response) => {
  res.json({ message: 'Hello from TypeScript + Node' });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server listening on ${PORT}`);
});

در این مثال از تایپ‌های ارائه‌شده توسط بسته @types/express استفاده شده تا Request و Response تایپ شوند. بسته ts-node برای اجرای مستقیم فایل‌های TypeScript در محیط توسعه مفید است و nodemon برای بارگذاری مجدد خودکار.

اسکریپت‌های معمول در package.json

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts",
    "lint": "eslint . --ext .ts"
  }
}

اسکریپت dev برای توسعه سریع و build برای تولید بستهٔ اجرایی نهایی کاربرد دارد. برای production همیشه پیشنهاد می‌شود کدها را کامپایل کرده و از خروجی JS اجرا کنید.

تایپ‌ها و الگوهای معماری

برای نگهداری بهتر، داده‌هایی که از API یا دیتابیس می‌آیند را با DTO یا اینترفیس مشخص کنید:

// src/types/user.ts
export interface CreateUserDTO {
  name: string;
  email: string;
  age?: number;
}

این الگو کمک می‌کند ورودی‌ها و خروجی‌ها در سراسر پروژه یکدست بمانند و خطاهای ناهماهنگی سریع‌تر مشخص شوند.

ارتباط با پایگاه داده به صورت Type-safe

برای دسترسی نوع ایمن به دیتابیس می‌توانید از ORMها/ابزارهایی مثل Prisma یا TypeORM استفاده کنید که تایپ‌های تولیدشده دارند. مثال: Prisma با ساخت TypeScript client که به‌صورت اتوماتیک نوع‌ها را تولید می‌کند.

تفاوت‌های runtime و compile-time

TypeScript تنها در زمان توسعه و کامپایل مفید است؛ در زمان اجرای نهایی کدها به JavaScript تبدیل شده و اجرا می‌شوند. بنابراین بار اجرایی (runtime) اضافه‌ای توسط TypeScript ایجاد نمی‌شود. اما زمان بیلد و سربار کامپایل در پروژه‌های بزرگ باید مدیریت شود.

ابزارها و نکات عملی

  • استفاده از esModuleInterop برای راحتی import کردن ماژول‌های CommonJS.
  • فعال کردن sourceMap برای دیباگ بهتر در محیط توسعه.
  • برای تست unit از jest به همراه ts-jest استفاده کنید.
  • برای مهاجرت تدریجی می‌توانید allowJs و checkJs را در tsconfig فعال کنید تا فایل‌های JS نیز بررسی شوند.

مقایسه سریع: ts-node vs tsc –watch

ابزارمزایامعایب
ts-nodeراه‌اندازی سریع، مناسب توسعهکندتر در پروژه‌های بزرگ؛ مناسب production نیست
tsc –watchتولید فایل‌های JS مستقل، مناسب برای productionنیاز به اجرای مجدد node یا ابزار reload

الگوهای کدنویسی و بهترین شیوه‌ها

  • از strict استفاده کنید تا بیشترین پوشش نوع را داشته باشید.
  • تایپ عمومی (any) را محدود کنید؛ در صورت لزوم از unknown استفاده کنید و سپس چک کنید.
  • ماژول‌ها و لایه‌ها را تفکیک کنید: routes, controllers, services, repositories.
  • از الگوهای خطا و نوع‌بندی Error استفاده کنید تا هندلینگ استثناها امن‌تر باشد.

نکات تولید (Deployment)

در محیط تولید کدهای TypeScript را کامپایل و خروجی را اجرا کنید:

npm run build
node dist/index.js

همچنین اطمینان حاصل کنید فایل‌های منابع مانند .env و فایل‌های تنظیمی در کانتینر یا سرور در دسترس باشند. برای عملکرد بهتر، فایل‌های نهایی را کوچک کنید و از ابزارهای monitoring برای مشاهده خطاهای runtime استفاده کنید.

نتیجه‌گیری و مسیر مهاجرت

TypeScript راه قدرتمندی برای بهبود کیفیت و نگهداری پروژه‌های Node.js است. با پیکربندی مناسب، رعایت قوانین تایپ و انتخاب ابزارهای توسعه‌ای، می‌توانید از مزایای آن بدون افت قابل‌توجه در عملکرد بهره‌مند شوید. اگر به صورت تدریجی مهاجرت می‌کنید، ابتدا ماژول‌های جدید را با TypeScript بنویسید، سپس به مرور بخش‌های قدیمی را تبدیل کنید.

در نهایت، ترکیب TypeScript، تست‌های خودکار، و CI/CD باعث می‌شود پروژه‌های Node.js مقیاس‌پذیر، قابل اعتماد و قابل نگهداری‌تر باشند.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: