به همان جاوااسکریپتی کامپایل می‌شود
که خودت می‌نوشتی

یک کامپایلر build-time برای UI واکنش‌پذیر دانه‌ریز — بدون virtual DOM، بدون dependency.

1.98 KB کل اپ، runtime داخلش ۱۲ نام در کل API ۰ runtime dependency فایل استاندارد .js

این چیست

کد تو جاوااسکریپت استاندارد است: signal به‌همراه template‌های html. بدون هیچ build در مرورگر اجرا می‌شود — کامپایلر یک بهینه‌ساز است، نه یک الزام.

// همین فایل، بدون build، در مرورگر اجرا می‌شود
import { signal, computed, html, mount } from 'amojs';

function Counter() {
  const count  = signal(0);
  const double = computed(() => count.value * 2);

  return html`
    <button onclick=${() => count.value++}>
      ${count} × 2 = ${double}
    </button>`;
}

mount(Counter, document.body);

چرا

بدون virtual DOM

هر template یک بار پارس می‌شود و هر نمونه با cloneNode ساخته می‌شود. هر hole دینامیک به یک effect کوچک وصل است — یک binding عوض شود، دقیقاً یک expression دوباره ارزیابی می‌شود. چیزی diff نمی‌شود، چون چیزی برای مقایسه وجود ندارد.

قابل حذف است

amo eject جاوااسکریپت خوانا بیرون می‌دهد و همه‌ی import‌ها را به مسیر نسبی بازنویسی می‌کند. تست eject خروجی را اجرا می‌کند و ثابت می‌کند هیچ specifier‌ی به node_modules نمی‌رسد. یعنی حذف AmoJS واقعاً هیچ چیزی را عوض نمی‌کند.

معنای یکسان، با build و بدون build

هر تست golden یک fixture را دو بار اجرا می‌کند — یک بار خام، یک بار کامپایل‌شده — و رفتار باید یکی باشد. کامپایلر حق ندارد پیاده‌سازی دومی با تفاوت‌های نامحسوس باشد.

بدون file format

فایل تو همین حالا اجرا می‌شود. یعنی hover و go-to-definition و rename و type-check، همه از امروز کار می‌کنند — بدون افزونه، بدون language server.

اعداد

هر عدد یک gate در CI است، نه یک ادعا.

1.98 KB / 2 KB

اپ counter کامپایل‌شده، به‌همراه runtime، minify و gzip

1.087 ≤ 1.10

حجم خروجی کامپایلر تقسیم بر vanilla دست‌نویس — identity benchmark

2.95×

اندازه‌ی Lit برای همان اپ، در کوچک‌ترین حالت خودش

1 : 5

وقتی یکی از پنج binding عوض می‌شود: AmoJS یک expression ارزیابی می‌کند، Lit پنج تا

چه چیزی هرگز نخواهد داشت

این‌ها تصمیم‌های بسته‌اند، نه سؤال‌های باز:

این صفحه فعلاً یک placeholder است. داکیومنت واقعی با خودِ amo build ساخته می‌شود — دقیقاً همان کامپایلری که توضیحش را می‌دهد. هر بخش باید یک نمونه‌ی زنده و قابل‌دستکاری باشد، نه متن: صفحه‌ی each باید شمارنده‌ی render را نشان بدهد که تکان نمی‌خورد، نه اینکه ادعا کند node‌ها جابه‌جا می‌شوند.