MoegirlPediaInterfaceAdmins / MoegirlPediaInterfaceCodes

萌娘百科界面代码库
https://zh.moegirl.org.cn/MGP:Interface-admin
37 stars 13 forks source link

有关引入polyfills的问题 #405

Closed AnYiEE closed 8 months ago

AnYiEE commented 8 months ago

现在页面上加载各种垫片是由Gadget-libPolyfill.js为页面追加async script标签实现的(如果我没理解错的话)

那么我有个问题希望哪位可以指点一下:

假设某脚本用到了Array.isArray这个方法,当前浏览器环境也需要这个垫片。当网络垫片晚于此脚本执行,是不是就可以说有没有垫片都一样。

BearBin1215 commented 8 months ago

Gadget-libPolyfill.js为gadgets-definition提供一个可用的依赖项ext.gadget.libPolyfill,在对应小工具的定义中添加此依赖项可以确保工具加载此依赖(如Navigation popups

我不是很确定是否正确理解了你的问题,不知道这是不是你需要的答案?

AnYiEE commented 8 months ago

@BearBin1215 您可能没有太理解。

我问的是,由Gadget-libPolyfill.js添加到页面中的script标签所发出的网络请求,如何保证响应中脚本的执行时间不晚于其他脚本的执行时机。

还有就是,依赖项的意思只是先执行这个依赖,而不会等里面的东西加载完,更不要说是额外的网络请求。

AnnAngela commented 8 months ago

如果有强依赖需求的话可以通过 polyfillPromise 实现

AnYiEE commented 8 months ago

如果有强依赖需求的话可以通过 polyfillPromise 实现

但是搜索后库中没有任何一个脚本用到了polyfillPromise。这么说来,现在polyfills的加载与否都是随缘的?那polyfills的意义何在。

AnnAngela commented 8 months ago

如果有强依赖需求的话可以通过 polyfillPromise 实现

但是搜索后库中没有任何一个脚本用到了polyfillPromise。这么说来,现在polyfills的加载与否都是随缘的?那polyfills的意义何在。

主要还是这个事项优先级不高,本来有个读取polyfill文件保存到repo里的计划一直没做

AnYiEE commented 8 months ago

读取polyfill文件保存到repo里

这样也不一定能确保需要polyfill的方法在执行之前被填充,因为依赖项只是定义加载的先后,不保证内部具体的执行情况。所以最靠谱的方式就是把某个脚本用到的polyfills放在它自己的顶部,这样才能确保线性的执行顺序。

萌娘的MediaWiki版本低了些,要不然通过require()就可以把全部脚本用到的polyfills保存到某个文件里供其他脚本引用了,这样也是线性的。

就目前的情况来说,对显式设置script.async = false能略微改善前述问题。

AnnAngela commented 8 months ago

读取polyfill文件保存到repo里

这样也不一定能确保需要polyfill的方法在执行之前被填充,因为依赖项只是定义加载的先后,不保证内部具体的执行情况。所以最靠谱的方式就是把某个脚本用到的polyfills放在它自己的顶部,这样才能确保线性的执行顺序。

萌娘的MediaWiki版本低了些,要不然通过require()就可以把全部脚本用到的polyfills保存到某个文件里供其他脚本引用了,这样也是线性的。

就目前的情况来说,对显式设置script.async = false能略微改善前述问题。

只要是同步代码就能保证线性

AnYiEE commented 8 months ago

@AnnAngela 话说,里面缺一句document.head.append(script)吧。只创建元素不向DOM加,浏览器也不会去下载脚本。考虑到这段代码可能被多次执行,可以给script标签定义一个id并添加相关判断。