انگولار - emitDecoratorMetadata و اهمیت آن در کد ترنسپایل شده
من کنجکاو هستم درباره اهمیت گزینه emitDecoratorMetadata در تبدیل TypeScript به JavaScript (در زمینه Angular 2). اگر آن را روی false تنظیم کنیم و متادیتا در کد خروجی گنجانده نشود، چه تأثیری خواهد داشت؟
پاسخ شماره ۱
اینجا، یک صحنهای است که هنگام خواندن با آن مواجه شدم...
تزریقکنندهها از متادیتایی که توسط کامپایلر تایپاسکریپت تولید میشود استفاده میکنند تا تعیین کنند چه نوع سرویسهایی توسط کامپوننت درخواست شده است. متادیتا اطلاعاتی در مورد تعداد و نوع پارامترهای اعلامشده در متدها ارائه میدهد.
سپس سیستم تزریق وابستگی میتواند به فرادادههای پارامتر سازنده نگاه کند تا مشخص کند چه نوعهایی را باید تزریق کند.
تمام اینها توسط گزینههای ویژه کامپایلر TypeScript که به نامهای
"emitDecoratorMetadata":true
که معمولاً در یک فایل tsconfig.json تنظیم میشود.
اگر emitDecoratorMetadata روی true تنظیم نشده باشد، Angular نمیتواند بفهمد که چه چیزی را باید در برنامه شما تزریق کند.
اگر برنامه خود را با Angular CLI ایجاد کنید، این گزینه به طور پیشفرض فعال است (مقدار آن true تنظیم شده است).
فراداده فقط در صورتی برای یک سرویس یا یک کامپوننت منتشر میشود که کلاس دارای یک دکوراتور باشد. این که کدام دکوراتور باشد مهم نیست. هر دکوراتوری باعث انتشار فراداده میشود. به همین دلیل است که ما دکوراتور Injectable() را به سرویسها اضافه میکنیم و نیازی به اضافه کردن آن به کامپوننتها نداریم زیرا آنها از قبل دکوراتور کامپوننت را دارند.
بنابراین، سیستم تزریق تعیین میکند که چه نوعی باید به سازنده مؤلفه تزریق شود.
پاسخ شماره ۲
متادیتای دکوریتور در صورتی لازم است که بخواهید در زمان اجرا بر متادیتا انعکاس داشته باشید.
اگر شما این کار را انجام ندهید، برای مثال با Reflect.metadata، عدم گنجاندن خروجی تأثیری ندارد. به طور پیشفرض، emitDecoratorMetadata برابر با false است. دکوریتورها همچنان کار میکنند، اما اطلاعات زمان طراحی در زمان اجرا در دسترس نیست.
