Merak设计思路
凡是能在编译完成的,不要交给运行时
其实最早,这个方案更像是garfish
中的esmloader
,是一个纯粹的运行时方案,先请求来js,在worker中编译,创建虚拟url
,然后挂载到页面。
但当我处理publicpath
的时候,发现base
标签动态更改不起效,也无法直接修正img
等元素的baseurl
,即使劫持诸如img
的src
等属性(无界就是这么做的),也不是一个好办法(因为有可能直接更改innerHtml
,除非你愿意在运行时中放入一个html
编译器)。
我发现最有效的仍是在子应用端设置publicpath
。
这个时候我就感觉,也许一味追求子应用无改造不是一个好选择,实际上也不可能:子应用中要么需要设置路由的base
,要么需要分辨是否为子应用,并执行对应的逻辑,如果遇上依赖库有某种bug,这种改造会更加繁琐。
我也许可以在编译处动点手脚,把子应用改造的多一点,让运行时少做一点
merak做了什么
编译时
merak
现在在编译端做了三件事,
- 把需要被隔离的变量,找出来并更改指向,
- 是把样式规则改为符合
shadowroot
的格式(root
tohost
), - 是找到
html
中script
,link
等的入口
如果要对merak
做自定义的改造,请沿袭这个思路,在编译时多动点手脚