2016-02-20 16 views
8

私はJavaScriptにはかなり慣れていて、最近は輸入に苦労しています。私は私の頭を包むことができない1つのことがありました。デフォルトのエクスポートが定義されておらず、モジュールとしてimport *と異なるのはなぜですか?

expressのようなnpmを使用してインストールされる可能性のある古いノードモジュール(主にES6より前のライトを見たもの)では、通常、デフォルトのエクスポートは定義されていません。

My IDE(WebStorm)はで次の行をマークします。デフォルトのエクスポートは、インポートされたモジュールで宣言されていません通知。

import * as express from 'express'; 

を使用して、エイリアスが暗黙のうちにちょうどすべてをインポートし、expressそれに名前を付けるために私のIDEを言って、しかし、その後、そうすることにつながるとして、このメッセージは、モジュール全体をインポートしようとしていることによって回避することができる

import express from 'express'; 

Expressは、次の行でアプリケーションのインスタンスを作成しようとしている機能エラーではありません。

const app = express(); 

固有のインポート(エイリアスなし)が機能します。

はデフォルトの輸出が定義されていない場合、エイリアスなしにimport文を使用して、正確に何を輸入していますか?私はそれがモジュール全体であると思うだろうが、そうは見えない。

+1

これは、モジュールのローダーハンドラがES6以前のモジュールをどのように処理しているかわからないIDEの問題です。それが動作する場合は、それを使用し、通知をオフにするか、リンクされたモジュールのエクスポートを宣言する方法を見つけます。 – Bergi

+0

@Bergi IDEの通知は問題ではありません。私はIDEが指摘したように、そのようなインポートが宣言されていないときにデフォルトとしてインポートされるものにもっと興味があります。おそらく、バンドルにモジュールをパックするためにes-2015プリセットでwebpackとbabelを使用しているはずです。今は時間がありませんが、私はそのときに質問を編集します。 –

+0

@DavidPacker WebStormは、「設定」>「言語と言語」で[github.com/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)]からタイプ定義ファイル(「express.d.ts」など)をダウンロードして有効にした後、フレームワーク> JavaScript>ライブラリ>ダウンロード> express>ダウンロードとインストール* –

答えて

6

デフォルトのエクスポートが定義されていない場合、import Module from 'module'は何をインポートしますか?

何もありません。何かがインポートされたときに実際には、instantiating the moduleは、エクスポートまたはインポートされたモジュールから複数回エクスポートされていないことSyntaxErrorがスローされます。

なぜimport * as Moduleと異なるのですか?

import *は、エクスポートとしてプロパティを持つmodule namespace objectをインポートするだけです。何もエクスポートしなければ、空のオブジェクトになります。通常はデフォルトのエクスポートが定義されていない古い、事前ES6ノードモジュールで

つまり、ES6モジュールとしてインポートすることはできません。あなたのIDEはそれを期待しているようだが、警告を出す。

import宣言でそれらを参照するとどうなりますか?モジュールローダーが何かを行う可能性があります。HostResolveImportedModulesource text "ES6 module" recordではないmodule recordを返します。つまり、CommonJSモジュールでは実装に依存する可能性があります。

+0

したがって、単純な 'require'ではなくES6構文を使用してpre-ES6モジュールをインポートするだけで、うまく動作せず、おそらくバベルトランスフォームのためにそれを行う唯一の理由はありますか?私はあなたの答えを正しく理解しましたか? –

+1

いいえ、あなたのモジュールローダー/バンドラー(あなたのケースのwebpack)がpre-ES6モジュールを適切に扱うので、うまくいきます。すべてのローダー/バンドルがこれをサポートするわけではありませんが、実装依存です。しかし、古いcommonjsモジュールをインポートすることがどれほど役に立つかを考えれば、これは壊れません。あなたのIDEの問題は、これについて知りません。 – Bergi

関連する問題