Как подключить jQuery: CDN, локальный файл, npm и WordPress
Опубликовано: 26.09.2026 · Обновлено: 26.09.2026 · Актуально для jQuery 3.7.1 и 4.0.0
Самый быстрый способ подключить jQuery — вставить один тег <script src="https://code.jquery.com/jquery-4.0.0.min.js"></script> перед своим кодом: библиотека загрузится с официального CDN, и $ станет доступен на странице. Дальше — варианты для локального файла, npm-проектов и WordPress, а также разбор ошибки $ is not defined и других типичных проблем подключения.
Какую версию выбрать
На сентябрь 2026 года актуальны две ветки: jQuery 4.0.0 — основная линия разработки, и jQuery 3.7.1 — последний релиз ветки 3.x, которую многие держат из-за более широкой совместимости со старыми плагинами. Разница между ними в первую очередь в удалённых устаревших API (подробности — в статье что нового в jQuery 4.0), а не в наборе базовых возможностей, поэтому для нового проекта без старых плагинов разумно сразу брать 4.0.0.
У каждой версии есть полная сборка и облегчённая slim. Slim не включает Ajax и эффекты, а в 4.0 из неё дополнительно убрали модули Deferred, Callbacks и Queue, на которых эти функции построены. Если сайт использует jQuery только для выборки элементов и работы с DOM — берите slim, файл будет заметно легче.
| Сборка | Что внутри | Когда брать |
| jquery-4.0.0.min.js | Полный набор: DOM, события, Ajax, эффекты, Deferred | Нужны $.ajax(), .animate(), старые плагины на Deferred |
| jquery-4.0.0.slim.min.js | Без Ajax, эффектов, Deferred/Callbacks/Queue | Только выборка и манипуляции с DOM, современный код без jQuery-плагинов на Deferred |
| jquery-3.7.1.min.js | Полный набор, как в 4.0, но с сохранёнными устаревшими API | Старые плагины и код, ещё не проверенные на совместимость с 4.0 |
| jquery-3.7.1.slim.min.js | Без Ajax и эффектов (Deferred/Callbacks остаются) | То же, что и slim 4.0, но нужна совместимость с 3.x-плагинами |
Если на сайте много старых плагинов, не проверяйте совместимость с 4.0 «на глаз» — сначала прогоните через jQuery Migrate в тестовом окружении и посмотрите предупреждения в консоли, а уже потом переключайте прод.
Подключение с CDN
Проще всего вставить готовый тег <script> с одного из CDN. Официальный вариант — code.jquery.com, у него всегда актуальные файлы и есть теги с готовым SRI-хэшем на странице releases.jquery.com. Также jQuery зеркалируют cdnjs и jsDelivr — они бывают полезны, если основной CDN недоступен.
| CDN | URL для jQuery 4.0.0 | URL для jQuery 3.7.1 |
| code.jquery.com (официальный) | https://code.jquery.com/jquery-4.0.0.min.js | https://code.jquery.com/jquery-3.7.1.min.js |
| cdnjs | https://cdnjs.cloudflare.com/ajax/libs/jquery/4.0.0/jquery.min.js | https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js |
| jsDelivr | https://cdn.jsdelivr.net/npm/jquery@4.0.0/dist/jquery.min.js | https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js |
Пример подключения с официального CDN:
<script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
<script>
// ваш код, использующий $, идёт ниже
</script>
У тега со страницы releases.jquery.com есть ещё два атрибута — integrity и crossorigin="anonymous". Это механизм Subresource Integrity (SRI): браузер сверяет хэш скачанного файла с указанным в атрибуте и откажется выполнять скрипт, если файл был подменён на CDN или по пути к нему. Хэш привязан к конкретной версии файла, поэтому его нельзя придумать или взять «примерно такой же» — берите его только с официальной страницы для нужной версии:
<!-- jQuery 4.0.0, минифицированная полная сборка -->
<script src="https://code.jquery.com/jquery-4.0.0.min.js"
integrity="sha256-OaVG6prZf4v69dPg6PhVattBXkcOWQB62pdZ3ORyrao="
crossorigin="anonymous"></script>
<!-- jQuery 3.7.1, минифицированная полная сборка -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
crossorigin="anonymous"></script>
Хэш относится к конкретному файлу: у jquery-4.0.0.js, jquery-4.0.0.slim.min.js и других сборок он свой. Для другой версии или сборки копируйте готовый тег на releases.jquery.com — не правьте номер версии в адресе, оставив старый integrity: браузер тогда просто не выполнит скрипт. Тот же файл на jsDelivr (npm/jquery@4.0.0/dist/jquery.min.js) имеет тот же хэш.
Отдельно про Google Hosted Libraries (ajax.googleapis.com): этот CDN исторически был самым популярным способом подключить jQuery и до сих пор встречается в старых шаблонах, но новые версии появляются там с задержкой. Прежде чем прописывать адрес с 4.0, проверьте наличие нужной версии в каталоге developers.google.com/speed/libraries; надёжнее брать 4.0 с code.jquery.com, cdnjs или jsDelivr.
Для аудитории из РФ имеет смысл держать в запасе локальную копию файла: доступность зарубежных CDN у части провайдеров и клиентских сетей может быть нестабильной, и сайт не должен разваливаться из-за того, что не загрузился один внешний скрипт. Ниже — рабочий вариант с фолбэком на локальный файл.
Локальный файл
Скачайте нужный файл (например, jquery-4.0.0.min.js с code.jquery.com) и положите в папку со статикой сайта, например /js/. Дальше подключите тегом с относительным путём:
<script src="/js/jquery-4.0.0.min.js"></script>
<script src="/js/my-plugin.js"></script>
<script src="/js/app.js"></script>
Порядок важен: сначала jQuery, затем плагины, которые от неё зависят, и только потом ваш код, использующий и jQuery, и эти плагины. Каждый скрипт без async/defer выполняется сразу после загрузки и блокирует разбор страницы до этого момента — поэтому такие теги обычно ставят в самом конце <body>. Если хотите держать все скрипты в <head>, добавьте всем трём тегам атрибут defer — браузер сохранит порядок выполнения между ними и не остановит отрисовку страницы.
Частый сценарий — грузить jQuery с CDN, а при сбое подключать локальную копию. Классический вариант проверки:
<script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
<script>
window.jQuery || document.write('<script src="/js/jquery-4.0.0.min.js">\x3C/script>');
</script>
document.write() здесь безопасен только потому, что оба тега синхронные, без async/defer: страница ещё не дочитана, и метод успевает дописать HTML в поток разбора. В остальных случаях приём считается устаревшим: из асинхронных скриптов он не работает, а Chrome на медленных соединениях может не загружать вставленные через него скрипты со сторонних доменов. Вариант без document.write() — динамически создать тег скрипта и продолжить инициализацию в обработчике загрузки:
<script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
<script>
(function () {
if (window.jQuery) return; // CDN отработал, ничего делать не нужно
var script = document.createElement('script');
script.src = '/js/jquery-4.0.0.min.js';
script.onload = function () {
jQuery(function ($) {
// код, зависящий от jQuery, безопасно вызывать здесь
});
};
document.head.appendChild(script);
})();
</script>
Минус — код, зависящий от jQuery, приходится держать внутри onload, а не отдельным тегом ниже. Для одностраничников это обычно не проблема.
npm и сборщики
В проекте со сборщиком (Vite, webpack) jQuery ставится как обычная npm-зависимость:
npm install jquery
и импортируется как ES-модуль:
import $ from "jquery";
$(function () {
$("#app").addClass("ready");
});
Проблема возникает со старыми плагинами, которые ожидают $ и jQuery как глобальные переменные, а не как импортированный модуль. В webpack это решается через ProvidePlugin — он подставляет импорт автоматически там, где встречает $ или jQuery без объявления:
// webpack.config.js
const webpack = require("webpack");
module.exports = {
// ...
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
}),
],
};
В Vite такого готового плагина из коробки нет, но глобальные алиасы можно выставить руками. Важно: инструкции import всплывают и выполняются раньше остального кода модуля, поэтому присваивание window.jQuery нужно вынести в отдельный модуль и импортировать его первым:
// jquery-global.js
import $ from "jquery";
window.$ = window.jQuery = $;
export default $;
// main.js — порядок импортов = порядок выполнения
import $ from "./jquery-global.js";
import "./legacy-plugin.js"; // теперь плагин найдёт window.jQuery
Если написать присваивание прямо в main.js между двумя import, плагин выполнится раньше него и не найдёт jQuery.
Для окружений без браузера — Node.js с jsdom, серверный рендеринг, тесты — способ подключения в jQuery 4.0 изменился. В 3.x было достаточно require("jquery")(window), и библиотека сама возвращала фабричную функцию, если не находила глобальный window. В 4.0 эта неявная фабрика убрана из основного модуля: нужный вход — jquery/factory (или jquery/factory-slim для slim-сборки):
// jQuery 4.0
const { JSDOM } = require("jsdom");
const { window } = new JSDOM("");
const $ = require("jquery/factory")(window);
Если после перехода на 4.0 такой код перестал работать, это первое место для проверки.
jQuery в WordPress
WordPress поставляет jQuery в комплекте с ядром — отдельно подключать библиотеку с CDN для тем и плагинов не нужно и обычно не стоит. Правильный способ добавить свой скрипт, зависящий от jQuery, — зарегистрировать зависимость через wp_enqueue_script(), а не вставлять тег <script> напрямую в шаблон:
function my_theme_scripts() {
wp_enqueue_script(
'my-theme-script',
get_template_directory_uri() . '/js/my-script.js',
array( 'jquery' ), // зависимость — WordPress сам подключит jQuery раньше
'1.0.0',
true // грузить в подвале страницы
);
}
add_action( 'wp_enqueue_scripts', 'my_theme_scripts' );
Так WordPress гарантирует, что jQuery окажется на странице раньше вашего скрипта, даже если её уже подключает тема или другой плагин — дубликатов не будет.
Важная особенность: ядро WordPress подключает jQuery в режиме noConflict, чтобы не спорить за символ $ с другими библиотеками в теме. Из-за этого глобальный алиас $ в WordPress не работает — доступен только jQuery. Стандартный обходной приём — обернуть код в функцию и вернуть короткий алиас локально:
jQuery(function ($) {
// здесь $ снова означает jQuery, но только внутри этой функции
$('.my-block').addClass('is-ready');
});
Не отключайте и не дерегистрируйте встроенный jquery без веской причины (например, замены на другую версию для конкретного плагина, который иначе не работает) — на нём завязана часть админки и многих плагинов, и без явной необходимости трогать эту зависимость не стоит.
Проверка, что jQuery загрузился
Откройте консоль разработчика (клавиша F12 или сочетание Ctrl+Shift+I) на нужной странице и введите:
typeof jQuery
Если возвращается "function" — библиотека загружена. Значение "undefined" означает, что скрипт не подключился или подключился с ошибкой. Узнать версию можно так:
jQuery.fn.jquery
// вернёт строку вида "4.0.0"
Чтобы убедиться, что файл вообще запрашивался, откройте вкладку Network, перезагрузите страницу и найдите jquery в списке запросов — по столбцу Status видно, отдал ли сервер 200, 404 или редирект, а по Size — не пришёл ли вместо файла пустой ответ.
Готовность DOM
Код, который ищет элементы на странице (через функцию jQuery() / $()), должен запускаться только после того, как эти элементы появились в DOM. Стандартный способ — короткая форма:
$(function () {
// DOM готов, можно искать элементы и вешать обработчики
});
Она эквивалентна более явной записи $(document).ready(function () { ... }) — обе формы работают и сейчас, короткую просто удобнее читать. А вот привязка через .on('ready', fn), которую иногда ещё встречают в старом коде, не годится: ready — это не обычное DOM-событие, и такой способ подписки на него не поддерживается уже много версий подряд. Используйте $(fn) или $(document).ready(fn).
Если jQuery на странице нужен только ради ожидания готовности DOM, а остальной код написан на чистом JavaScript, обычно достаточно нативного события:
document.addEventListener('DOMContentLoaded', function () {
// DOM готов, jQuery не нужен
});
Похожий эффект даёт атрибут defer у обычного тега <script>: браузер откладывает выполнение скрипта до момента, близкого к DOMContentLoaded, без обёрток вида $(document).ready(). Подробнее о разнице между .ready() и обработчиками через .on() — в статье про события в jQuery.
Частые ошибки
| Симптом | Причина | Решение |
$ is not defined | Ваш код выполняется раньше, чем подключился jQuery, либо тег с jQuery вообще отсутствует на странице | Проверьте порядок тегов: jQuery должен быть выше вашего скрипта; убедитесь через вкладку Network, что файл вообще загрузился |
jQuery is not defined | То же самое, но код обращается к полному имени, а не к алиасу $ | Та же проверка порядка подключения и факта загрузки файла |
$(...).plugin is not a function | Плагин подключён раньше самой jQuery, либо на странице загружены две версии jQuery и плагин прицепился не к той | Проверьте порядок тегов (jQuery → плагины → ваш код) и убедитесь, что тег с jQuery на странице один |
| Код ломается непредсказуемо, часть плагинов «не видит» другие | На странице подключены две версии jQuery одновременно (например, одну тянет тема, другую — виджет) | Найдите оба тега <script> и оставьте один; если убрать нельзя — разведите версии через jQuery.noConflict(true) |
$ занят — конфликт с другой библиотекой | Ещё одна библиотека тоже использует символ $ (например, Prototype.js) | Вызовите jQuery.noConflict(); после подключения jQuery и используйте полное имя jQuery вместо $ |
| Скрипт с CDN не грузится, в консоли ошибка про mixed content | Страница открыта по https, а адрес CDN указан по http | Используйте протокол-независимый или явно https-адрес CDN (все актуальные CDN jQuery отдают https) |
| Браузер блокирует скрипт с CDN, в консоли ошибка Content Security Policy | Заголовок CSP сайта не разрешает загрузку скриптов с домена CDN | Добавьте домен CDN (например, code.jquery.com) в директиву script-src вашей CSP-политики или разместите файл локально |
Код после CDN-скрипта иногда падает с $ is not defined только на медленной сети | Тегу с jQuery по ошибке добавлен async, из-за чего порядок выполнения относительно соседних скриптов не гарантирован | Уберите async у тега с jQuery либо переведите все зависимые скрипты на defer, который сохраняет порядок |
Чек-лист
- Определились, нужна ли ветка 4.0.0 или 3.7.1, и обычная сборка или slim.
- Тег с jQuery стоит выше тегов с плагинами и вашим кодом (или у всех проставлен согласованный
defer).
- Если используете CDN — рядом есть план на случай его недоступности: локальный файл и фолбэк-проверка
window.jQuery.
- Если используете
integrity, хэш соответствует точной версии и сборке файла (скопирован с releases.jquery.com), а не остался от другой версии.
- В npm-проекте плагинам, ожидающим глобальные
$/jQuery, явно проброшены глобальные переменные (через ProvidePlugin или ручное присваивание).
- В WordPress свой скрипт зарегистрирован через
wp_enqueue_script() с зависимостью jquery, а не отдельным тегом в шаблоне.
- Код, ищущий элементы на странице, обёрнут в
$(function(){...}), а не выполняется до готовности DOM.
- После подключения проверили в консоли
typeof jQuery и jQuery.fn.jquery, а во вкладке Network — что файл действительно загрузился с кодом 200.
Если jQuery на сайте не используется активно и подключён «по привычке» — возможно, часть задач вообще проще закрыть без него; сравнение вариантов — в статье нужен ли jQuery, или хватит чистого JS. А для более редких методов и устаревших свойств вроде jQuery.browser или динамической подгрузки скриптов через jQuery.getScript() держите под рукой справочник jQuery API.
Частые вопросы
Куда вставлять подключение jQuery — в head или перед </body>?
Оба варианта рабочие. Тег в конце <body> (перед вашими скриптами) не блокирует отрисовку страницы и остаётся самым предсказуемым вариантом. Тег в <head> с атрибутом defer даёт тот же эффект: скрипт грузится параллельно с HTML и выполняется перед DOMContentLoaded, сохраняя порядок относительно других defer-скриптов. Не ставьте jQuery в <head> без defer и без async — тогда браузер остановит разбор HTML, пока не скачает и не выполнит файл.
Можно ли подключить две версии jQuery на одной странице?
Технически да, но вторая версия перезапишет window.$ и window.jQuery, и плагины, привязанные к первой версии, могут сломаться. Если это неизбежно (например, тема и плагин тянут разные версии), сразу после первой загрузки сохраните её через var jQuery1 = jQuery.noConflict(true);, а второй версии оставьте глобальные имена. Правильнее — привести все части сайта к одной версии.
Чем slim-сборка отличается от обычной?
В slim-сборке нет модулей Ajax и эффектов (.animate(), .fadeIn() и т. п.) в любой ветке. В jQuery 4.0 slim дополнительно лишена модулей Deferred, Callbacks и Queue, на которых эти функции основаны. Если сайт использует только выборку и манипуляции с DOM (.addClass(), .attr(), .on()), slim выйдет заметно легче обычной сборки; если нужны $.ajax() или анимации — берите полную версию.
Нужно ли подключать jQuery для Bootstrap 5?
Нет. Начиная с 5-й версии Bootstrap переписал JS-компоненты на чистый JavaScript и не требует jQuery для выпадающих меню, модальных окон, тултипов и остального. jQuery нужен только для Bootstrap 4 и более старых версий. Если на сайте Bootstrap 5 и jQuery всё равно подключён — это, скорее всего, наследие темы или отдельного плагина, а не требование самого Bootstrap.
Как узнать версию jQuery на сайте?
Откройте консоль разработчика (F12) на нужной странице и выполните jQuery.fn.jquery — вернётся строка вида "4.0.0". Если jQuery не подключён, команда вызовет ошибку jQuery is not defined. Также версию видно во вкладке Network: у файла с CDN обычно есть номер версии прямо в имени, например jquery-3.7.1.min.js.
Почему $ не работает в WordPress, хотя jQuery подключён?
Ядро WordPress подключает jQuery в noConflict-режиме, чтобы не конфликтовать с другими библиотеками в теме и плагинах, поэтому короткий алиас $ глобально недоступен — работает только jQuery. Внутри своего кода алиас можно вернуть локально: оберните код в jQuery(function($){ /* тут $ снова работает */ }); — это стандартный и безопасный приём именно для WordPress.
[ наверх ]