一、 若是隻是爲了加載依賴 :require和define在使用上沒有區別(若是隻是加載依賴,只用require就能夠了);可是若是你要定義一個模塊被其餘人使用,須要return時就須要define。html
二、 Define定義的模塊,require在加載時,return的值做爲一個參數傳遞到回調函數中。(通常define定義的模塊,return都是一個對象,這樣在require加載的時候,做爲參數傳進去能夠直接使用對象 . 方法獲取到)。webpack
三、 理論上,require.js加載的模塊,必須是按照AMD規範、用define()函數定義的模塊。可是實際上,雖然已經有一部分流行的函數庫(好比jQuery)符合AMD規範,更多的庫並不符合。(我的總結:require中講是否是AMD規範,首先該js文件都是一個全局變量,多個全局變量更是非AMD規範了。其它的屬性方、法都是掛在這個變量下的。不是AMD規範的js文件,在require傳到回調函數中的參數是一個未定義的)web
四、 多個地方require一個js文件,這個js文件實際只會執行一次。segmentfault
一、requirejs的能夠把全部的js文件當成模塊來使用,當程序須要用到對應的js文件時,就把對應的js文件經過添加script標籤,把它加載到頁面中執行。若是須要依賴的文件,就先添加script標籤,在執行當前的文件。異步
二、經過script標籤加載是異步的,js的執行是同步的(即加載的同時js代碼從上往下執行)。因此有依賴的話,函數必須在require的回調函數中執行。async
三、從require的功能能夠看出,一個頁面中有多個js文件用require進行模塊加載會很是好。可是頁面js文件很少就不必了。函數
參考: http://www.javashuo.com/article/p-pfmuyjdw-bx.html 或 https://blog.csdn.net/aitangyong/article/details/49425061requirejs
一、requireJS 加載模塊(js文件)的實現:各個模塊悄無聲息的建立script標籤加載。ui
二、script標籤有onLoad,onerror事件,經過監聽 這寫事件,加載完就就會觸發onload事件,執行相應的函數。這樣就實現了異步加載文件。(script標籤加載js文件是異步的)spa
三、淺談script標籤中的async和defer : http://www.javashuo.com/article/p-aexzjbby-bn.html
經過分析這篇文檔,能夠知道script標籤有沒有 async和defer 屬性的區別。從而實現異步加載的功能。
四、requireJS 屢次使用require加載同一個文件,並不會重複加載這個文件。參考 : https://segmentfault.com/q/1010000007564742
這個 function
實際是一個 factory(工廠模式,不明白的話就去搜下),這個 factory 在須要使用的時候(require("xxxx") 的時候)纔有可能會被調用。
爲何是有可能?由於若是檢查到已經調用過,已經生成了模塊實例,就直接返回模塊實例,而再也不次調用工廠方法了。(即不會再加載文件,將以前的模塊實例返回給它了)
require(['math'], function (math){ // 回調函數中的math參數就是 require加載後返回的模塊實例,回調函數中能夠直接使用這個模塊實例的方法。 alert(math.add(1,1)); // requirejs 是 AMD模塊規範,調用模塊實例的方法是在回調函數中; });
注意 : AMD 和CommonJS 都是經常使用 require()語句加載模塊,可是不一樣於CommonJS,它要求兩個參數。而CommonJS中的require()語句只要加載模塊(js文件)就能夠了。
這樣,模塊方法就能夠在全局中使用了。從這條特性中能夠猜想webpack中js文件用require引入,用的應該是CommonJS模塊規範。和requirejs沒有關係。
var math = require('math'); // CommonJS 中的 require()函數是同步的,而AMD 中的是異步執行的。 math.add(2,3); // 5