-
Notifications
You must be signed in to change notification settings - Fork 2.7k
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
fix(preset-umi): modifyHTML hook oom in large static site app #12215
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎ 1 Ignored Deployment
|
Size Change: +64 B (0%) Total Size: 9.9 MB
ℹ️ View Unchanged
|
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #12215 +/- ##
=======================================
Coverage 28.41% 28.41%
=======================================
Files 492 492
Lines 15156 15156
Branches 3620 3620
=======================================
Hits 4306 4306
Misses 10078 10078
Partials 772 772 ☔ View full report in Codecov by Sentry. |
用这个 api 的人应该不多,但我理解应该都集中在以下几种情况:
以上这些情况,我理解是目前为止在 issue 中知道这个 api 的人大部分会做的操作,建议加一个 example 或者测试的文件,看看结果有没有问题。 |
这几种情况试了下是正常的,只要 AST 中这些被操作的元素都在,cheerio 提供的 API 应该就不受影响 |
umi4取消了document.ejs可真是太麻烦了, 无奈只能放弃升级umi4, 感觉还是有document.ejs更方便定制 |
修复在大型静态站点应用(比如 antd 官网)中,开启
exportStatic
可能导致modifyHTML
钩子 OOM 的问题,原因是 cheerio 默认使用 parse5 作为 HTML 解析器,但在动辄一两百个页面的静态站点应用中 parse5 很容易消耗过量内存导致 OOM,解决方案是将 cheerio 的 HTML 解析器切换为内存开销更小的htmlparser2
。为什么之前 antd 官网没出现 OOM?推测是由于子路由资源预加载方案 #12095 追加了一个 inline script,且站点越大它的尺寸会越大,这成了 OOM 的导火索。
切换 HTML 解析器有什么副作用?此前 cheerio 切换默认解析器是为了解一系列的问题,详见 cheeriojs/cheerio#985 但其中属于缺陷的问题在 htmlparser2 中已经修复,其他已知副作用对 Umi 的场景应该不受影响:
<html><head></head><body></body></html>
table
中的tbody
、tr
等<div><=</div>
会原样输出(现代浏览器会正确处理<
)<ul>1<ul>2<ul>
会变成嵌套而不是并集