Учитывая это:
Чтобы прояснить необходимость в такой маленькой библиотеке: это сторонний сервис, который сайты будут размещать на своих страницах. Нам нужно сделать все максимально легким, быстрым и автономным, насколько это возможно, так как мы не можем контролировать существующие библиотеки, скорость или загрузку страниц. 15k - это номер цели только для библиотеки, к которой обращается динамический контент службы.
Я бы порекомендовал использовать загруженный по требованию jQuery через один из CDN (Google или Microsoft; я думаю, что Google используется больше, но вы хотите проверить). Ваш код может определить, загружен ли уже jQuery, и использовать его, если так (~ 0k), и, если нет, динамически добавить элемент script
, который извлекает его из CDN. Если пользователь посетил какой-либо другой сайт с использованием jQuery из этого CDN, сценарий вполне может прийти из кеша (~ 0k). Если нет, то вы получите удар ~ 31k, а не ~ 15k, но, опять же, довольно часто у вас не будет никакого удара или просто ответа "не модифицированного" ответа из CDN.
Вы хотели бы сделать вызов noConflict
, если вы загрузили его, в случае, если сайт использует $
для чего-то отличного от jQuery. Это легко сделать, наблюдая за событием load
в элементе script
(вы должны использовать readystatechange
в IE и следите за статусом loaded
или complete
), а затем делать это, когда это произойдет.
В современном мире телекоммуникаций разница между загрузкой 15 КБ и загрузкой 31 КБ составляет тривиально по сравнению со стоимостью установки HTTP-соединения в первую очередь.
Эта нагрузка по требованию на самом деле является крошечным кусочком кода, а именно:
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();
}
}
}
Обратите внимание на URL-адрес элемента script
. Так что он удобен для страниц http
и https
( детали ). Также обратите внимание, что я проверяю минимальную версию jQuery и использую более строгую форму noConflict
, если мы ее загрузим. В любом случае, к моменту вызова обратного вызова символ ourjQuery
относится к загруженной копии с минимальной версией.
Обновление : адрес вашего комментария выше:
Это хорошая идея, но, к сожалению, для нас это не вариант. Я согласен с тем, что jQuery из CDN от Google, скорее всего, будет кэширован - это экономит нагрузку - и что мы можем проверять и расширять его по мере необходимости, но он не выглядит настолько масштабируемым или стабильным, как обслуживающий его сам. Сайт может решить перезаписать некоторый модуль jQuery, чтобы удовлетворить их потребности или хуже. Нам нужна легкая автономная библиотека, которую мы полностью контролируем и можем при необходимости расширять и ветвить. Цель состоит в том, чтобы эта библиотека была кэширована и версирована из нашего CDN.
Да, существует небольшой риск того, что сайт изменит базовую функциональность jQuery. A очень небольшой риск. Если вы ограничиваете себя основным API (не плагинами и прочим), я, честно говоря, не думаю, что стоит беспокоиться об этом.
Но если вы беспокоитесь об этом, то, честно говоря, я бы просто использовал слегка модифицированный jQuery, размещенный на вашем собственном CDN, с использованием символа, отличного от jQuery
(и вообще без использования $
). 31 тыс. Против 15 тыс. В современном мире телекоммуникаций - не проблема; Первоначальная стоимость будет заключаться в установлении связи в первую очередь. Если вы захотите, вы, вероятно, можете немного сократить это, удалив ненужные части, хотя, к сожалению, внутренняя часть jQuery - это немного сложнее, и выборочное удаление функциональности может быть не тривиальным (в зависимости от того, какая это функциональность).