在本地托管jQuery的好处与陷阱[关闭]


85

我们目前正在从Google CDN中提取jQuery和jQueryUI(以及jQueryUI CSS)库。我喜欢这样,因为我可以打电话,google.load("jquery", "1");
并且将使用最新的jQuery1.xx。

现在我出于安全考虑将库拉到本地。

我很高兴将它们拉到本地,但我想知道还有哪些其他好处和陷阱值得关注?


5
我们在谈论什么安全问题?
Ascherer 2010年

我没问 我猜想它不是那么安全,而是试图通过对gmail等进行防火墙控制来控制带宽
。– orolo

Answers:


109

将它们放在CDN上的主要好处是,可以与从您自己的网站下载的文件并行下载文件。这样可以减少每个页面上的延迟。因此,另一方面是托管本地延迟增加的陷阱。这样做的主要原因是,浏览器可以同时建立与同一Web域的连接数量受到限制。在IE6中,默认情况下这是到同一个域的2个并发连接-在IE的所有打开的窗口之间共享!在IE8 +中,它得到了改进,默认为6,与FF / Chrome内联,但是,如果您有很多图像并且没有使用精灵,则将遇到大量延迟。

使用CDN,我总是显式设置库版本,而不是获取最新版本。这样可以减少新版本破坏代码的风险。jQuery不太可能,但是可能。

使用CDN的另一个主要好处是减少了网站流量。如果按GB付费或位于资源有限的虚拟服务器上,则将某些内容租用到公共CDN时,可能会发现总体站点性能提高,托管成本降低。

确保您还阅读了@Xaver对此问题的其他答案。这是一个很好的把戏


5
显式设置库版本的另一个好处是Google为其提供了更长的缓存时间,例如,指定1.9.1会比仅请求1.9给出更长的缓存寿命(因为可能会发布新的jQuery 1.9版本,但始终会发布1.9.1)相同)。
巴里2013年

-revaxarts吗?我看不到这样的答案,无论是当前的还是删除的。什么是“很好的把戏”?
ashleedawg

144

我一直使用Google的CDN(内容交付网络)。但以防万一它离线:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="jquery-1.4.2.min.js"><\/script>')</script>

抓取Google CDN的jQuery,并在必要时回退到本地

编辑:如果您不需要支持IE6,并且您的站点使用了部分https,则也可以删除http:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>


24
XVIDEOS现在使用此解决方案:P
牧岛寿吾(Shougo Makishima),2015年

我必须在这里遗漏一些东西...这种方法是否假定CDN加载的jQuery将在解释下一行(!window.jQuery...)之前加载并被解释?<script>标签是异步处理的,对吧?
rinogo

2
<script>标签被同步处理!在第二行中,必须已经加载了jQuery,但以防万一,如果我们没有注入JS,则它将在本地加载。document.write如果jQuery已经存在,将永远不会执行。
Xaver

24

其他人已经涵盖了好处。陷阱:

  • 如果仅包含来自您自己的服务器的内容,则该服务器需要运行-并且不受防火墙等的阻止-才能使站点正常工作。从第三方提取脚本,现在这两个服务器需要运行且不受阻塞才能使您的站点正常工作。

  • <script>从中拉出的任何站点都可以完全控制用户在您站点上的体验。如果Google感到邪恶,他们可以在jQuery副本中放一些东西来记录您的按键,从正在访问的页面中窃取个人信息以绑定到其网络跟踪数据库中,让您发布“我爱Google!”。对每种形式的注释,等等。

Google可能实际上不会这样做,但这是您无法控制的因素,其他脚本托​​管服务当然也需要担心。之前曾发生过一些事件脚本,其中统计脚本已被恶意软件加载程序破坏。

在包含来自第三方的任何脚本之前,即使在您网站的单个页面上,您也必须100%信任它们,并在该主机名上看到所有用户可访问的功能(包括面向Web的管理功能)。


21
Google不会那样做...我喜欢GOOGLE ...会吗?:-p
JasCav 2010年

1
关于安全性问题的优点。
Naltroc '16


1
优点:从未考虑过如何远程CDN脚本会被黑客入侵,然后拖到我的网站上。对于主要的库(如jQuery,jQueryUI,Boostrap等)来说可能并不常见,但正如所指出的那样,较小的,受较少支持的库可能会成为受害者,尤其是如果它们不保持最新的话。好点+1
twknab

