第1部分
如果您在运行时生成 js,则无法进行捆绑(至少效率不高)。您必须为每个请求创建一个新的捆绑包,这不是非常快。另外,您将无法缓存常规的常量脚本包。
编辑:虽然捆绑服务器生成的 js 是不切实际的,但将值呈现到页面中的脚本标记中可以获得与捆绑相同的好处,更少的 HTTP 调用。有关更多信息,请参阅第 3 部分中的编辑。
然而,缩小服务器生成的 js 是完全可能的。这个问题应该有你要找的答案。但是,如果可能,我建议您将其缓存在服务器上,因为缩小过程本身可能比简单地发送额外的位要花费更长的时间。
第2部分
在大多数压缩器中,全局变量(window
对象上可访问的变量)在名称修改期间被跳过。同样,在该文件中未定义的其他文件中访问的变量不会被重命名。
例如,如果您有以下文件...
// outside of a closure, so globally accessible
var foo = 1;
function bar() {
// within a closure, and defined with `var`, not globally accessible
var bar;
// reference to variable declared in another file
baz = null;
}
它将被缩小如下(包含空格以提高可读性
var foo = 1;
function bar() {
var b;
baz = null;
}
这是始终使用var
关键字声明变量很重要的原因之一,否则它们被假定为对全局变量的引用并且不会被缩小。
此外,JSON(不是 Javascript 对象文字!!!)永远不会被压缩器扭曲,因为它由所有键的字符串文字和所有不属于其他文字类型的值组成。
第 3 部分
不错的方法,在我的工作中,我们确实使用了这种方法。不过,对于小文件或简单的配置值,我们已经过渡到在实际视图中使用 ASP.NET 在脚本标记中呈现服务器值。IE
默认.aspx
<script> window.globals = <%= JsonConvert.SerializeObject(new AppGlobals(currentUser)) %>; </script>
我们将其撕成代码,但前提是相同的。
编辑:
服务器生成的 JS(在它自己的 uri 中)
优点
缺点
在以下情况下使用:
您生成的文件很大,但对于多个用户来说很少更改或相同。这些脚本可以被视为与其他静态资产相同。举个例子,我们提供一个 js 文件,其中包含我们应用程序中的所有文本,用于本地化目的。我们可以根据用户设置中设置的语言提供不同的 js 文件,但是这些值在每次发布时最多只更改一次,因此我们可以设置积极的缓存头并在 uri 中使用哈希,以及查询字符串语言环境,利用浏览器缓存并为每个客户端下载每个语言文件一次。另外,如果这个文件对于每个访问相同 uri 的用户来说都是相同的,那么您可以将它缓存在 Web 服务器(IIS、Apache 等)上。
前任:/api/language.v1-0-0.js?locale=en
您的 js 独立于应用程序的其余部分,没有它不会延迟渲染。在这种情况下,您可以将async
属性添加到您的脚本标签中,该文件将被异步下载并在收到时执行,而不会阻止其他javascript的执行。
服务器渲染的 JS(在script
标签中的页面内)
优点
缺点
- 可以为您的 HTML 添加额外的权重,根据您的情况,可能无法缓存或缩小
在以下情况下使用:
- 你的价值观经常改变。除非您有大量值,否则添加到页面的权重应该可以忽略不计(在这种情况下,您可能会考虑将它们拆分并为这些值添加 API 端点,并且仅在需要时获取它们)。有了这个,您可以减少额外的 HTTP 调用,因为 js 被注入到用户已经必须检索的页面上的脚本标记中。
但...
不要浪费太多时间担心它。这两种方法的差异几乎总是可以忽略不计。如果它成为问题,请尝试两者并为您的情况使用更好的选择。