2016-09-24 73 views

回答

2

在運行時,爲了導入它的另一個模塊,模塊是一個JavaScript對象,每個導出都有一個屬性。該對象上的一組屬性概述了模塊的類型。當然,TypeScript可以在編譯時知道這些屬性的類型,就像它可以知道其他對象一樣。

但是從模塊自己的角度來看,它是一個函數,它被執行以將屬性添加到傳遞給它的對象exports。一般來說,exports對象成爲其進口商的模塊。

如果這看起來很奇怪,那麼我們需要看一下模塊的目的,即限制它的成員範圍。在JavaScript中,限制你定義的東西的主要方式是在函數中定義它。

由TypeScript生成的模塊的函數的確切形式取決於您選擇的加載器選項。例如,使用CommonJS模塊(由NodeJS使用),模塊的函數會由加載程序自動包裝爲.js文件的內容。對於Node.js的是功能一般是這樣的:

(function (exports, require, module, __filename, __dirname) { 
    <<JavaScriptFileContent>> 
\n}); 

由於模塊加載過程的一部分,Node.js的編譯此匿名函數,然後調用它,傳遞的(幾乎)空的JavaScript對象exports,該require()函數等。通常,中間的代碼通過向exports對象添加屬性來工作。

這不是完整的故事,它可能是一個模塊是別的東西。如果中間的代碼爲module.exports指定了其他內容,則該對象將成爲運行時模塊對象。這不是很常見。

相關問題