loadScript.js

import { __assign, __rest } from "tslib";
import { objectKeys } from './utils/native';
/**
 * 加载 js 文件。
 *
 * <em style="font-weight: bold;">注意:该方法仅适用于浏览器端。</em>
 *
 * @static
 * @alias module:Other.loadScript
 * @since 4.19.0
 * @param {string} src  js 地址。
 * @param {Object} [options] script 标签属性。比如 `defer` `onload` `onerror` `id` 等,下面列举部分带有默认值或额外扩展的配置。
 * @param {boolean} [options.destroyOnError=true] 如果加载失败或错误,自动删除 dom 中的 script 标签。
 * @param {Object} [options.attrs] 自定义 script 属性,通过 script.setAttribute 设置。
 * @param {boolean} [options.async=true] 异步加载。
 * @param {string} [options.type='text/javascript'] 类型。
 * @return {Promise<HTMLScriptElement>} 异步返回 script 元素。
 * @example
 *
 * loadScript('some.js').then(script=>{
 *   // do something
 * })
 *
 * loadScript('some.js', { id: 'xxx', async: false, attrs: { foo: 'bar' } }).then(script=>{
 *   // do something
 * })
 *
 */
function loadScript(src, options) {
    return new Promise(function (resolve, reject) {
        var head = document.head;
        var script = document.createElement('script');
        var _a = options || {}, attrs = _a.attrs, _b = _a.destroyOnError, destroyOnError = _b === void 0 ? true : _b, restOptions = __rest(_a, ["attrs", "destroyOnError"]);
        var props = __assign(__assign({ async: true, type: 'text/javascript' }, restOptions), { src: src });
        for (var key in props) {
            if (key === 'onload' || key === 'onerror') {
                continue;
            }
            // @ts-ignore
            script[key] = props[key];
        }
        if (typeof attrs === 'object') {
            objectKeys(attrs).forEach(function (key) {
                script.setAttribute(key, attrs[key]);
            });
        }
        script.onload = function (ev) {
            var _a;
            this.onerror = this.onload = null;
            (_a = props.onload) === null || _a === void 0 ? void 0 : _a.call(this, ev);
            resolve(script);
        };
        script.onerror = function (ev) {
            var _a;
            this.onerror = this.onload = null;
            (_a = props.onerror) === null || _a === void 0 ? void 0 : _a.call(this, ev);
            if (destroyOnError) {
                head.removeChild(script);
            }
            reject(new URIError('Failed to load ' + this.src));
        };
        head.appendChild(script);
    });
}
export default loadScript;