-
Notifications
You must be signed in to change notification settings - Fork 2k
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
[RFC] qiankun的极致性能优化思路,与import-html-entry有关 #1555
Comments
不知道angular使用qiankun框架之后,导致性能极具下降也是此原因? 脏值检查直接卡爆浏览器。。。 |
我没用过angular,不过一般性能下降都是因为进行了DOM操作(说明渲染页面了)。 |
最简单的方式就是直接删除import-html-entry的getExecutableScript方法的with(window)。 |
👍 |
其实我不太理解不用 with 性能更好,为啥这里要用 with,有大神能指点下吗? |
其实我也不清楚,但是with关键字的作用在于改变作用域。强制所有子应用的js的作用域都是同一作用域。 |
理解到一点,就是所有查找的时候都去 window 查找一下,这样都会走 proxyWindow 代理,比如 document |
angular为基座子应用也是angular程序,卸载子应用时报错,parentNode is undefined. |
大佬有没有完整的例子,能否借阅下 |
https://gitee.com/kawhi66/test/tree/master/[email protected] |
很抱歉,我不会angular程序 |
方案不错,官方团队目前还没有做优化工作,自己的团队根据这个方案优化完一波估计以后官网更新后无法同步了。 |
这只是个另类的优化方法,官网更新之后把这些移除就可以了,并不会影响到官方优化。 |
mark |
4 similar comments
mark |
mark |
mark |
mark |
请问怎么解决的? |
1,关闭代理 |
我理解的with是将最后一个参数作为作用域,其他参数还是在上一层作用域中,可以通过引用访问,并不是类似Object.assign形式 |
哈哈,尴尬了,当初还没深入了解with,就举了个大概的例子,,, |
with 是为了解决一些变量逃出沙箱的场景,例如, 子应用有一个全局变量 |
主要是为了 document, location 去 proxy window 上找,这样就可以使用自定义的 document window。 但是 with 的问题就是会阻止代码执行时候的优化。 |
released v2.8.0,通过 |
execScriptInSandbox(script: string): void { |
createProxySandbox(injection?: object) {
|
借 issue 补充下,2.8 新增 speedy 属性后,嵌套子应用的场景下,由于 document 被代理会导致卡顿,如果遇到这个问题可以尝试下这种解法: 在 ./src/sandbox/proxySandbox.ts 中移除 accessingSpiedGlobals 的 |
背景
大概从 [email protected] 以后,以 proxySandbox 作为默认的沙盒,并且默认开启 strickGlobal 特性,基于 with 语句执行子应用脚本。我们的测试结果显示,在这种模式下,单纯的脚本执行性能还可以,但是一旦涉及到操作 DOM 时,性能就会严重下降,大概会差 10 倍以上。
当前我们的项目中使用react+antd技术栈,由于是B端项目,存在大量的antd组件,而antd组件会生成大量的dom节点,从而导致渲染慢,性能很差。
可以发现性能损失主要来源于以下两点:
qiankun 版本
以[email protected] 以后为主,之前的版本没测试,应该也能使用,但思路都是一致的。
最小可复现仓库
可使用#1175提供的仓库 https://gitee.com/kawhi66/test/tree/master/[email protected]
思路
一个想法,既然沙盒可以提供独立的 window 实例,是否也应该提供独立的 document 实例 ?
将import-html-entry的getExecutableScript方法中的
with(window)
改成with(window, window.document)
但是官方不使用此方法的原因主要是:
with(window, document)
with(window, document)
的属性冲突问题。。。;(function(window, self){with(window, window.document){;${execScripts}\n${scriptText}\n${sourceUrl}}}).bind(window.proxy)(window.proxy, window.proxy);
**qiankun极致性能优化:**将重写的getExecutableScript方法中的with(window, window.document){}删除
总结
The text was updated successfully, but these errors were encountered: