Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
JRliu opened this issue Mar 1, 2024 · 7 comments

Comments

@JRliu
Copy link

JRliu commented Mar 1, 2024

I'm submitting a...


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

Current behavior

html内存在多个带defer的<script>,而且必须按顺序执行,若只挂了第一个script,retry插入的<script>执行顺序不正确。我清楚问题原因,但是没有好的方案。有什么好的解决办法吗?

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:

@daiwawawa
Copy link

daiwawawa commented Mar 12, 2024

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

@Nikaple
Copy link
Owner

Nikaple commented Mar 14, 2024

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

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

@daiwawawa
Copy link

daiwawawa commented Mar 14, 2024

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

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

@JRliu
Copy link
Author

JRliu commented Mar 28, 2024

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

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

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

@daiwawawa
Copy link

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

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

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

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

@JRliu
Copy link
Author

JRliu commented Mar 29, 2024

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

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

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

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

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

@daiwawawa
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants