2013-05-09 72 views
6

我有一個page-a.ts進口模塊,它會編譯爲page-a.js打字稿:只有報表

alert('this is from page-a'); 

而且我有一個main.ts其編譯成main.js

import pageA = module('page-a') 
alert('this is from main'); 

這是我tsc命令line:

tsc --module amd page-a.ts main.ts 

和我使用requirejs這樣的:

<script src="require.js" data-main="main.js"></script> 

加載頁面時,我看不到警告消息框從page-a。並且在生成的腳本main.js中,沒有任何關於page-a

我的問題是,爲什麼會發生這種情況?我如何強制打印腳本來導入代碼沒有明確使用的模塊?

+0

我接受這個答案,因爲它是我的問題的正確答案。但我用另一種方法來解決我的問題,你可以在這裏看到:https://typescript.codeplex.com/discussions/443144 – deerchao 2013-05-10 05:28:46

回答

3

您生成的js不會導入未在代碼中明確使用的模塊。 Typescript很聰明,不會爲只導入和未使用的模塊生成任何js。

您需要:

  • 出口變量的第一個模塊中
  • 進口第一模塊的第二模塊中
  • 使用導出的變量在第二模塊中

所以有頁面a.js類似於:

export var x = 123; // just to export something that you can use 
alert('this is from page-a'); 

和main.ts爲:

import pageA = module('page-a') 
var foo = pageA.x; // If you remove this line and you will not get the alert from page-a 
alert('this is from main'); 
+0

謝謝你,你的詭計很有用。在接受答案之前,我會等待一段時間,看看是否有更好的解決方案。 – deerchao 2013-05-09 07:47:23

+1

這不是假設:) requirejs「require」模塊被包含在define([],()=> {})塊中。 – 2013-05-09 09:03:55

+0

TypeSript只有在文件導出時纔會生成。 – 2013-05-09 09:10:30

11

有除了由@basarat提到的其他兩種方法來確保導入的模塊被包括在定義功能,因此加載。

將amd-dependency元素包含在TypeScript文件的頂部。

///<amd-dependency path="pathToFileRelativeToBaseWithoutFileExtension"/> 

import moduleName = require("pathToFileRelativeToBaseWithoutFileExtension"); 
moduleName; //Does not require declaring a new variable. 

前者可能是一個具有副作用的機會最小。不幸的是,元素及其用法沒有很好的記錄。

當使用延遲加載創建和註冊依賴注入類型的AngularJS模塊時,我發現了這些方法。由於就TS編譯器而言,從不創建或分配類型,因此不會爲定義函數創建必要的參數。

他們說這是由設計(https://typescript.codeplex.com/workitem/2436),但我恭敬地不同意。如果我已經導入了一個模塊/文件,並且在該模塊中有一個具體類型的引用,那麼該模塊必須在該點加載才能運行。不得不做額外的步驟是多餘的。

0

我知道我遲到了,但這裏是另一種方式來實現這一目標:
你可以告訴打字稿通過導入一個模塊只是副作用:
import "path/to/external/module";
雖然這是ES6語法打字稿將改變當你將--module amd傳遞給tsc時它進入AMD需要(),並且因爲它只是爲了副作用而導入,所以它不會被丟棄。