2017-06-29 1 views
6

次活字体のファイルを考えると、省略は、 "必要" と(<code>"module": "amd"</code>付き)活字体から "輸出" 放出されるAMDの依存

export = {}; 

tscが放出されます。しかし

define(["require", "exports"], function (require, exports) { 
    "use strict"; 
    return {}; 
}); 

を、私はそれをむしろだろう放出する

define([], function() { 
    "use strict"; 
    return {}; 
}); 

... requireまたはexports私は明示的にインポートした場合、すなわち

import relativeRequire = require("require"); 

放出されるAMDモジュールでrequireexports(すなわちを放出しないように活字体を指示する方法はありますにはCommonJS simplified wrappingを使用しないとと入力してください)。

注:

  • 私が提案した出力がAMD specに完全に準拠しています。
  • モジュールが0個の依存性を持たない(requireexports、およびmoduleの依存関係を意味する)依存性配列を省略するのではなく、空の依存配列はonly wayです。

UPDATE 2017年7月4日: これは実際に活字体GitHubのレポで開い問題であるように見える:実践的な問題を回避するためのhttps://github.com/Microsoft/TypeScript/issues/669

任意のアイデアをこれが実装されるまで? (あるいは、実際にTypeScriptにこれを行うための方法がありますか?)

答えて

3

あなたがしようとしているところに大きな利点はありません。未使用の依存関係を削除することによって実行時間が節約されても、残りのアプリケーションの実行時間、つまりおもちゃアプリ以外のアプリの実行時間に比べて小さくなります。 requireexportsは、インスタンス化するのにほとんど費用がかからない仮想モジュールです。 (「仮想」とは、使用しているAMDローダーの内部に完全に内蔵されており、ネットワーク上のファイルやディスク上のファイルを取得しないことを意味します)。issue 669は2014年9月以降オープンしており、 2015年4月。誰もそれほどひどく傷ついているようではないので、引き上げ要求を出すのは急いでいる。

どのような方法でもわからないのですが、TypeScriptはすぐに使えるようにします。私は最近、依存関係のリストに"module"という名前の仮想モジュールを追加する必要があったため、TypeScriptがdefine呼び出しをどのように発行するかを調べました。 (Angularを使用する場合は、module.idを使用して現在のモジュールのIDをAngularに渡し、相対テンプレートパスなどを解決できるようにします。module.idをCommonJS出力で問題なく使用できますが、AMD出力moduleは使用できません。依存関係のリストにデフォルトで含まれています)。私は、tscが発行したコードをtscが発行した後に発行するコードを変更するビルドステップを記述することで問題を解決しました。依存関係リストを変更して"module"を追加するregexpを使用し、コールバックを変更して対応する引数を追加します。私が追加しているので、これは私のために働く。依存関係を取り除きたいので実行しようとしていることに対して十分なアプローチではありませんが、削除するとコードが無効になることがあります。 回避策については

、あなたはtscによって生成されたJavaScriptを検討するEsprimaを使用することができますし、モジュール"require""exports"の値はdefineに渡されたファクトリ関数内のコードで使用されていない場合は、未使用のモジュールを削除します依存関係リストと、ファクトリ関数に渡された引数リストからの対応する引数から取得します。これが最も一般的な解決策になります。 (とりわけ、AMDローダーを工場出荷時の関数の内部)形式require([...], function (...) {})の(利用可能にすることを非同期にrequire呼び出しを使用してと互換性があるでしょう。)しかし、このロジックをコーディングすることは、プルリクエストを生成することであろうと同じように関与している可能性がありますtscが最初に必要なコードを出力するようにしてください。

を...と私だけが明示的にそれらをインポートする場合は必要とするか、または輸出含まれ、すなわちimport relativeRequire = require("require");

あなたは、その既に存在しない限り、requireを使用することはできません。

+0

私は数千のAMDモジュールを搭載した非常に大きなアプリを開発しています。そのうち約1300個はアプリの起動時に読み込まれ、最初に配信される資産の一部でなければなりません。私はすでに低負荷のパフォーマンス向上のほとんどを打ち負かしており、資産のサイズを減らす(おそらく不必要な仮想モジュールを排除する)ことは、小さな改善の長い尾のもう一つの部分です。 –

1

は、あなたが言った

を要求します。だから、そこにその良い。

輸出

exportsはできるだけ早くあなたが何かをエクスポートするとして必要とされています。 export =のようにルートエクスポートを実行する場合は、TypeScriptによってreturnにマップされます。しかしexport const foo = 123の場合はexportsを使用する必要があります。

は、それがそこにいると、パフォーマンスへの影響は本当に最小限でても害はありません。

+0

このプロジェクトは 'exports'を使用せず、たまにしか' require'を使用しません。モジュールは 'return ThisClass;'を使ってエクスポートされます。 (Dojoモジュール・ローダーを使用している場合は、そのモジュール・ローダーを使用します)。 –

関連する問題