Grails は、Asset Pipeline というので js / css などのアセットを管理しているけど、例えば、 bootstrap.bundle.js を入れると、設定にもよるが、ビルド時(デバッグ実行時でも)に、自動でminify(難読化)してくれるようで、bootstrap.bundle.min.js とかも同時に入れていても、それではなく自前で難読化されたものを使うらしい。
のだが、この難読化に失敗すると、どういうわけか、bootstrap.bundle.unminified.jsが無いというエラーになってしまう。 bootstrap.bundle.unminified.jsを開発用の bootstrap5 のソースから入れても見てくれない。それどころか、その js を読み込む asset の設定ファイルまで、unminified が無いというエラーになって、収拾つかなくなる。
なんでエラーになるのだろう?
function bootstrapDelegationHandler(element, selector, fn) {
return function handler(event) {
const domElements = element.querySelectorAll(selector);
for (let {
target
} = event; target && target !== this; target = target.parentNode) {
問題は、ここにありました。 let { target } = event; という見慣れない代入がありますが、これは分割代入というもので、 let target = event.target; と似たようなものです。 event が Object の場合に、その、代入先変数名と同じ要素を代入するみたいな処理で、 let { type, target} = event; みたいに{} の中が、複数の場合は便利ですが、一つの場合は、変人コードにしか見えませんので、素直に、let target = event.target;と書けば良いのにと思ってしまいます。
この分割代入が、 for() の中にあると、どうやら、minifier がエラーを起こすようですね。
let {target} = event;
for (; target && target !== this; target = target.parentNode) {
の様に、外に追い出したら、一連のエラーもなく、無事 grails prod war できるようになりました。
bootstrapは、5.0から、ずっとこの書き方みたいで、関数が関数なので、今後も変わりそうにありません。 Asset Pipeline プラグインがアップデートすればそのまま使えるようになると思いますが、それまでは、ソースを修正して使うしかないのかもしれません。