因为我在工程师身边工作了这么多年,我知道如果我不提供上下文,我只会得到一百个“你想完成什么?”形式的答案。我将给出激发我的问题的背景。但不要混淆我所问问题的背景上下文,这与使对象代码在 padge 请求之间无法缓存的 JavaScript 语义特别相关。我不会给关于如何让我的 webapp 更快的建议打分。这与我的问题完全相切,这可能只有从事过 JavaScript 编译器或至少是动态语言编译器的人才能回答。
背景:
我正在尝试提高 Web 应用程序的性能。在它的众多资源中,它包含一个巨大的 JavaScript 文件,它有 40k 行和 130 万个预压缩字符。缩小后它仍然很大,并且在同步加载时它仍然增加了大约 100ms 到 window.onload 事件,即使源被缓存在客户端也是如此。(通过查看请求日志并观察它没有被请求,我已经最终排除了资源没有被缓存的可能性。)
在确认缓存后仍然很慢后,我开始研究主流浏览器中的JavaScript缓存,并了解到它们都没有缓存目标代码。
我的问题是基于这项研究的一些假设性断言的形式。如果这些断言是错误的,请反对。
JavaScript 对象代码不会缓存在任何现代浏览器中。
“对象代码”可以指任何东西,从表示简单线性化分析树的字节代码一直到本机机器代码。
Web 浏览器中的 JavaScript 对象代码很难缓存。
换句话说,即使您在外部标记中包含缓存的 JS 源文件,在页面上包含该脚本也会产生线性成本,即使该脚本仅包含函数定义,因为所有该源都需要被编译成目标代码。
JavaScript 对象代码很难缓存,因为必须评估 JS 源代码才能编译。
语句有能力以难以静态分析的动态方式影响下游语句的编译。
3a。(3) 是正确的,主要是因为 eval()。
评估会对 DOM 产生副作用。
因此,需要在每个页面请求上编译 JavaScript 源代码。
额外的问题:任何现代浏览器是否为缓存的 JS 源文件缓存解析树?如果不是,为什么不呢?
编辑:如果所有这些断言都是正确的,那么我会给任何可以解释为什么它们是正确的人的答案,例如,通过提供一个无法缓存为目标代码的 JS 代码示例,然后解释原因不是。
我很欣赏有关如何从这里开始以使我的应用程序更快的建议,我大多同意他们的看法。但我试图填补的知识空白与 JS 对象代码缓存有关。