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