Как переписать jQuery Cookie и библиотеку core/js-cookie в Drupal с помощью модуля js_cookie
Почему это изменение?
- В Drupal 9 библиотека jQuery Cookie была удалена из ядра и заменена библиотекой js-cookie. В Drupal 9 существовал слой совместимости (
core/jquery.cookie), но он был удалён в Drupal 10.
https://www.drupal.org/node/3104677 - В Drupal 10.1 библиотека ресурсов
core/js-cookieбыла объявлена устаревшей и запланирована к удалению в Drupal 11, поскольку ядро больше не использовало её. В записи об изменениях рекомендуется переход на внесённый сообществом модуль JS Cookie.
https://www.drupal.org/node/3322720
https://www.drupal.org/project/drupal/issues/3296086 - Внесённый сообществом модуль JS Cookie (
drupal/js_cookie) предоставляет определение библиотеки ресурсов для js-cookie, чтобы модули и темы могли продолжать использовать Cookies в Drupal 10 и 11. https://www.drupal.org/project/js_cookie
Обзор пути миграции
1) Drupal 8 → 9: jQuery Cookie → core/js-cookie
Исторический контекст: Drupal 9 заменил jQuery Cookie на js-cookie и предоставил примеры сопоставления кода и библиотек. https://www.drupal.org/node/3104677
# ДО (Drupal 8 / ранний 9)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/jquery
- core/jquery.cookie
- core/drupal
// ДО (API jQuery Cookie)
(($, Drupal) => {
Drupal.behaviors.myModule = {
attach: () => {
$.cookie('cutest', 'red panda');
const myCookieValue = $.cookie('cutest');
$.removeCookie('cutest');
$.cookie.json = true;
$.cookie('cutest', { animal: 'red panda' });
},
};
})(jQuery, Drupal);
После (Drupal 9) вы зависели от core/js-cookie и использовали API Cookies.*: https://www.drupal.org/node/3104677
# ПОСЛЕ (Drupal 9)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/drupal
- core/js-cookie
// ПОСЛЕ (Drupal 9, API js-cookie)
((Drupal, Cookies) => {
Drupal.behaviors.myModule = {
attach: () => {
Cookies.set('cutest', 'red panda');
const myCookieValue = Cookies.get('cutest');
Cookies.remove('cutest');
Cookies.set('cutest', JSON.stringify({ animal: 'red panda' }));
const cutest = JSON.parse(Cookies.get('cutest') || 'null');
},
};
})(Drupal, window.Cookies);
2) Drupal 10.1+ и 11: core/js-cookie → js_cookie (внесённый модуль)
Поскольку ядро Drupal объявило core/js-cookie устаревшей в 10.1 и удалило в 11, необходимо заменить её библиотекой модуля JS Cookie: js_cookie/js-cookie. https://www.drupal.org/node/3322720
Composer
composer require drupal/js_cookie
Это устанавливает модуль, который предоставляет библиотеку ресурсов Drupal для оригинального пакета js-cookie. https://www.drupal.org/project/js_cookie
Объявление зависимости модуля/темы (для contrib/кастомных проектов)
# my_module.info.yml (или .info.yml вашей темы)
name: My Module
type: module
core_version_requirement: ^10 || ^11
dependencies:
- js_cookie:js_cookie
На странице проекта указано, что для модулей contrib следует явно добавлять js_cookie:js_cookie как зависимость (и добавлять drupal/js_cookie в composer, если у модуля есть собственный composer.json). [4]
Переключение зависимости библиотеки ресурсов
# Замените это (устарело в 10.1, удалено в 11)
# - core/js-cookie
# Этим (предоставлено contrib-модулем)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/drupal
- js_cookie/js-cookie
Именно такая замена рекомендована в официальной записи изменений ядра. [2]
JavaScript код
Ваш JS-код не требует изменений, если вы уже использовали API Cookies из js-cookie — меняется только зависимость библиотеки. [2]
((Drupal, Cookies) => {
Drupal.behaviors.myModule = {
attach: () => {
// Установить cookie.
Cookies.set('cutest', 'red panda', { path: '/', sameSite: 'Lax' });
// Получить cookie.
const myCookieValue = Cookies.get('cutest');
// Удалить cookie.
Cookies.remove('cutest', { path: '/' });
// Сохранить/получить JSON безопасно.
Cookies.set('cutest', JSON.stringify({ animal: 'red panda' }));
const cutestRaw = Cookies.get('cutest');
const cutest = cutestRaw ? JSON.parse(cutestRaw) : null;
},
};
})(Drupal, window.Cookies);
Совет: js-cookie соответствует стандарту RFC 6265 и кодирует данные иначе, чем старая jQuery Cookie, особенно для JSON. В записи изменений Drupal 9 описаны эти различия. https://www.drupal.org/node/3104677
Примеры из экосистемы
- Модуль EU Cookie Compliance отслеживал устаревание
core/js-cookieи были предложены патчи для перехода наjs_cookie/js-cookie. https://www.drupal.org/project/eu_cookie_compliance/issues/3380490 - Различные contrib-проекты создавали задачи для замены jQuery Cookie на js-cookie, а затем для решения устаревания
core/js-cookie. https://www.drupal.org/project/quicktabs/issues/3298649
https://www.drupal.org/project/fpa/issues/3505122