問題の説明と再現手順:
Chromeの最新バージョンは、ネイティブモジュールのインポートサポートを宣言しています。 ただし、この機能では、完全なモジュールファイル名(「.js」拡張子を含む)を指定する必要があります。
ライブラリコードの「import ...」エントリには「.js」拡張子がないため、ブラウザで404エラーが発生します。
参考:この問題を隠す可能性がある(一部のプラットフォームではそうする)1つのことは、Webサーバーの構成です。
OSX上のApacheWebサーバーでは、デフォルトで「MultiViews」設定が有効になっているようです(「moment」ファイルが見つからない場合、サーバーは「moment.js」ファイルを検索します)が、Ubuntuでは、たとえば、このWebサーバーオプションが無効になっているため、モジュールのロードが失敗します。
環境:
Ubuntu16.04上のChrome61.0.3163.100(64ビット)
console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
VM3015:1 Thu Oct 05 2017 19:30:43 GMT+0600 (+06)
VM3015:2 05.10.2017, 19:30:43
VM3015:3 -360
VM3015:4 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
moment.jsのバージョンは2.18.1です
これは単なるクロムのことではありません。 私の知る限り、es6モジュールの仕様では、文字列だけでなく、FromClauseにファイル名が必要です。 RollupとWebpackはファイル拡張子がなくても正常に動作しますが、それはバンドルを簡単にするためだけです。
そして全体として、ローダーに拡張子を推測させないほうがよいので、そうです、FromClausesは実際には完全なファイル名である必要があります。
それをサポートするブラウザでモジュールインポートを使用する場合、ソースバージョンもコンパイル済みバージョンも機能しないため、これを並べ替えるのは本当に良いことです。
これは、インポートにファイル拡張子を追加するだけの簡単な修正である必要があります。
また、コンパイルされたバージョンを使用したい人のために-Momentのグローバルな使用のために、 this
はundefined
であるため、 global
プロパティはwindow
にフォールバックする必要があります。
これは、コミュニティ主導のPRによって最もよく解決されます!
ここに行く
これは、PolymerWebコンポーネントでの使用に最適です。 これが原因で、標準のES6Webコンポーネントでmomentjsを使用できなくなりました。
これはまだ問題ですか? ファイル拡張子を追加すると、Moment.jsが他のユーザーのサブセットで機能しなくなるのではないかと心配しています...
最も参考になるコメント
これは単なるクロムのことではありません。 私の知る限り、es6モジュールの仕様では、文字列だけでなく、FromClauseにファイル名が必要です。 RollupとWebpackはファイル拡張子がなくても正常に動作しますが、それはバンドルを簡単にするためだけです。
そして全体として、ローダーに拡張子を推測させないほうがよいので、そうです、FromClausesは実際には完全なファイル名である必要があります。