Skip to content

loadScript

یک <script> را پویا درج می‌کند و از روی محتوا تکرار را می‌گیرد.

تفاوتش با scriptOnLoad: آن یکی دسته‌ای از نشانی‌ها را یکجا بار می‌کند (و .css را از راه تگ <link> می‌فرستد)، ولی این یکی یک اسکریپت را می‌رساند، بدنهٔ درون‌خطی را هم می‌پذیرد و تضمین می‌کند که یک اسکریپت تنها یک بار ارزیابی شود — دو بار درج کردن SDK بیرونی معمولاً یعنی اثرهای جانبی راه‌اندازی‌اش هم دو بار اجرا شده‌اند.

کلید تشخیص تکرار، md5 از type + content است، پس یک نشانی و اسکریپتی درون‌خطی با همان نام با هم اشتباه نمی‌شوند.

کاربرد

ts
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 را می‌فرستد، و به همین سبب آزمون واحد این تفاوت را نمی‌گیرد.)

منتشرشده تحت مجوز MIT.