loadScript
یک <script> را پویا درج میکند و از روی محتوا تکرار را میگیرد.
تفاوتش با scriptOnLoad: آن یکی دستهای از نشانیها را یکجا بار میکند (و .css را از راه تگ <link> میفرستد)، ولی این یکی یک اسکریپت را میرساند، بدنهٔ درونخطی را هم میپذیرد و تضمین میکند که یک اسکریپت تنها یک بار ارزیابی شود — دو بار درج کردن SDK بیرونی معمولاً یعنی اثرهای جانبی راهاندازیاش هم دو بار اجرا شدهاند.
کلید تشخیص تکرار، md5 از type + content است، پس یک نشانی و اسکریپتی درونخطی با همان نام با هم اشتباه نمیشوند.
کاربرد
import { loadScript } from 'ranuts/utils';
// اسکریپت بیرونی
await loadScript({ type: 'url', content: 'https://cdn.example.com/sdk.js' });
// اسکریپت درونخطی
await loadScript({ type: 'content', content: 'window.__ready = true;' });
// فراخوانی دوم کاری نمیکند — پیشتر ارزیابی شده است
await loadScript({ type: 'url', content: 'https://cdn.example.com/sdk.js' });API
loadScript
پارامترها
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
type | 'url' از راه src بار میکند؛ 'content' متن اسکریپت را درونخط میگذارد | 'url' | 'content' | الزامی |
content | اگر type برابر 'url' باشد نشانی، و اگر 'content' باشد بدنهٔ اسکریپت | string | الزامی |
بازگشت
| آرگومان | توضیح | نوع |
|---|---|---|
promise | پس از ارزیابی با { success: true } برآورده میشود | Promise<{ success: boolean }> |
اگر بارگذاری اسکریپت بیرونی شکست بخورد، با { success: false, error } رد میشود.
یادداشتها
اسکریپت درونخطی همان دم که افزوده میشود همگام ارزیابی میشود و پس از آن هرگز رویداد load نمیفرستد. اگر تنها چشمبهراه onload بمانیم، در مرورگر واقعی Promise تا ابد در انتظار میماند؛ از این رو برای type: 'content' این تابع بهمحض بازگشتِ append برآورده میشود. (jsdom برای اسکریپتهای درونخطی رویداد load را میفرستد، و به همین سبب آزمون واحد این تفاوت را نمیگیرد.)