动态加载脚本需遵循可控、可追踪、可销毁原则:通过URL缓存防重复;监听load/error并及时清理;设置async/defer控制执行;统一插入head;支持unload清理与降级fallback;推荐返回带cancel的Promise。
动态创建 script 标签并插入 DOM 是前端按需加载脚本的常用手段,但若不遵循规范,容易引发执行顺序错乱、重复加载、错误捕获缺失等问题。核心原则是:可控、可追踪、可销毁。
同一脚本多次插入会导致重复执行,尤其在模块被多次请求时。应维护一个全局缓存记录已加载的脚本 URL。
<script src="xxx"> 元素,或是否已在缓存中必须监听 load 和 error 事件,不能只依赖 onload 属性,且需及时清理监听器。
addEventListener 绑定事件,便于后续 removeEventListener 解绑load 回调中应触发业务逻辑(如 resolve Promise),error 中需 reject 并可选上报script 默认在插入点执行,但行为受 async / defer 属性影响,需明确意图。
async = true,保证非阻塞;若依赖执行顺序,改用 defer 或手动串行加载document.head,避免因插入位置不同导致 CSSOM/JS 执行时机差异document.body —— 页面未 ready 时 body 可能为 null,head 更可靠动态脚本应具备“可卸载”意识,尤其在 SPA 路由切换或组件销毁时。
unload() 方法移除标签并清空缓存项不复杂但容易忽略:每次创建都应有明确的加载标识、错误兜底和资源回收路径。写成函数时建议返回 Promise,并暴露 cancel 方法。