grails指定javascript库

grails指定javascript库,javascript,grails,configuration,Javascript,Grails,Configuration,在我的grails应用程序中,我们使用jquery。我将jquery包含在必要的页面上 <g:javascript library="jquery"/> 如果我们决定更改javascript库,我需要更新每个页面。我知道我可以在布局中包含这一点,但并非每页都需要库,因此这似乎是浪费 grails中有没有一种典型的方法,在一个地方指定默认javascript库应该是什么,然后只包含默认javascript库,而不指定它是jquery或在每个页面上是什么?因为大多数浏览器都会大量缓存j

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

<g:javascript library="jquery"/>
如果我们决定更改javascript库,我需要更新每个页面。我知道我可以在布局中包含这一点,但并非每页都需要库,因此这似乎是浪费


grails中有没有一种典型的方法,在一个地方指定默认javascript库应该是什么,然后只包含默认javascript库,而不指定它是jquery或在每个页面上是什么?

因为大多数浏览器都会大量缓存javascript库之类的东西,将库include放入布局可能比将其放入每个单独的页面要好。浏览器所做的大量缓存意味着用户只会为整个站点或至少他们的浏览会话从服务器加载库一次,通过在布局中处理它,您将大大减少您提到的维护负载

一般来说,JavaScript库应该被高度缓存,在许多情况下,最好从一个高度使用的CDN中提取它们,如。只有当CDN提供程序关闭且浏览器无法访问其库时,才会请求您的服务器库中的本地ie。请看一看如何做到这一点

正因为如此,我不必担心将库放入布局页面会带来的最小性能影响。即使你没有为你的库使用一个使用良好的CDN,今天人们实际使用的任何浏览器都只会在它获得包含它的第一个页面时加载你的JavaScript库,并且只会在你站点上的其余页面使用它的缓存副本


所以,简而言之,把它放在布局页面上,不用担心。它只会在第一次页面加载时被请求,并且会在所有后续加载时从缓存中获取,您的代码库将变得更加干燥。

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

一般来说,JavaScript库应该被高度缓存,在许多情况下,最好从一个高度使用的CDN中提取它们,如。只有当CDN提供程序关闭且浏览器无法访问其库时,才会请求您的服务器库中的本地ie。请看一看如何做到这一点

正因为如此,我不必担心将库放入布局页面会带来的最小性能影响。即使你没有为你的库使用一个使用良好的CDN,今天人们实际使用的任何浏览器都只会在它获得包含它的第一个页面时加载你的JavaScript库,并且只会在你站点上的其余页面使用它的缓存副本


所以,简而言之,把它放在布局页面上,不用担心。它将只在第一次页面加载时被请求,并且将从缓存中获取所有后续加载,并且您的代码库将被删除。

您还可以创建一个外部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文件,有选择地加载指定的文件。大概是这样的:

//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。

如果用户访问了您需要jQuery的任何页面,他们是否已经缓存了jQuery?也就是说,即使你把它放在主版面中,也不会增加太多的页面重量,包括在每一页上。只是想一想。如果用户访问了您的任何需要jQuery的页面,他们不会已经缓存了jQuery吗?也就是说,即使你把它放在主版面中,也不会增加太多的页面重量,包括在每一页上。我只是想一想。如果我想让grails使用google版本的jquery,有没有办法告诉我?标记本身并没有提供任何方法来指定要使用的特定库版本,但是该标记利用插件来完成繁重的工作,该插件将让您精确地控制加载的内容。如果我愿意,有没有办法告诉grails使用google版本的jquery?该标记本身没有提供任何方法来指定要使用的特定库版本,但该标记利用插件来完成
繁重的工作和插件将让你精确地控制加载的内容。以这种方式包含JS的问题是,你会受到轻微的加载时间惩罚,因为JS解析器必须先处理这个文件,然后才能加载额外的脚本,而且你还有一件事会由于意外的缓存而导致奇怪的行为。对于像jQuery库这样的核心,我想说最好是以正常的方式包含它。这就是我在上面的评论中提到它的原因。但由于这并不能直接回答提问者的问题,我想提供一个答案,补充我的观点,即在所有页面布局中使用它不会有太大的区别。但我在应用程序中依赖缓存方法。@Marc,谢谢你的回复。你回答了这个问题,但似乎我认为把它放在布局中是个坏主意实际上是不正确的。以这种方式包含JS的问题是,你会受到轻微的加载时间惩罚,因为JS解析器必须先处理这个文件,然后才能加载额外的脚本,还有一件事可能会由于意外的缓存而导致奇怪的行为。对于像jQuery库这样的核心,我想说最好是以正常的方式包含它。这就是我在上面的评论中提到它的原因。但由于这并不能直接回答提问者的问题,我想提供一个答案,补充我的观点,即在所有页面布局中使用它不会有太大的区别。但我在应用程序中依赖缓存方法。@Marc,谢谢你的回复。你回答了这个问题,但似乎我认为把它放在布局中是个坏主意,实际上是不正确的。