インポートを使用する最良の方法はどれか疑問に思ってください:
import * as Foo from './foo';
VS:
import { bar, bar2, bar3 } from './foo';
たとえば、効率の面では、すべてのJavaScriptファイルをバンドルするためにwebpackを使用しています。メインコードでそれらを使用していない場合でも、最初のものは実際にすべてをインポートしますか?
私が見つけることができるいくつかの参照は次のとおりです。
Airbnbスタイルガイド では、ワイルドカードを推奨しないため、常にデフォルトのインポートオブジェクトが存在し、 this となります。
新しいuglifyが提供するデッドコードの除去を使用してwebpackを使用する場合、またはツリーシェークを使用するrollupjsを使用する場合、未使用のインポートは削除されます。
ワイルドカードのインポートを使用しないというairbnbスタイルガイドに部分的に同意しますが、javascriptのワイルドカードのインポートは、たとえばpythonsまたはjavasのワイルドカードのインポートと同じ病気に苦しむことはありません、つまり、他のモジュールで定義された変数名でスコープを汚染しませんmoduleB.foo
を使用している場合、foo
ではなくimport * as moduleB from ...
によってのみアクセスできます。
テストに関する記事について:私は懸念をある程度理解していますが、そこで解決できないものは見当たりません。カスタムモジュールローダー(カスタムAMDモジュールローダーは文字通り15行のコード)でインポート自体をモックできます。そのため、テストされたモジュールのローカルスコープをいじる必要はありません。
質問のこの部分に関して:
メインコードでそれらを使用していない場合でも、最初のものは実際にすべてをインポートしますか?
Babel 6.26でコンパイルする方法は次のとおりです。
import { bar, bar2, bar3 } from './foo';
...になります...
'use strict';
var _foo = require('./foo');
import * as Foo from './foo';
...になります...
'use strict';
var _foo = require('./foo');
var Foo = _interopRequireWildcard(_foo);
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
} else {
var newObj = {};
if (obj != null) {
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key))
newObj[key] = obj[key];
}
}
newObj.default = obj;
return newObj;
}
}
どちらの場合も、require
を介してファイル全体がインポートされます。
ワイルドカードのインポートでは、_interopRequireWildcard
関数が定義され、すべてのエクスポートを名前空間変数に割り当てるために使用されます。
コンパイルされたコードには、単一の_interopRequireWildcard
定義と、インポートごとにrequire
および_interopRequireWildcard
の1つの呼び出しのみが含まれることに注意してください。
最終的に、ワイルドカードのインポートを使用すると、実行時にもう少し処理が必要になり、コンパイルされたjsのサイズがわずかに増加します。
@Tamasに同意します。
ターゲットファイル内のすべてのエクスポートへのフルアクセスが必要な場合は、import * as Foo from './foo';
または import foo from './foo':
ただし、特定の関数またはconstを使用する必要がある場合は、「import *」を避け、実行する必要があることを明示してください。
最新のWebPackセットアップでは、2つは同じコンパイル/トランスポートされたJSを生成するため、名前付きインポートの実際の値は、それがどれだけ表現力豊かであるかです。インポートに名前を付けることで、使用するモジュールから機能するファイルを開くものを指定します。これが役立つ場合の例は、テストを記述するときに、モックが必要な場合、モックへのインポートの明示的なリストがあります。