【问题标题】:grails specifying javascript librarygrails 指定 javascript 库
【发布时间】:2012-04-12 13:17:44
【问题描述】:

在我的 grails 应用程序中,我们使用 jquery。我在必要的页面上包含 jquery

<g:javascript library="jquery"/>

如果我们决定更改 javascript 库,我需要更新每个页面。我知道我可以在布局中包含它,但并不是每个页面都需要该库,所以这似乎很浪费。

在 grails 中是否有一种典型的方法可以在一个地方指定默认的 javascript 库应该是什么,然后只包含该默认库而不在每个页面上指定它是 jquery(或其他任何内容)?

【问题讨论】:

  • 如果用户访问了任何需要它的页面,他们不会已经缓存了 jQuery 吗? IE。即使您将其放在主布局中(因此,在每个页面上都包括它),它也不会增加太多的页面重量。只是一个想法。

标签: javascript grails configuration


【解决方案1】:

由于大多数浏览器会大量缓存 JavaScript 库之类的内容,因此将库 include 放入布局可能比将其放入每个单独的页面中更好。浏览器执行的大量缓存意味着用户只会为整个站点(或至少是他们的浏览会话)从服务器加载库一次,并且通过在布局中处理它,您将大大减少维护负载(您暗示)

一般来说,您的 JavaScript 库应该是高度缓存的,并且在许多情况下,最好从使用率很高的 CDN 中提取它们,例如 Google's。只有当 CDN 提供商出现故障并且浏览器无法访问他们的库时,才应该请求您的“本地”(即来自您的服务器)库。 (看看HTML5Boilerplate project 是如何做到的)

因此,我不会担心将库放入布局页面会产生非常最小的性能损失。即使你没有为你的库使用一个使用良好的 CDN,人们今天实际使用的任何浏览器也只会加载你的 JavaScript 库一次(它获得的第一个页面包含它),其余的只会使用它的缓存副本您网站上的网页。

所以,简而言之,放在布局页面中就不用担心了。它只会在第一个页面加载时被请求,并且将来自所有后续加载的缓存,并且您的代码库将是 DRYer。

【讨论】:

  • 如果我愿意,有没有办法告诉 grails 使用 google 版本的 jquery?
  • &lt;g:javascript&gt; 标签本身并没有让您指定要使用的特定库版本,但该标签利用resources 插件来完成繁重的工作并且那个 插件可以让你准确控制加载的内容。
【解决方案2】:

您还可以创建一个外部 JS 文件来选择性地加载您指定的文件。像这样的:

//FILENAME: jselector.js
if ( [conditions] ) {
  var fileref=document.createElement('script');
  fileref.setAttribute("type","text/javascript");
  fileref.setAttribute("src", filename); //reference your Jquery file here
  document.getElementsByTagName("head")[0].appendChild(fileref);
}

然后在每个需要它的页面中添加对这个文件 (jselector.js) 的引用。

<script type="text/javascript" src="jselector.js"></script>

如果你的 jQuery 文件发生变化,你更新这个外部 JS (jselector.js),所有页面都会自动指向新的 jQuery。

【讨论】:

  • 以这种方式包含 JS 的问题是您会产生轻微的加载时间损失,因为 JS 解析器必须先处理此文件才能加载额外的脚本,而您还有一个由于意外缓存而可能导致奇怪行为的事情。对于像 jQuery 库这样核心的东西,我会说最好以“正常”的方式包含它。
  • 我同意你。这就是我在上面的评论中提到它的原因。但由于这并不能直接回答提问者的问题,我想提供一个答案,除了我认为在所有页面布局中使用它不会产生太大影响之外。但我依赖于我的应用程序中的缓存方法。
  • @Marc,感谢您的回复。你回答了这个问题,但似乎我认为将它放在布局中是一个坏主意实际上是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多