momentオブジェクトの取扱について
yamaryu0508 opened this issue · 1 comments
yamaryu0508 commented
Moment.js、Moment Timezoneを用いたJavaScriptカスタマイズを適用していたアプリでconditionformat2を設定したところ、moment.tz is not a function
のエラーが出て、カスタマイズで利用していたMoment Timezoneが効かなくなりました。
事象としては、JSカスタマイズからプラグインの順でJSファイルが読み込まれるため、tzがないmomentオブジェクトがプラグイン側でwindowに付加された状態でmoment.tzをコールしているためだと考えられます。
- カスタマイズでmoment.jsが読み込まれ、momentオブジェクトがwindowに付加される
- カスタマイズでmoment-timezone.jsが読み込まれ、momentオブジェクトにtzが付加される
- プラグインでmoment.jsが読み込まれ、momentオブジェクトがwindowに再付加される
- カスタマイズでmoment.tzを利用している部分が実行されたタイミングで、
moment.tz is not a function
になる
プラグインやカスタマイズ間の、window(グローバル)でのオブジェクト汚染の一種として捉えることが出来るかと思いますが、現状の回避作はWebpackによるパッケージング等を除けば moment.js 利用時には moment-timezone.js もセットでロードしておくことになるかと思います。manifest.json並びに公式Zipファイルの更新をご検討頂けますと幸いです。
本件、プラグインを一旦無効化すると復帰したことを確認しています。
ydambara commented
担当者協議の結果、本issueに対しては以下のどちらかの対応案でご検討いただくことになりました。
- カスタマイズJSで今あるmomentオブジェクトを下記のような形で一旦別の変数でグローバルに格納
window.noconflict = {};
window.noconflict.moment = moment() - カスタマイズJSでは noconflict.moment を呼び出せばカスタマイズJSのときのmomentが使うことができる。