2016-11-10 100 views
3

我剛讀完Javascript模塊上的這個article。我可以理解CommonJS模塊是同步加載的,而AMD模塊是異步加載的。javascript - 爲什麼有同步和異步模塊的規範?

我不明白的是,我怎麼能模塊成爲神奇同步如果我把它寫在CommonJS的格式,或者它是如何成爲奇蹟般地異步如果我把它寫在AMD格式我的意思是JavaScript沒有definerequire關鍵字甚至。他們只是規格而不是庫。

我的意思是模塊加載的行爲取決於模塊加載程序,而不是模塊的結構。如果是這種情況,爲什麼遵循不同類型模塊的編碼模式?

我是否認爲NodeJS世界中的所有庫都是同步加載的,無論它們以什麼格式寫入。瀏覽器空間中的所有模塊都是異步加載的。

如果我上面的假設是正確的,那爲什麼還有UMD的規範?我的意思是如果一個腳本根據它存在的環境加載,那麼爲什麼要爲通用模塊加載做一個規範?

有人可以幫我解決這個問題嗎?

+0

如何加載「模塊」不會改變代碼 - 你對模塊內代碼的假設是你的絆腳石 –

+0

@JaromandaX是的,那麼爲什麼還有模塊規格。你能詳細說明你的意思嗎? –

+0

模塊本身並不是同步的,而是異步的,它只是調用什麼樣的加載器接口。 CJS格式假設一個同步加載器,在瀏覽器上不能很好地工作,所以AMD格式被創建爲允許依賴聲明與異步正文執行(回調)。 AMD也將與同步加載器一起工作。 – Bergi

回答

4

這是一個很好的問題。這是一個在Node社區引起很多熱烈討論的主題。有一個什麼樣這一切都很好的理解你應該閱讀:從IBM

現在,你回答問題 - 爲什麼有同步和異步模塊的規範?因爲有些用例更喜歡模塊的同步加載,比如Node.js中的服務器端模塊,在開始提供服務請求之前要加載所需的所有內容,並且某些用例更喜歡異步加載模塊,比如在瀏覽器中時在加載依賴關係時,不想阻止呈現線程。

在瀏覽器中實際上沒有同步加載的選項,因爲它會使瀏覽器無法響應。

您可能會爭辯說,您可能會在服務器上使用異步加載,但您必須返回承諾而不是模塊require()或可能需要回調。無論哪種方式,它都會使任何使用大量模塊的複雜代碼變得更加複雜。

另一個問題是已經加載的模塊的緩存和突變。使用require加載同步模塊時,您只需加載 模塊一次,而對整個代碼庫(對於該進程)中的同一模塊的任何其他調用require都會返回緩存的響應,每次都是相同的對象。代碼的任何部分都可以修改該對象,並可用於代碼的任何其他部分。一些使用該功能的使用案例要實施起來要複雜得多。另外,加載和執行代碼的順序很難預測。

爲了總結您的問題的答案,有兩種加載模塊的方法的參數,並且這兩種方式都不是每種場景的明顯贏家。兩者都是必需的,都有一些規範來標準化他們的行爲。

閱讀我鏈接的文章以獲得更詳細的理解。

+0

謝謝,但講一件簡單的事情。我在瀏覽器中寫入了一個js,並通過任何異步加載器加載,這成爲一個異步模塊。但是我在NodeJS中使用相同的文件變成同步模塊。所以我的觀點是,爲什麼我應該遵循兩個環境的規範,當它不重要時。另外AFAIK,'

1

我的意思是模塊加載的行爲取決於模塊加載程序,而不是模塊的結構。如果是這種情況,爲什麼遵循不同類型模塊的編碼模式?

該模塊是同步或異步加載取決於模塊加載,但你的模塊必須能夠使用一個模塊加載,從而必須包括接口與裝載機溝通。 使用amd define函數無法在node.js中加載模塊。您必須使用require

如果我上面的假設是正確的,那爲什麼還有UMD的規範呢?我的意思是如果一個腳本根據它存在的環境加載,那麼爲什麼要爲通用模塊加載做一個規範?

腳本不基於環境加載,它通過加載器接口加載。 UMD適用於人們在瀏覽器和服務器中使用的庫。庫作者不必創建兩個版本的庫,一個用於瀏覽器,另一個用於節點,因爲UMD知道如何處理這兩個版本。