Cómo reescribir jQuery Cookie y la librería core/js-cookie en Drupal utilizando el módulo js_cookie
¿Por qué este cambio?
- En Drupal 9, jQuery Cookie fue eliminado del núcleo y reemplazado por la biblioteca js-cookie. Existió un shim de compatibilidad (
core/jquery.cookie) durante Drupal 9, pero fue eliminado en Drupal 10.
https://www.drupal.org/node/3104677 - En Drupal 10.1, la propia librería
core/js-cookiefue declarada obsoleta y programada para ser eliminada en Drupal 11 porque el núcleo ya no la utilizaba. El registro de cambios recomienda cambiar al módulo contribuido JS Cookie.
https://www.drupal.org/node/3322720
https://www.drupal.org/project/drupal/issues/3296086 - El módulo contribuido JS Cookie (
drupal/js_cookie) proporciona una definición de biblioteca de recursos para js-cookie para que módulos/temas puedan seguir utilizando Cookies en Drupal 10 y 11. https://www.drupal.org/project/js_cookie
Resumen de la ruta de migración
1) Drupal 8 → 9: jQuery Cookie → core/js-cookie
Contexto histórico: Drupal 9 reemplazó jQuery Cookie con js-cookie y proporcionó ejemplos de mapeo de código y bibliotecas. https://www.drupal.org/node/3104677
# ANTES (Drupal 8 / principios de 9)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/jquery
- core/jquery.cookie
- core/drupal
// ANTES (API de 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);
Después (Drupal 9) se dependía de core/js-cookie y se utilizaba la API Cookies.*: https://www.drupal.org/node/3104677
# DESPUÉS (Drupal 9)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/drupal
- core/js-cookie
// DESPUÉS (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+ y 11: core/js-cookie → js_cookie contribuido
Como Drupal core declaró obsoleta core/js-cookie en 10.1 y la eliminó en 11, debes reemplazarla con la biblioteca del módulo contribuido JS Cookie: js_cookie/js-cookie. https://www.drupal.org/node/3322720
Composer
composer require drupal/js_cookie
Esto instala el módulo que expone una biblioteca de recursos Drupal para el paquete original js-cookie. https://www.drupal.org/project/js_cookie
Declarar dependencia en un módulo/tema (para proyectos contrib/personalizados)
# my_module.info.yml (o el .info.yml de tu tema)
name: My Module
type: module
core_version_requirement: ^10 || ^11
dependencies:
- js_cookie:js_cookie
La página del proyecto indica explícitamente añadir js_cookie:js_cookie como dependencia para módulos contrib (y requerir drupal/js_cookie en composer si tu módulo tiene su propio composer.json). [4]
Cambiar la dependencia de tu biblioteca
# Reemplaza esto (obsoleto en 10.1, eliminado en 11)
# - core/js-cookie
# Con esto (proporcionado por el módulo contribuido)
my_library:
js:
js/my_library.js: {}
dependencies:
- core/drupal
- js_cookie/js-cookie
Esta sustitución exacta es el camino recomendado en el registro de cambios del núcleo. [2]
Código JavaScript
Tu código JS no necesita cambios si ya usabas la API Cookies de js-cookie; solo cambia la dependencia de la librería. [2]
((Drupal, Cookies) => {
Drupal.behaviors.myModule = {
attach: () => {
// Establecer cookie.
Cookies.set('cutest', 'red panda', { path: '/', sameSite: 'Lax' });
// Obtener cookie.
const myCookieValue = Cookies.get('cutest');
// Borrar cookie.
Cookies.remove('cutest', { path: '/' });
// Guardar/recuperar JSON de forma segura.
Cookies.set('cutest', JSON.stringify({ animal: 'red panda' }));
const cutestRaw = Cookies.get('cutest');
const cutest = cutestRaw ? JSON.parse(cutestRaw) : null;
},
};
})(Drupal, window.Cookies);
Consejo: js-cookie es compatible con RFC 6265 y codifica valores de forma diferente a jQuery Cookie, especialmente para JSON. El registro de cambios de Drupal 9 describe estas diferencias. https://www.drupal.org/node/3104677
Ejemplos del ecosistema
- El módulo EU Cookie Compliance siguió la obsolescencia de
core/js-cookiey se propusieron parches para cambiar ajs_cookie/js-cookie. https://www.drupal.org/project/eu_cookie_compliance/issues/3380490 - Varios proyectos contrib presentaron issues para reemplazar jQuery Cookie por js-cookie y luego abordar la obsolescencia de
core/js-cookie. https://www.drupal.org/project/quicktabs/issues/3298649
https://www.drupal.org/project/fpa/issues/3505122
Recetas paso a paso de actualización
A) De jQuery Cookie directamente a js_cookie/js-cookie (Drupal 10+)
- Elimina las dependencias
core/jqueryycore/jquery.cookiede tu.libraries.yml. https://www.drupal.org/node/3104677 - Añade
js_cookie:js_cookiea las dependencias de tu.info.yml(para módulos contrib/personalizados). https://www.drupal.org/project/js_cookie - Cambia la dependencia de la biblioteca a
js_cookie/js-cookie. https://www.drupal.org/project/js_cookie - Reescribe el JS desde
$.cookiehaciaCookies.*como se mostró antes. https://www.drupal.org/node/3104677
B) De core/js-cookie a js_cookie/js-cookie (Drupal 10.1 → 11)
- Requiere el módulo:
composer require drupal/js_cookie. https://www.drupal.org/project/js_cookie - (Contrib) Añade
js_cookie:js_cookieen.info.yml; solo activa el módulo. https://www.drupal.org/project/js_cookie. - En
.libraries.yml, reemplazacore/js-cookieconjs_cookie/js-cookie. https://www.drupal.org/node/3322720 - Mantén tu código JS actual con
Cookies.*. No se necesitan cambios funcionales. https://www.drupal.org/node/3322720
Aspectos a tener en cuenta y buenas prácticas
- Preparación para Drupal 11:
core/js-cookiese elimina en Drupal 11 — asegúrate de que todas las dependencias apunten ajs_cookie/js-cookie. https://www.drupal.org/node/3322720 - Privacidad/CDN: La página del proyecto js_cookie documenta cómo evitar cargar js-cookie desde un CDN (protección de datos). Usa recursos locales. https://www.drupal.org/project/js_cookie
- Codificación y JSON: No dependas del comportamiento JSON implícito. Usa explícitamente
JSON.stringifyyJSON.parsecomo se mostró antes. https://www.drupal.org/node/3104677 - Parches del mundo real: Revisa colas de issues (por ejemplo, EU Cookie Compliance) para ver patrones de actualización. https://www.drupal.org/project/eu_cookie_compliance/issues/3380490