jQuery изначально разрабатывался как глобальная библиотека,
подключаемая через тег <script> в HTML. Однако
современная разработка веб-приложений активно использует модульные
системы, такие как CommonJS, AMD и
ES Modules (ESM). Для успешной интеграции jQuery в
такие окружения необходимо понимать особенности его подключения и
экспорта.
CommonJS используется в основном в среде Node.js. Основная идея
заключается в использовании функции require для подключения
модулей и объекта module.exports для их экспорта.
const $ = require('jquery');
$(document).ready(function() {
$('p').text('Hello from jQuery in CommonJS');
});
Особенности:
$.jsdom), так как jQuery зависит от
window и document.require.require('jquery-ui');
AMD широко используется для асинхронной загрузки модулей, чаще всего через библиотеку RequireJS. jQuery поддерживает AMD из коробки.
define(['jquery'], function($) {
$(function() {
$('#example').hide();
});
});
Особенности:
define.define и define.amd.define.define(['jquery', 'jquery-ui'], function($) {
$('#datepicker').datepicker();
});
Современные проекты на фронтенде используют синтаксис ES6
Modules, где импорт и экспорт выполняется через
import/export.
import $ from 'jquery';
$(document).ready(() => {
$('.container').fadeIn();
});
Особенности:
import 'jquery-ui/ui/widgets/datepicker';
ProvidePlugin или define.jQuery сохраняет обратную совместимость с подключением через тег
<script> и глобальный объект $. Это
позволяет смешивать старый и новый подходы в одном проекте:
// Глобальная область
console.log(window.jQuery);
// Через модуль
import $ from 'jquery';
console.log($);
Проблемы, с которыми сталкиваются разработчики:
$ и
модульного импорта.$, могут не работать
корректно при строгом модульном подходе.import $ from 'jquery'), иначе может возникнуть ошибка
undefined.import $ from 'jquery', а плагины подключать как отдельные
модули. Чтобы обеспечить доступ к $ глобально, используется
ProvidePlugin:const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
}),
],
};
import $ from 'jquery';
import 'jquery-ui/ui/widgets/dialog';
$('#dialog').dialog();
$ и плагины.$: при необходимости
предоставлять через сборщик или использовать метод
jQuery.noConflict().$ и модульного импорта.npm install --save-dev @types/jquery
import * as $ from 'jquery';
$(document).ready(() => {
$('#app').text('TypeScript + jQuery');
});
declare module 'jquery-ui/ui/widgets/datepicker';