14

Google CDN:

  • 缓存,有利于性能,可能已有更多用户使用,并且可以并行下载
  • 如果有的话,Heaver Forbid CDN掉线了。你完蛋了。
  • 如果新版本破坏了您现有的插件或网站,您可能会为时已晚

本地:

  • 无需连接网络即可进行开发
  • 除了最小化之外,通过gzip压缩仍然可以获得一些性能优势

5
但是从Google的CDN加载的jquery最小化了。使用CDN的另一个优点是它对于您的目录结构来说更干净:)
Ascherer 2010年

if a new version breaks your existing plugins or site, you'll know about it possibly too late您可以在CDN链接中指定版本以避免这种情况。
亚当

13

我更喜欢使用本地版本,因为我无法控制它们将提供的内容。例如,我不希望我的用户受到google-analytics或其他类似因素的影响,因为这在我国是一个法律问题。


9

好处:(特别适用于Google的CDN)

  1. 与文件并行下载。其他答案进一步解决了这个问题
  2. Google的服务器很可能能够更快地以物理方式交付内容
  3. 通用库和框架可能已经在用户计算机上,因为CDN的HTTP缓存是通用的在所有站点上
  4. 您的带宽不必用于提供大型库文件

2

使用Google的CDN,几乎从任何角度看都是一件好事。

性能将得到改善(尽管相当有限,除非您的站点确实很繁忙),并且服务器必须传输的数据量将会减少(尽管jQuery并不是下载的庞大内容),等等。

您不希望使用它的唯一原因是您不信任Google。通过使用它,您可以有效地向Google提供进入您网站流量配置文件的附加信息窗口,包括您可能不希望公开的URL知识(例如,网站的安全区域)。

如果您对安全性抱有偏执,那么这可能足以说服您不要使用它们(毕竟,亲自托管它并不会完全使您的网站慢下来进行爬网),但是总的来说,大多数人会采取务实的观点Google已经对他们的网站了如指掌,因此添加它不会有多大区别。


1

如今我可能是少数派,但我想除非您确实需要,否则您不想使用CDN。开始使用它的关键因素是:

  • 跨地理用户。如果您在美国托管网站,但拥有大量欧洲用户-CDN将缩短加载时间。
  • 大量的用户和/或大量的内容,因此一台主服务器已经不够。可以想到任何色情视频网站(或Netflix,如果需要的话)。视频流是很重的负载,而CDN将大大减少主服务器上的负载。

但是...要点是,这些要点并不真正适用于全球90%的网站。我敢打赌,您不是拥有全球数百万在线用户的Facebook,也不是拥有每秒数百GB传输量的Pornhub。

如果您的网站是针对您所在城市/国家/地区的用户的,并且一台服务器的容量足以满足您拥有的用户数量-为什么您要CDN?对于您所在城市的用户而言,它更快,而从本地本地主服务器中获取所有信息,则更加简单。


一般而言,它更多是关于CDN的,现在让我更接近有关jQuery或任何其他库的实际问题。

如果您希望您的网站在一年多的时间内保持可访问性且无需维护就可以正常工作-将其放在本地。如今,图书馆正在以一种疯狂的节奏进行更新,您可能不想遵循。最终将删除旧版本。而且,整个库都会死掉(尽管可能不适用于jQuery)。

根据最近的经验-我在维护的网站上将TinyMCE从3.xx(日期为2012年)更新为5.xx(日期为2019年春季)。该网站运行了7年(七年!),这一部分逻辑没有任何维护。当时没有“缩小”概念,CDN并不像现在这样普遍。但是,即使它们很常见-您也永远不会知道从现在开始的3-5-10年后会发生什么。通常,即使不维护网站,您也希望自己的网站保持活力,不是吗?但是,如果您今天从CDN中提取jQuery,则此链接可能(而且很可能会)在5年内失效。

使用@Xaver建议的CDN解决方案和回退到本地版本可能是一个不错的折衷方案。但是...也许只是摆脱了CDN链接?;)


0

对我而言,这实际上取决于您希望拥有多少控制权。如果您像我一样,在工作和旅行中需要在本地主机上发展。将jquery文件放在本地比在google或其他地方托管它更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.