2016-10-27 18 views
1

import * as CodeMirrorをただちにimport CodeMirrorに変更してバグを修正しました。ES2015 `import * as`との違い` import`

  • 私はthis codeをコピーしました。 (TypeScriptから移植する)
  • import * as CodeMirror副作用のためにアドオンをインポートするまで機能しました。予想される新しいfoldプロパティは未定義です。

質問:で何が起こっているのか

  • (私はより良い何が起こったのか理解しようとしていますか)?この変更によってバグがどのように修正されましたか?
  • defaultプロパティをCodeMirrorに追加するのは誰ですか? (またはそれ以上の可能性:非常に似ています別のオブジェクト内のモジュールラップ)、最も可能性の高い容疑者:
    • JavaScriptのモジュール(ES2015)
    • バベル
    • のWebPACK
    • のCoffeeScriptを
    • CodeMirror
  • 私が達成しようとしていたことを達成する良い方法はありますか?

詳細:

このコードは期待どおりに動作しません:

import * as CodeMirror from 'codemirror' 
import 'codemirror/addon/fold/indent-fold.js' # should add `fold` object to `CodeMirror` 

console.log typeof CodeMirror   ## 'object' 
console.log typeof CodeMirror.fold  ## 'undefined' 
console.log typeof CodeMirror.default ## 'function' 

## Work-around: 
console.log typeof CodeMirror.default.fold ## 'object' 

このコードは期待通りに動作します:

import CodeMirror from 'codemirror' 
import 'codemirror/addon/fold/indent-fold.js' # should add `fold` object to `CodeMirror` 

console.log typeof CodeMirror   ## 'function' 
console.log typeof CodeMirror.fold  ## 'object' 
console.log typeof CodeMirror.default ## 'undefined' 

は、私はすでに、これらのリソースを研究してきたが、彼らは私が完全に何が起こったのか理解に役立っていない:

答えて

0

import * as CodeMirror from 'codemirror'輸入すべて輸出名を作成し、それらをCodeMirrorという名前のオブジェクトに名前を付けます。

import CodeMirror from 'codemirror'デフォルトのエクスポートをインポートします。

+0

'codemirror''のCodeMirrorとして 'import *'の結果として' CodeMirror.default'プロパティが存在するのは普通ですか?私は 'codemirror'が「default」という名前のエクスポートを明示的に指定していないと考えています – Leftium

+0

デフォルトのエクスポートは' export default​​'とマークされていますが、ワイルドカードをインポートするとキー' default' 。 –

2

のは、あなたがそれであなたが持っている、「テスト・モジュール」という名前の非常にシンプルなモジュールを持っていると仮定しましょう:

var test = 'test'; 
export default test; 
export function helloWorld() { ... }; 

あなたが行うと:あなたが唯一のデフォルトのエクスポートをインポートしている

import something from 'test-module'; 

'いくつかのモジュール'。この場合、文字列テストです。あなたが行うとデフォルトのエクスポート等何でも、オブジェクト、機能、

ことができます:「テスト・モジュール」から

インポート{のhelloWorld};

具体的には、デフォルトのエクスポートではなく、 'helloWorld'という名前の 'test-module'のメンバーをインポートしています。この場合、関数 'helloWorld'です。

あなたが行っていた場合:

import {something} from 'test-module'; 

をその名前のための輸出がないので「何か」が「未定義」されるだろう。

は、「test-module」という名前のエクスポートをすべて含むオブジェクトを要求しています。

次に、「test-module」内のすべてのエクスポートにsomething.nameとしてアクセスできます。この場合、それらはsomething.defaultsomething.helloWorldになります。

+0

'something.default'を' something ['default'] '(すべてのキーワードプロパティと同じように)変更するべきでしょう。これはすべてのトランスパイライザーがこれを行うわけではないため、古いブラウザーではエラーになります。 –

関連する問題