鉴于这种:
澄清对这样一个小型库的需求:这是一个第三方服务,网站会拉入他们的页面。由于我们无法控制现有的库、速度或页面加载,我们需要尽可能保持轻量、快速和独立。15k 是仅用于服务的动态内容访问的库的目标编号。
我建议通过 CDN 之一使用按需加载的 jQuery(谷歌或微软的;我认为谷歌的使用更多,但你想测试一下)。您的代码可以检测 jQuery 是否已经加载,如果是(~0k)则使用它,如果没有,则script
动态添加一个从 CDN 中提取它的元素。如果用户使用该 CDN 中的 jQuery 访问了任何其他站点,则该脚本很可能来自缓存 (~0k)。如果没有,当然,那么你有 ~31k 而不是 ~15k 命中,但同样,你经常不会有任何命中,或者只是来自 CDN 的“未修改”响应的命中。
noConflict
如果你确实加载了它,你会想要发出一个调用,以防网站使用$
jQuery 以外的东西。这很容易通过观察元素load
上的事件来完成script
(您必须readystatechange
在 IE 上使用并观察其中一个loaded
或complete
状态),然后在发生时执行它。
在当今的电信世界中,与首先建立 HTTP 连接的成本相比,15k 下载和 31k 下载之间的差异微不足道。
该需求负载实际上是一小段代码,大致如下:
function loadJQuery(cb) {
var d, s, t;
if (typeof jQuery === "function"
&& parseFloat(jQuery.fn.jquery) >= 1.5) { /* Or whatever */
window.ourjQuery = jQuery;
if (cb) {
cb();
}
return;
}
d = document;
s = d.createElement('script');
t = d.body || d.getElementsByTagName('head')[0] || d.documentElement;
s.onload = loaded;
s.onreadystatechange = handleReadyStateChange;
s.src = "//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js";
t.appendChild(s);
function loaded() {
if (s) {
s = undefined;
window.ourjQuery = jQuery.noConflict(true);
if (cb) {
cb();
}
}
}
function handleReadyStateChange() {
if (s && (s.readyState === "loaded" || s.readyState === "complete")) {
loaded();
}
}
}
script
请注意元素上的 URL 。所以它对页面(细节http
)都很友好。另请注意,我正在检查最低 jQuery 版本并使用更严格的形式来加载它。无论哪种方式,在调用回调时,符号都会引用具有最低版本的加载副本。https
noConflict
ourjQuery
更新:解决您的上述评论:
这是一个好主意,但不幸的是,这对我们来说并不是一个真正的选择。我同意来自 Google 的 CDN 的 jQuery 很可能会被缓存 - 节省负载 - 我们可以根据需要进行检查和扩展,但它似乎不像我们自己服务那样可扩展或稳定。该站点可以决定覆盖一些 jQuery 模块以满足他们的需要或更糟。我们需要的是一个轻量级的自包含库,我们可以完全控制它,并且可以根据需要进行扩展和分支。目标是这个库将从我们的 CDN 缓存和版本化。
是的,网站修改基本 jQuery 功能的风险很小。很小的风险。如果您将自己限制在核心 API(而不是插件等),坦率地说,我认为这不值得担心。
但是,如果您对此感到担心,那么坦率地说,我只会使用托管在您自己的 CDN 上的稍微修改过的 jQuery,使用不同的符号jQuery
(并且根本不使用$
)。在当今的电信世界中,31k 与 15k 不是问题;主要成本将是首先建立连接。如果您愿意,您可能可以通过删除不需要的部分来减少它,尽管遗憾的是 jQuery 内部结构有点混乱,并且有选择地删除功能可能不是微不足道的(取决于它是什么功能)。