kintone-samples/plugin-samples

momentオブジェクトの取扱について

yamaryu0508 opened this issue · 1 comments

Moment.js、Moment Timezoneを用いたJavaScriptカスタマイズを適用していたアプリでconditionformat2を設定したところ、moment.tz is not a function のエラーが出て、カスタマイズで利用していたMoment Timezoneが効かなくなりました。

事象としては、JSカスタマイズからプラグインの順でJSファイルが読み込まれるため、tzがないmomentオブジェクトがプラグイン側でwindowに付加された状態でmoment.tzをコールしているためだと考えられます。

  1. カスタマイズでmoment.jsが読み込まれ、momentオブジェクトがwindowに付加される
  2. カスタマイズでmoment-timezone.jsが読み込まれ、momentオブジェクトにtzが付加される
  3. プラグインでmoment.jsが読み込まれ、momentオブジェクトがwindowに再付加される
  4. カスタマイズでmoment.tzを利用している部分が実行されたタイミングで、moment.tz is not a function になる

プラグインやカスタマイズ間の、window(グローバル)でのオブジェクト汚染の一種として捉えることが出来るかと思いますが、現状の回避作はWebpackによるパッケージング等を除けば moment.js 利用時には moment-timezone.js もセットでロードしておくことになるかと思います。manifest.json並びに公式Zipファイルの更新をご検討頂けますと幸いです。

本件、プラグインを一旦無効化すると復帰したことを確認しています。

担当者協議の結果、本issueに対しては以下のどちらかの対応案でご検討いただくことになりました。

  1. カスタマイズJSで今あるmomentオブジェクトを下記のような形で一旦別の変数でグローバルに格納
    window.noconflict = {};
    window.noconflict.moment = moment()
  2. カスタマイズJSでは noconflict.moment を呼び出せばカスタマイズJSのときのmomentが使うことができる。