assets-retry icon indicating copy to clipboard operation
assets-retry copied to clipboard

html内存在多个带defer的<script>,而且必须按顺序执行,若只挂了第一个script,retry插入的<script>执行顺序不正确

Open JRliu opened this issue 1 year ago • 7 comments

I'm submitting a...


[ ] Regression 
[ ] Bug report
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request

Current behavior

html内存在多个带defer的

Expected behavior

Minimal reproduction of the problem with instructions

What is the motivation / use case for changing the behavior?

Environment


Assets-retry version: X.Y.Z

 
For Tooling issues:
- Browser version: XX 
- Platform:  

Others:

JRliu avatar Mar 01 '24 07:03 JRliu

调整 script 标签插入的逻辑就好吧,retry 的 script 插入到加载失败的 script 后面一个节点

daiwawawa avatar Mar 12 '24 08:03 daiwawawa

调整 script 标签插入的逻辑就好吧,retry 的 script 插入到加载失败的 script 后面一个节点

试过了,这样没用。目前还没想到可行的方案,建议还是改成 async 或者动态加载,避免顺序依赖

Nikaple avatar Mar 14 '24 09:03 Nikaple

试过了,这样没用。目前还没想到可行的方案,建议还是改成 async 或者动态加载,避免顺序依赖

我最近想到一个逻辑,就是利用同步的 ajax 请求 js 代码,然后创建一个内联的 script 添加到失败的 js 后面,是可以实现 defer 脚本在失败重试后按顺序执行 image

daiwawawa avatar Mar 14 '24 09:03 daiwawawa

试过了,这样没用。目前还没想到可行的方案,建议还是改成 async 或者动态加载,避免顺序依赖

我最近想到一个逻辑,就是利用同步的 ajax 请求 js 代码,然后创建一个内联的 script 添加到失败的 js 后面,是可以实现 defer 脚本在失败重试后按顺序执行 image

这方案应该不可行,因为 error 事件触发的时候,已经解析了其他 script 标签了,顺序已经是乱了的。 我最后用了一个不太优雅的方案:重试成功后,将重试成功的域名保存到 sessionStorage,然后刷新页面;页面初始化时,尝试获取 sessionStorage 内重试成功的域名,有的话,通过 MutationObserver 监听 html 自带 script 标签的插入, 同步修改该 script 的 src

JRliu avatar Mar 28 '24 09:03 JRliu

试过了,这样没用。目前还没想到可行的方案,建议还是改成 async 或者动态加载,避免顺序依赖

我最近想到一个逻辑,就是利用同步的 ajax 请求 js 代码,然后创建一个内联的 script 添加到失败的 js 后面,是可以实现 defer 脚本在失败重试后按顺序执行 image

这方案应该不可行,因为 error 事件触发的时候,已经解析了其他 script 标签了,顺序已经是乱了的。 我最后用了一个不太优雅的方案:重试成功后,将重试成功的域名保存到 sessionStorage,然后刷新页面;页面初始化时,尝试获取 sessionStorage 内重试成功的域名,有的话,通过 MutationObserver 监听 html 自带 script 标签的插入, 同步修改该 script 的 src

我实际测试的时候顺序没乱呀,创建一个内联的 script 标签插入到失败的 js 后面,浏览器会优先执行这个内联的 js

daiwawawa avatar Mar 28 '24 11:03 daiwawawa

试过了,这样没用。目前还没想到可行的方案,建议还是改成 async 或者动态加载,避免顺序依赖

我最近想到一个逻辑,就是利用同步的 ajax 请求 js 代码,然后创建一个内联的 script 添加到失败的 js 后面,是可以实现 defer 脚本在失败重试后按顺序执行 image

这方案应该不可行,因为 error 事件触发的时候,已经解析了其他 script 标签了,顺序已经是乱了的。 我最后用了一个不太优雅的方案:重试成功后,将重试成功的域名保存到 sessionStorage,然后刷新页面;页面初始化时,尝试获取 sessionStorage 内重试成功的域名,有的话,通过 MutationObserver 监听 html 自带 script 标签的插入, 同步修改该 script 的 src

我实际测试的时候顺序没乱呀,创建一个内联的 script 标签插入到失败的 js 后面,浏览器会优先执行这个内联的 js

我想知道这个 retryScript 是什么时候执行的,写在什么地方

JRliu avatar Mar 29 '24 02:03 JRliu

@JRliu 就在 document.addEventListener('error', retryScript, true) 里面执行的

daiwawawa avatar Mar 29 '24 10:03 daiwawawa