【前端】古法动态按需加载JavaScript(兼容非模块脚本)

这篇文章也可以在我的博客中阅读。

关于本文

  • 介绍非模块脚本(传统脚本)使用JavaScript动态载入的方法

概要

目前有许多动态按需载入JavaScript模块的方法,比如import和require,但许多老旧的JavaScript脚本由于涉及到全局变量的操作,不支持以模块的形式载入(会出现各种错误),如果需要在代码中动态载入某些老旧的非模块脚本,这个脚本可以助你一臂之力。

脚本特点

优点

  • 简短
  • 不需要安装第三方库
  • 兼容现阶段所有浏览器(除IE)
  • 异步加载
  • 支持多个备用链接(用途:CDN炸了可以回退到本地)

缺点

  • 不具备依赖项加载功能
  • 不检测加载的内容到底是不是JavaScript(错误的内容返回200也会被当做JavaScript)

脚本

主要是动态组织script元素,其中使用Promise对加载结果进行跟踪。

function jsLoader(urls, async = true, type = "text/javascript") {
    var load = (url) => {
        return () => new Promise((resolve, reject) => {
            const scriptEle = document.createElement("script");
            try {
                scriptEle.type = type;
                scriptEle.async = async;
                scriptEle.src = url;

                scriptEle.addEventListener("load", () => resolve());
                scriptEle.addEventListener("error", () => { console.log("fallback to next src..."); rejectHandler(); });

                document.body.appendChild(scriptEle);
            } catch (error) {
                rejectHandler(error);
            }

            var rejectHandler = (e) => {
                document.body.removeChild(scriptEle);
                reject(e);
            }
        });
    };

    return urls.reduce((p, url) => p.catch(load(url)), Promise.reject()).catch((e) => { console.log("oops, all src failed"); throw e; });
}

用法

示意

  • 传入存放备选src的数组(这里选的第1,2,4个链接都是无效的)
  • 可使用Promise语法对脚本进行控制
urls = ["https://wrong.page", "2", "https://cdn.jsdelivr.net/npm/activate-power-mode@1.0.0/dist/activate-pow1er-mode.min.js", "4"]
jsLoader(urls)
	.then(() => console.log("module loaded")) //加载成功
	.catch(() => { }); //出错

输出

  • 成功载入后,后面的链接不会再继续载入
  • 失败时会有log输出,不需要的可以注释掉
GET https://wrong.page/ net::ERR_CONNECTION_CLOSED
fallback to next src...
GET file:///H:/test/2 net::ERR_FILE_NOT_FOUND
fallback to next src...
module loaded
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值