2017-02-15 9 views
0

古いパッケージを整理しようとしています。このために、元の "export = module"フォームを "export default module"に変更しました。この変更により、 "import module from 'module'"が "module_1"にコンパイルされているため、eval()を使用するコードの他の部分が破損します。 eval()に渡されるコードは外部ソースから到着しますが、 "module_1.default"フォームではなくmoduleを使用します。Typescriptの名前生成メカニズム

この種の命名規則は実際どのように機能しますか?コンセプトを教えてください。コンパイルされたモジュール名の代わりに元のモジュール名を使用するにはどうすればいいですか?または、コンパイル後にモジュールの実際の名前を取得する関数はありますか?

おかげで、 アダム

+0

私はおそらくあなたに伝える必要はありませんが、将来この質問に訪れる人々のために言います:**答えが 'eval()'であれば、あなたはおそらく間違った質問**。 'eval()'を使うと、セキュリティの脆弱性や追跡が困難なバグが発生します。ほとんどの場合、より良い解決策があります。 –

答えて

1

それは、コンパイラによって生成された名前を使用することが危険なのです。それは変更することができます。

回避策を行うことができます

しかし:次に、あなたが変数moduleを使用することができます

var module = module_1.default; 

import myModule from 'module' 
const module = myModule 

2行目はにコンパイルされます。

なぜ近い将来export defaultではなくexport =

を使用するには、export defaultの使用が当たり前になるだろう。この機能は、現在のCommonJSユースケースを置き換えるためにECMAScriptによって設計されています。メンバーdefaultは、より優れた、より一般的なものです。

ここは例です。あなたは、オブジェクトをエクスポートする必要があります。

const myConfigObject = Object.freeze({ 
    dbHost: "", 
    dbUser: "", 
    // ... 
}) 
export = myConfigObject 

その後、あなたはそれをインポートすることができます。

その後
import * as myConfigObject from "./myConfigObject" 

、あなたはに関連する何かをするモジュールのユーザーに役立つ小さなヘルパー関数toDSNをエクスポートしたいと思いますエクスポートされたオブジェクトどうやってするか?ヘルパーを設定のメンバーとして追加することができます。しかし、それはエレガントではありません。

export default Object.freeze({ 
    dbHost: "", 
    dbUser: "", 
    // ... 
}) 
export function toDSN(configObj) { 
    return // ... 
} 

はその後、あなたはデフォルトのオブジェクトをインポートすることができます:

はここES6の方法です

import myConfigObject from "./myConfigObject" 

...かtoDSNをインポートします。

import { toDSN } from "./myConfigObject" 

...または両方をインポートします:

import myConfigObject, { toDSN } from "./myConfigObject" 

現在のNode.jsユーザーコードの唯一の落とし穴は、メンバーdefaultを使用する必要があります。 Node.jsがES6モジュールを実装するとき、落とし穴はもう存在しません。

なぜTSコンパイラがインポート用の中間変数を生成するのですか?

ES6モジュールの一般的なケースで必要とされるためです。次のES6コード:

import myConfigObject, { toDSN } from "./myConfigObject" 

ここでは、2つの変数がインポートされます。しかし、CommonJS(またはAMD)requireは、1つの変数しかインポートできません。したがって、コンパイラはこの単一の変数を中間変数myConfigObject_1としてインポートします。次にオブジェクトmyConfigObjectmyConfigObject_1.defaultから利用可能であり、toDSNmyConfigObject_1.toDSNから利用可能です。

私は、ES6モジュールの紹介としてthe article from Mozillaを提案します。

+0

これは私たちの問題を解決しました。しかし、実行時に名前がmodule_1になったのはなぜだろうか。 FooとEntryPointの2つのモジュールで簡単なプロジェクトを作成しました。 Fooのは、このようなクラスfooという名前のエクスポート: 'Fooクラス{} 輸出デフォルトはFooを;' EntryPpintは次のようになります。 "フー" から 'インポートはFoo; エクスポート関数run(){ var foo = new Foo(); } ' EntryPointは、Foo_1という名前のFooの引数を持つ関数にコンパイルされています。この行動の目的または原因は何ですか? –

+0

中間変数が必要です。私は編集しました。 – Paleo

+0

これをさらに理解するためのドキュメントを参照できますか? –

関連する問題