مانیفست بستهٔ آرتیفکت
شناسهٔ شِما: artifact-package@1
شِمای ماشینخوان: artifact-package.schema.json
نام فایل درون آرشیو: parsware.json، در ریشهٔ آن
همان چیزی که یک پوشه از خروجی باندلر را به چیزی تبدیل میکند که پلتفرم بتواند بپذیرد.
npm run pack آن را کنار خروجی بیلد مینویسد و با آن zip میکند؛ پلتفرم هنگام
بارگذاری آن را میخواند، و آرشیوی که با دست سرهم شده باشد دقیقاً با همان قاعدهای رد میشود
که یک آرشیو تولیدشده (قاعدهٔ تکمسیرِ اعتبارسنجی، بخش ۶.۷).
چرا وجود دارد
ثبت کنترل پیشتر شش فیلد از سازنده میخواست که دو تای آنها از پیکربندی باندلر رونویسی میشد: اسکوپ Module Federation و ماژول ارائهشده. اشتباه در هرکدام یک نشانهٔ واحد داشت — کنترل بارگذاری نمیشد — بدون هیچ سرنخی که کدامیک غلط بوده است. بیلد هر دو را از پیش میداند، پس آنها را مینویسد.
شکل
| فیلد | نوع | اجباری | یادداشتها |
|---|---|---|---|
formatVersion | integer | بله | باید دقیقاً 1 باشد. یک const است نه یک کمینه، تا آرشیوی از قالبی آینده با پیامی روشن رد شود، نه اینکه با قواعد امروز خوانده شود و جایی کمآشکارتر شکست بخورد. |
kind | string | بله | CustomControl. اپلیکیشنهای سفارشی هنگامی به این فهرست میپیوندند که بسته را بپذیرند — از همان ذخیرهگاه، حافظهٔ میانی و نقطهٔ سرو استفاده خواهند کرد و تنها در فیلدهای ویژهٔ هر نوع در این مانیفست تفاوت خواهند داشت. |
logicalName | string | بله | با پیشوند ناشر، snake_case کوچک (مثلاً par_signature_pad). هنگام بارگذاری در برابر پیشوند ناشرِ راهکار مالک بررسی میشود، تا آرشیوی از جای دیگر نتواند یک پیشوند را از آنِ خود کند. |
displayName | string | بله | نام خوانا که در پالت فیلدهای طراح فرم دیده میشود. |
description | string | null | خیر | توصیف کوتاه، حداکثر ۵۱۲ نویسه. |
version | string | بله | نسخهٔ سهبخشی (1.2.3)، همان نسخهٔ npm خودِ کنترل. برای عیبیابی ثبت میشود و به سازندهای نشان داده میشود که بررسی میکند آنچه نصب است همان چیزی است که ساخته؛ چیزی را کنترل نمیکند. |
scope | string | بله | اسکوپ کانتینر Module Federation، خواندهشده از پیکربندی federation در بیلد. |
module | string | بله | مسیر ماژول ارائهشده (مثلاً ./Control)، خواندهشده از نگاشت exposes در پیکربندی federation. |
entry | string | بله | فایل ورودی کانتینر درون آرشیو (مثلاً remoteEntry.js). یک نام فایل ساده است نه یک مسیر: فایلی در ریشهٔ آرشیو را نام میبرد، که همان مسیر پایهای است که پلتفرم تکههای ناهمزمان آرتیفکت را از آن سرو میکند. |
substitutesFor | string[] | برای CustomControl بله | خانوادههای نوعدادهٔ فیلدی که کنترل میتواند به آنها بسته شود. باید دقیقاً با فهرست custom-control-manifest@1 بخواند. |
requestedScopes | string[] | برای CustomApp بله | دامنههای OAuth که یک برنامهٔ سفارشی اعلام میکند نیاز دارد، و هنگام صدور توکن زمینهٔ برنامهاش درخواست میشود (§۶٫۳). برای یک کنترل سفارشی نیست، که هیچ اعلام نمیکند — با دسترسیهای خودِ کسی که از آن استفاده میکند اجرا میشود (§۲۸). |
مقادیر از کجا میآیند
دو منبع، و هیچکدام دربارهٔ نیمهٔ دیگری حدس نمیزند:
scope،module،entryازmf-manifest.jsonخودِ بیلد خوانده میشوند، چون باندلر دربارهٔ آنها تصمیم میگیرد.@module-federation/viteاین فایل را تنها وقتی میسازد که باmanifest: trueپیکربندی شده باشد، که بهصورت پیشفرض خاموش است — پس هر کنترل پارسور آن را روشن میکند، و بستهساز اگر نبود حدس نمیزند.logicalName،displayName،description،substitutesForاز یک بلوکparswareدرpackage.jsonکنترل میآیند، چون باندلر هرگز نامی از هیچکدامشان نشنیده است.versionهمانversionآن فایل است.
آنچه عمداً غایب است
نه اسکوپ اعلامشدهای هست و نه جدول اعلامشدهای. یک آرتیفکت با دسترسیهای همان کسی اجرا میشود که از آن استفاده میکند (§۲۴)، پس فهرست اسکوپ روی آرتیفکت همیشه تنها میتوانست کاربرش را تنگتر کند، نه گشودهتر.
نشانی remote-entry هم نیست. بسته از نشانی خودِ پلتفرم و از مسیری سرو میشود که از محیط و نام منطقی محاسبه میشود، و همین است که به یک کنترل اجازه میدهد درون راهکارش جابهجا شود بهجای اینکه از میزبانی بیرونی گرفته شود.
پلتفرم چه چیزهایی را بررسی میکند
هنگام بارگذاری، پیش از ذخیرهٔ هر چیزی:
۱. آرشیو در محدودهٔ اندازهٔ فشرده است و یک zip خواندنی است؛
۲. بیش از تعداد پیکربندیشدهٔ فایل ندارد و بیش از مجموع پیکربندیشده باز نمیشود (هم هنگام
خواندن بررسی میشود و هم هنگام استخراج — طول اعلامشده در سرآیند یک zip، ادعایی است که
آرشیو دربارهٔ خودش میکند)؛
۳. مسیر هر ورودی نسبی و امن است — ..، مسیر ریشهدار، و پیشوند درایو یا UNC ویندوز رد
میشوند نه پاکسازی، چون آرشیوی که مسیری بیرون از پوشهٔ خودش را نام میبرد آرشیوی نیست
که بیصدا تعمیرش کنیم؛
۴. هر فایل پسوندی دارد که در فهرست مجاز سروِ پلتفرم است؛
۵. parsware.json در ریشه هست و با این شِما میخواند؛
۶. kind با نقطهٔ پایانی میخواند، و فایلی که entry نام میبرد واقعاً حاضر است.
مرتبط
- ساخت یک کنترل سفارشی — نوشتن و بستهسازی آن.
- ثبت یک کنترل سفارشی — بارگذاری بسته.
- مانیفست کنترل سفارشی — شکل ذخیرهشدهای که این مانیفست به آن تبدیل میشود.