SeaJs與RequireJs執行差別

seajs與requirejs在模塊的加載方面是沒有差別的,不管是requirejs在定義模塊時定義的依賴模塊,仍是seajs在factory函數中require的依賴模塊,在會在加載當前模塊時被載入,異步,而且順序不可控。差別在於factory函數執行的時機。異步

 

爲了加強對比,咱們在定義依賴模塊的時候,故意讓它們的factory函數要執行至關長的時間,好比1秒:函數

// dep_A.js定義以下,dep_B、dep_C定義同理
 define(function(require, exports, module) { (function(second) { var start = +new Date(); while (start + second * 1000 > +new Date()) {} })(window.EXE_TIME); // window.EXE_TIME = 1;此處會連續執行1s
 exports.foo = function() { console.log("A"); } })

爲了加強對比,設置了三組進行對照試驗,分別是:requirejs

//require.js:
require(["dep_A", "dep_B", "dep_C"], function(A, B, C) { }); //sea.js:
define(function(require, exports, module) { var mod_A = require("dep_A"); var mod_B = require("dep_B"); var mod_C = require("dep_C"); }); //sea.js(定義依賴但並不require):
define(["dep_A", "dep_B", "dep_C"], function(require, exports, module){ }

接下來咱們看看代碼執行的瀑布圖:ui

  1.require.js:在加載完依賴模塊以後當即執行了該模塊的factory函數lua

2.sea.js: 下面兩張圖應該放在一塊兒比較。兩處代碼都同時加載了依賴模塊,但由於沒有require的關係,第三張圖中沒有像第二張圖那樣執行耗時的factory函數。可見seajs執行的原則正如CMD標準中所述Execution must be lazy。spa

我想進一步表達的是,不管requirejs和seajs,一般來講大部分的邏輯代碼都會放在模塊的factory函數中,因此factory函數執行的代價是很是大的。但上圖也一樣告訴咱們模塊的define,甚至模塊文件的Evaluate代價很是小,與factory函數無關。因此咱們是否是應該儘量的避免執行factory函數,或者等到咱們須要的指定功能的時候才執行對應的factory函數?好比:code

document.body.onclick = function () { require(some_kind_of_module); }
相關文章
相關標籤/搜索