برنامه‌های تک‌اجرایی در Node.js

ویژگی Single Executable Applications (SEA) در Node.js امکان توزیع یک برنامهٔ Node.js به‌صورت یک فایل اجرایی مستقل را فراهم می‌کند، بدون نیاز به نصب Node.js روی سیستم مقصد. این قابلیت با تزریق یک blob آماده‌شده (شامل اسکریپت و منابع) به باینری Node.js کار می‌کند. در زمان اجرا، اگر blob تزریق‌شده وجود داشته باشد، اسکریپت داخل آن اجرا می‌شود؛ در غیر این صورت Node.js به‌صورت عادی عمل می‌کند.

SEA (Single Executable Applications)--experimental-sea-configpostject toolsea.getAsset / sea.getAssetAsBlob / sea.getRawAsset / sea.getAssetKeys

~2 دقیقه مطالعه • بروزرسانی ۹ دی ۱۴۰۴

1. معرفی


SEA به توسعه‌دهندگان اجازه می‌دهد برنامه‌های Node.js را به‌صورت یک فایل اجرایی مستقل توزیع کنند. این قابلیت برای سیستم‌هایی که Node.js نصب ندارند بسیار مفید است.


2. مراحل ساخت SEA


  • نوشتن اسکریپت اصلی (مثلاً hello.js).
  • ایجاد فایل پیکربندی (sea-config.json).
  • تولید blob با --experimental-sea-config.
  • کپی باینری Node.js و تغییر نام آن.
  • تزریق blob با ابزار postject.
  • امضای باینری (در macOS و Windows).
  • اجرای فایل اجرایی مستقل.

3. پیکربندی blob


فایل پیکربندی شامل مسیر اسکریپت اصلی، خروجی blob، و گزینه‌های اضافی مانند useSnapshot, useCodeCache, execArgv و assets است.


{
  "main": "hello.js",
  "output": "sea-prep.blob",
  "useCodeCache": true,
  "execArgv": ["--no-warnings", "--max-old-space-size=2048"],
  "assets": {
    "a.jpg": "/path/to/a.jpg",
    "b.txt": "/path/to/b.txt"
  }
}

4. مدیریت منابع (Assets)


  • sea.getAsset(key): دریافت داده به‌صورت ArrayBuffer یا رشته.
  • sea.getAssetAsBlob(key): دریافت داده به‌صورت Blob.
  • sea.getRawAsset(key): دریافت دادهٔ خام بدون کپی.
  • sea.getAssetKeys(): لیست کلیدهای منابع تزریق‌شده.

5. Snapshot و Code Cache


  • useSnapshot: اجرای اسکریپت در زمان ساخت و ذخیرهٔ وضعیت heap برای بارگذاری سریع‌تر.
  • useCodeCache: تولید cache برای کد V8 جهت بهبود سرعت راه‌اندازی.

6. آرگومان‌های اجرا


  • execArgv: تعیین فلگ‌های Node.js هنگام اجرای SEA.
  • execArgvExtension: کنترل نحوهٔ افزودن آرگومان‌های اضافی ("none", "env", "cli").

7. محدودیت‌ها


  • فقط از سیستم ماژول CommonJS پشتیبانی می‌شود.
  • require() در اسکریپت تزریق‌شده فقط برای ماژول‌های داخلی قابل استفاده است.
  • پشتیبانی رسمی فقط روی Windows، macOS، و Linux (به‌جز Alpine و معماری s390x).

نتیجه‌گیری


ویژگی SEA در Node.js ابزاری قدرتمند برای توزیع برنامه‌ها به‌صورت فایل اجرایی مستقل است. با پشتیبانی از snapshot، code cache، و مدیریت منابع، توسعه‌دهندگان می‌توانند برنامه‌های سبک، سریع، و قابل حمل ایجاد کنند.


نوشته و پژوهش شده توسط دکتر شاهین صیامی