loadScript
Load a given script.
Usage
js
import { loadScript } from '@studiometa/js-toolkit/utils';
const src = '/path/to/my/script.js';
const { event, element } = await loadScript(src);
if (event.type === 'error') {
console.log(`Failed to load ${src}: ${event.message}`);
} else {
console.log(`${src} has been loaded!`);
}
Parameters
src
(string
): the source URL to loadoptions
({ appendTo?: HTMLElement }
): configure the loader behavioroptions.appendTo
(HTMLElement
): append the created element to a DOM element, defaults todocument.head
as the script will not be loaded if its element is not attached to the DOM
Return value
Promise<{ event: Event, element: HTMLelement }>
: a promise resolving to an object containing both the load event object and the created element
Examples
Avoid loading the same script multiple times
You can combine the loadScript
function with the memo
function to add an in memory cache layer. This will make the generated function always return the same generated element.
js
import { loadScript, memo } from '@studiometa/js-toolkit';
const loadScriptWithCache = memo(loadScript);
const promise = loadScriptWithCache('script.js');
const promise2 = loadScriptWithCache('script.js');
console.assert(promise === promise2); // true
const [result, result2] = await Promise.all([promise, promise2]);
console.assert(result === result2);
Cache invalidation
Be aware that the memo
function will use a simple arguments.join('')
call to generate the cache key, thus ignoring any change in the options parameter of the loadScript
function.
js
const loadScriptWithCache = memo(loadScript);
const result = await loadScriptWithCache('script.js', { appendTo: document.head });
const result2 = await loadScriptWithCache('script.js', { appendTo: document.body });
console.assert(result === result2); // true
console.log(result.element.parentElement): // document.head
console.log(result2.element.parentElement): // document.head