はじめに
[SweetAlert2]
(https://sweetalert2.github.io/)を使っているプロジェクトで、
開発中にある日突然、こんなエラーが出て動かなくなっちまいました。
Uncaught TypeError: Cannot read property 'constructor' of undefined
原因と対策
バージョン7から8へいつの間にかアップデートされてて、
しかも根本的な部分に非互換があったからでした。
https://github.com/sweetalert2/sweetalert2/releases/tag/v8.0.0
Breaking change # 1 - swal(...) -> Swal.fire(...)
- swal({
+ Swal.fire({
...
})
今までswal()
でシンプルに動いていたのが、
Swal.fire()
というメソッドを呼ばなければいけなくなったんですね。
大文字小文字も変わっとる。
これが一番インパクトでかいですが、他にも合計5つBreaking changeがあるので、要チェックです!
これから気をつけること
無闇にyarn upgrade --latest
しない。
実行後はメジャーバージョンアップしてるライブラリがないかちゃんと確認する。
メジャーバージョンアップの内容をちゃんと確認する時間がないときは、
一旦前のメジャーバージョンに戻す。
(油断した頃にハマるんですよねー・・・)
ググっても日本語のハマり事例がなかったので、きっと誰かの役に立つと思いQiitaにしたためます。
追記: SweetAlert2使うのやめました
Swal.fire()
が解決してから更にハマりました。
「他にも5つBreaking change」と書きましたが、そこではなく最下部の「Other changes」にひっそりと書かれたこの一文。。。
inputValidator and preConfirm should always resolve and never reject
これが僕としては最悪の仕様変更でした。
preConfirm
の中でPromise.reject()
したら、v7ではswal()
の戻り値としてreject
を返してくれたんですが、v8では絶対にresolve
が返ってしまう。なのでswal()
をtry-catch
で括るエラー処理が全くできなくなっちゃいました。
もうやってられないので、本家SweetAlert 2.xに移行したのでしたー。ちゃんちゃん。