ES6インポートを使用しているときに、変数名を提供するモジュールに何かをインポートすることは可能ですか?
つまり、構成で提供された値に応じて、実行時にいくつかのモジュールをインポートします。
import something from './utils/' + variableName;
ES6インポートを使用しているときに、変数名を提供するモジュールに何かをインポートすることは可能ですか?
つまり、構成で提供された値に応じて、実行時にいくつかのモジュールをインポートします。
import something from './utils/' + variableName;
回答:
import
ステートメントではありません。import
またexport
、静的に分析できるように定義されているため、ランタイム情報に依存できません。
ローダーAPI(ポリフィル)を探していますが、仕様のステータスが少しわかりません。
System.import('./utils/' + variableName).then(function(m) {
console.log(m);
});
Felixの回答に加えて、これは現在ECMAScript 6文法では許可されていないことを明示しておきます。
ImportDeclaration :
import ImportClause FromClause;
輸入 ModuleSpecifier;
FromClause :
- ModuleSpecifier から
ModuleSpecifier :
- 文字列リテラル
A ModuleSpecifierは唯一の可能StringLiteral、ないような表現の他の種類AdditiveExpression。
const
string literal
s を含めるように拡張されなかったのは残念です。それらは静的に分析可能ですよね?依存関係の場所を再利用する可能性があります。(たとえば、テンプレートをインポートし、テンプレートとテンプレートの場所の両方を使用できるようにします)。
これは実際には動的インポートではありませんが(たとえば、私の状況では、以下でインポートするすべてのファイルは、実行時に選択されずに、webpackによってインポートおよびバンドルされます)、特定の状況で役立つ可能性がある使用しているパターンは、 :
import Template1 from './Template1.js';
import Template2 from './Template2.js';
const templates = {
Template1,
Template2
};
export function getTemplate (name) {
return templates[name];
}
または代わりに:
// index.js
export { default as Template1 } from './Template1';
export { default as Template2 } from './Template2';
// OtherComponent.js
import * as templates from './index.js'
...
// handy to be able to fall back to a default!
return templates[name] || templates.Template1;
で簡単にデフォルトに戻すことはできないと思いますrequire()
。存在しない構築されたテンプレートパスをインポートしようとすると、エラーがスローされます。
requireとimportの良い例と比較はここにあります:http : //www.2ality.com/2014/09/es6-modules-final.html
@iainastacioからの再エクスポートに関する優れたドキュメント:http ://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
このアプローチに関するフィードバックを聞きたいです:)
Object.values(templates)
。
ESモジュールの動的インポートと呼ばれる新しい仕様があります。基本的に、あなたは電話するだけimport('./path/file.js')
でいいのです。関数はpromiseを返します。これは、インポートが成功した場合にモジュールで解決されます。
async function importModule() {
try {
const module = await import('./path/module.js');
} catch (error) {
console.error('import failed');
}
}
ユースケースには、React、Vueなどのルートベースのコンポーネントのインポートや、モジュールを遅延ロードする機能が含まれますランタイム中に必要になったときにが含まれます。
これはGoogle Developersの説明です。
MDNによると、これは現在のすべての主要なブラウザー(IEを除く)でサポートされており、caniuse.comは世界市場シェア全体で87%のサポートを示しています。繰り返しになりますが、IEやChrome以外のEdgeではサポートされていません。
import
Node.jsでES6について具体的に尋ねられた質問を理解していますが、以下は、より一般的なソリューションを探している他の人に役立つ場合があります。
let variableName = "es5.js";
const something = require(`./utils/${variableName}`);
ES6モジュールをインポートしていて、default
エクスポートにアクセスする必要がある場合は、次のいずれかを使用する必要があります。
let variableName = "es6.js";
// Assigning
const defaultMethod = require(`./utils/${variableName}`).default;
// Accessing
const something = require(`./utils/${variableName}`);
something.default();
このアプローチでデストラチャを使用することもできます。これにより、他のインポートの構文に慣れ親しむことができます。
// Destructuring
const { someMethod } = require(`./utils/${variableName}`);
someMethod();
残念ながら、default
破壊だけでなくアクセスしたい場合は、これを複数のステップで実行する必要があります。
// ES6 Syntax
Import defaultMethod, { someMethod } from "const-path.js";
// Destructuring + default assignment
const something = require(`./utils/${variableName}`);
const defaultMethod = something.default;
const { someMethod, someOtherMethod } = something;
私はこの構文はあまり好きではありませんが、機能します:
書く代わりに
import memberName from "path" + "fileName";
// this will not work!, since "path" + "fileName" need to be string literal
次の構文を使用します。
let memberName = require("path" + "fileName");
require()
初期バージョンである、ファイルをロードするためのNode.JSメソッドです。import
ステートメントは新しいバージョンで、公式の言語構文の一部になりました。ただし、多くの場合、ブラウザは(科学の背後にある)以前のブラウザを使用します。requireステートメントはファイルをキャッシュするので、ファイルが2回目に読み込まれると、メモリから読み込まれます(パフォーマンスが向上します)。インポートの方法には、WebPackを使用している場合、それ自体に利点があります。その後、webpackはデッドリファレンスを削除できます(これらのスクリプトはクライアントにダウンロードされません)。
ダイナミックimport()(Chrome 63以降で利用可能)があなたの仕事をします。方法は次のとおりです。
let variableName = 'test.js';
let utilsPath = './utils/' + variableName;
import(utilsPath).then((module) => { module.something(); });
./utils/test.js
export default () => {
doSomething...
}
ファイルから呼び出す
const variableName = 'test';
const package = require(`./utils/${variableName}`);
package.default();