因为我在工程师身边工作了这么多年,我知道如果我不提供上下文,我只会得到一百个类似“你想完成什么?”的答案。我将给出激发我的问题的背景。但是不要混淆我所问问题的背景上下文,它与使对象代码在 padge 请求之间不可缓存的 JavaScript 语义特别相关。我不会对如何使我的 webapp 更快的建议打分。这与我的问题完全无关,我的问题可能只有从事 JavaScript 编译器或至少是动态语言编译器工作的人才能回答。
背景:
我正在尝试提高网络应用程序的性能。在众多资源中,它包含一个巨大的 JavaScript 文件,包含 40k 行和 130 万个预压缩字符。缩小后它仍然很大,并且在同步加载时它仍然会向 window.onload 事件增加大约 100 毫秒,即使源缓存在客户端也是如此。 (我通过查看请求日志并观察到它没有被请求,最终排除了资源没有被缓存的可能性。)
在确认缓存后还是很慢之后,我开始研究各大浏览器的JavaScript缓存,了解到它们都没有缓存对象代码。
我的问题是以基于这项研究的一些假设断言的形式提出的。如果它们是错误的,请反对这些断言。
JavaScript 目标代码不会缓存在任何现代浏览器中。
“目标代码”可以表示从表示简单线性化解析树的字节代码一直到 native machine code 的任何内容。 .
Web 浏览器中的 JavaScript 对象代码很难缓存。
换句话说,即使您在外部标记中包含缓存的 JS 源文件,在页面上包含该脚本也会产生线性成本,即使该脚本仅包含函数定义,因为所有该源代码需要编译成目标代码。
JavaScript 对象代码很难缓存,因为 JS 源代码必须经过评估才能被编译。
语句能够以难以静态分析的动态方式影响下游语句的编译。
3a。 (3) 之所以成立,主要是因为 eval()。
求值会对 DOM 产生副作用。
因此,需要在每次页面请求时编译 JavaScript 源代码。
额外的问题:是否有任何现代浏览器为缓存的 JS 源文件缓存解析树?如果不是,为什么不呢?
编辑:如果所有这些断言都是正确的,那么我会给任何可以解释为什么他们是正确的的人提供答案,例如,通过提供一个 JS 代码示例,不作为目标代码缓存,然后解释为什么不缓存。
我很欣赏关于如何从这里开始让我的应用程序更快的建议,我基本同意他们的意见。但我试图填补的知识空白与 JS 对象代码缓存有关。
最佳答案
你是对的,因为它是动态编译和评估的。
你是对的,它一定是。
您的办法不是试图缩短编译时间。
它需要从一开始就减少加载,做最少的事情来让用户体验可见,然后做最少的事情以模块化的方式添加核心功能,然后懒惰地(在计时器上,或按要求)由最终用户)加载额外的特性、功能和繁荣。
如果您的程序有 10,000 行过程代码,那么您就有问题了。
我希望这不是所有程序。
所以分手吧。这意味着第一页加载速度较慢。但在后续请求中,就用户认为“正在运行”而言,这可能意味着更快的响应时间,尽管需要更长的时间才能达到 100% 的功能。
这完全是关于用户对“速度”和“响应能力”的看法,而不是关于达到 100% 功能的最短路线。
单线程格式的 JavaScript 不能既又响应。
所以首先要有响应。
PS:添加 Bootstrap 。一个智能 Bootstrap 。
它应该能够辨别需要哪些功能。
RequireJS 用于加载依赖。
不是为了弄清楚您的依赖项是什么。
一个额外的好处——您可以在 Bootstrap 上设置一个短期缓存,它将指向版本化的模块。 这有什么好处?好吧,如果您需要更新模块,在 Bootstrap 中更新版本是一个简单的过程。当 bootstrap 的缓存过期时,它指向新的模块,它可以有无限的生命周期(因为它有一个不同的名字——版本化或时间戳);
关于JavaScript 对象代码缓存 : which of these assertions are wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497995/