2013-09-30 104 views
2

我真的不明白RequireJS的好處。如果我使用UglifyJS縮小並連接所有文件,並在關閉</body>標記之前放置單個生成的JS文件,那麼是否仍需要使用RequireJS?除了將15KB添加到我的頁面大小之外,RequireJS提供的UglifyJS無法獲得哪些好處?UglifyJS可以替代RequireJS嗎?

+0

從[require.js主頁](http://requirejs.org/):「*使用像RequireJS這樣的模塊化腳本加載器可以提高代碼的速度和質量*」。我認爲這一切都說。也許還可以閱讀[Why modules](http://requirejs.org/docs/why.html)和[爲什麼選擇AMD](http://requirejs.org/docs/whyamd.html)。 – Bergi

+0

另請參閱:http://stackoverflow.com/questions/11531091/how-much-speed-is-gained-with-requirejs-amd-in-js –

+0

從上面的問題:「如果你的大webapp可以推遲加載您的模塊的一個子集,直到晚些時候(例如在特定的用戶操作之後),這些模塊可以單獨進行優化,並在生產中異步加載。「 –

回答

3

使用requireJs的要點是要有一個模塊化代碼的理想方法。假設你有一個擁有數千行代碼的應用程序,你不想在一個文件中處理這一切。所以如果你開始把它分成不同的文件,你需要一種方法來以正確的順序加載所有的單個文件。當然,您可以創建20個腳本標記,並確保它們按照正確順序排列,但隨着代碼的增長,您必須添加更多腳本標記,並且必須爲每個文件找到正確的位置。這就是要求JJ有用的原因。

比方說你有一個3腳本A.js取決於B.js取決於C.js

與腳本變量:它會是這樣的:

<script src="C.js"></script> 
<script src="B.js"></script> 
<script src="A.js"></script> 


//A.js 
    console.log('A' + B) 
//B.js  
    B = 'B' + C 
//C.js 
    C = 'C' 
}) 

與requireJs

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

,並在每個腳本聲明的依賴條件:

//A.js 
require(['B.js'], function (B) { 
    console.log('A' + B) 
}) 
//B.js  
define(['C.js'], function (C) { 
    return 'B' + C 
}) 
//C.js 
define([], function() { 
    return 'C' 
}) 

這是一個非常簡單的例子,但重點是您不需要關心模塊的順序,因爲requireJs會以正確的順序加載。

回到你的問題,優化器更多的是附加的,所以如果你有一個適合單個文件並且仍然可以維護的小代碼庫,只需使用uglifyJs。但是,如果你想在模塊中分割你的代碼,requireJs是最好的選擇。

0

那麼,如果您的網站上的每個頁面使用單個文件,那麼代碼重用將會是糟糕的

你不想複製/粘貼相同的代碼到每個頁面。這些文件也不會被緩存,這會大大增加您的頁面加載時間。

參見:RequireJS's "why" page

+0

我假設OP意味着一個'main.min.js'網站包,而不是每頁一個腳本。 – Mathletics

0

隨着requirejs您可以在JS有你有其他編程語言相同的發展過程。

您可以編寫模塊,通過簡單地引用它們的包含文件,可以輕鬆地將這些模塊重新用於其他項目。

最終,當爲網頁寫作時,requirejs has an optimizer會將一些腳本中的模塊醜化和組合在一起。

1

UglifyJS和RequireJS有非常不同的用途,並且都可以適用於您的情況。

RequireJS和一般異步模塊定義背後的想法是將您的代碼分解爲更小的塊,以便於管理。在性能方面,它有兩個主要優點:

  • 更快的加載,因爲你可以在平行
  • 更小的空間加載多個塊,因爲你只加載你的代碼,你真的需要在當前的背景下
  • 零件

一個很好的例子是圖表庫。瀏覽器使用不同的標準來渲染圖形:svg,vml,canvas等。圖表庫將爲每個標準提供代碼,但是在運行時它只會加載與特定設備和瀏覽器相關的部分。