jQuery UI 1.14.2への更新とjQuery 4対応
Active Adminが依存するjQuery UIを1.14.2に更新し、jQuery 4のサポートを追加しました。この変更により、廃止されたAPIの削除への対応と、jQuery 4環境でのDatepicker初期化問題の修正が実現されています。
背景
jquery-ui-rails gemが長期間メンテナンスされておらず、Active Adminは古いバージョン(1.13.0)のjQuery UIを使用していました。より新しいバージョン(1.13.2)を提供するアクティブなforkが存在しましたが、jQuery UIの最新版(1.14.2)には追従していませんでした。#8656がjQuery UI 1.14.1への更新を試みましたが、Tabsコンポーネントに#2344のリグレッションが発見されたため、1.14.2のリリースを待つ形となりました。
さらに、jQuery 4のリリースが進行中であり、Active AdminもjQuery 4への対応が求められていました。jQuery UI 1.14系はjQuery 4との互換性を考慮した設計となっているため、このタイミングでの更新が選択されています。
技術的な変更
jQuery UIのバージョン更新
ベンダリングされたJavaScriptファイルが1.13.3から1.14.2に手動で更新されました。主要な変更点として、バージョン番号の更新と、jQuery UI 1.14で廃止されたAPIへの対応が含まれます。
バージョン情報の更新:
$.ui = $.ui || {};
-return $.ui.version = "1.13.3";
+return $.ui.version = "1.14.2";
廃止されたファイルの削除:
jQuery UI 1.14では、古いIE対応のための以下のユーティリティファイルが削除されています:
-
form.js: IE8のform属性の非対応への回避策 -
ie.js: IEのバージョン検出 -
safe-active-element.js: IE9でのdocument.activeElement取得の例外処理 -
safe-blur.js: IE9-10でのblur処理の回避策
これらのファイルへの依存関係も各コンポーネントから削除されています。
jQueryのバージョン要件変更
package.jsonの依存関係定義が更新され、jQuery 3.7.1以上またはjQuery 4を許容するようになりました:
"dependencies": {
- "jquery": "^3.4.1",
- "jquery-ui": "^1.13.3",
+ "jquery": "^3.7.1 || ^4.0.0",
+ "jquery-ui": "^1.14.2",
"jquery-ujs": "^1.2.2"
}
最低バージョンが3.4.1から3.7.1に引き上げられ、jQuery 4も明示的にサポート対象となっています。
Datepicker初期化問題の修正
jQuery 4環境では、focusイベントハンドラ内でDatepickerを遅延初期化すると、初回フォーカス時にDatepickerが開かない問題(#2385)が発生します。この問題に対処するため、Datepicker初期化直後に明示的なtriggerHandler('focus')呼び出しが追加されました:
JavaScript版(app/javascript):
input.datepicker($.extend(defaults, options));
+// See https://github.com/jquery/jquery-ui/issues/2385
+input.triggerHandler('focus');
CoffeeScript版(app/assets):
input.datepicker($.extend(defaults, options));
+input.triggerHandler("focus");
triggerHandler()は、通常のtrigger()と異なり、イベントのバブリングやデフォルト動作を発生させずに、登録されたハンドラのみを実行します。これにより、Datepickerの内部状態を正しく初期化しつつ、無限ループのリスクを回避しています。
jQuery UI内部の実装改善
IE対応コードの削除に伴い、いくつかのコンポーネントで実装が簡素化されています:
:data疑似セレクタの簡素化:
return $.extend( $.expr.pseudos, {
- data: $.expr.createPseudo ?
- $.expr.createPseudo( function( dataName ) {
- return function( elem ) {
- return !!$.data( elem, dataName );
- };
- } ) :
-
- // Support: jQuery <1.8
- function( elem, i, match ) {
- return !!$.data( elem, match[ 3 ] );
- }
+ data: $.expr.createPseudo( function( dataName ) {
+ return function( elem ) {
+ return !!$.data( elem, dataName );
+ };
+ } )
} );
jQuery 1.8未満のサポートが不要になったため、条件分岐が削除されています。
標準APIの使用:
$.escapeSelector()の代わりに標準のCSS.escape()が使用されるようになりました:
-selector = "label[for='" + $.escapeSelector( id ) + "']";
+selector = "label[for='" + CSS.escape( id ) + "']";
設計判断
手動でのベンダリング方式 が継続されました。PR内の議論では触れられていませんが、jquery-ui-railsの代替手段(npmパッケージの直接使用など)ではなく、引き続きファイルをvendor/assets/javascriptsに配置する方式が採用されています。これは、Active Adminのアセットパイプライン構成との互換性を維持し、変更の影響範囲を最小限に抑えるための判断と考えられます。
jQuery 4の早期対応 も特徴的です。jQuery 4はまだ正式リリース前ですが、Active Adminは先行してサポートを追加しています。rails/jquery-rails#307で進行中のjQuery 4対応に合わせ、チェックリストベースの包括的な手動テストを実施することで、将来のjQuery 4正式リリース時の移行コストを削減する戦略が取られています。
既知のリグレッションへの対応 として、Tabs切り替え時の問題(#2344)は認識されていますが、jQuery UI 1.14.2で修正済みであることを確認した上で更新が進められました。この問題は非標準的なID(絵文字など)を含むタブで発生するもので、Active Adminの実際の使用パターンにも影響する可能性がありましたが、最新版での修正を待つことで解決されています。
まとめ
本PRは、廃止されたメンテナンスgemへの依存を解消し、jQuery UIを最新版に更新するとともに、次世代のjQuery 4への対応を先行して実現した変更です。手動ベンダリングという既存の方式を維持しながら、包括的な手動テストにより品質を担保する慎重なアプローチが取られています。jQuery 4の正式リリース時には、Active Adminユーザーは追加の対応なしに最新環境への移行が可能になります。