AMD、CMD、require、import的區別
阿新 • • 發佈:2018-11-17
AMD 推崇依賴前置
CMD 推崇就近依賴
什麼意思呢?就是AMD在定義模組的時候要先宣告其依賴的模組。例如這樣:
define(['jquery'],function($){
var backButton = $('.backToTop');
return {
backButton
};
});
CMD沒有這裡嚴格的要求,它只要依賴的模組在附近就可以了,例如下面這樣:
define(function(require, exports, module) {
var a = require('./a') // 依賴可以就近
a.data( )
var b = require('./b')
b.data()
})
AMD和CMD最大的區別是對依賴模組的執行時機處理不同,注意不是載入的時機或者方式不同。
有些人說requireJS是非同步載入模組,SeaJS是同步載入模組,這麼理解實際上是不準確的,其實載入模組都是非同步的,只不過AMD依賴前置,js可以方便知道依賴模組是誰,立即載入,而CMD就近依賴,需要使用把模組變為字串解析一遍才知道依賴了那些模組,這也是很多人詬病CMD的一點,犧牲效能來帶來開發的便利性,實際上解析模組用的時間短到可以忽略、
es6中import、require引用的區別
require的使用非常簡單,module.exports後面的內容是什麼,require的結果就是什麼,物件、數字、字串、函式……再把require的結果賦值給某個變數。
理論上require是可以放在任何地方,比如:
require('./test')()
require('./test').list
import是編譯的(require是實時執行),必須放在檔案的頭部,這和其他所有程式語言風格一致。import有很多種用法,比如:
import $ from 'jquery'
import * as _ from '_'
import {a,b,c} from './compontents'
import {a as aa, b as bb, c} from './compontents'
as關鍵字
有過其他程式設計經驗的同學應該很容易理解,簡單的說就是取一個別名。
default關鍵字
我們在通過export方式匯出,在匯入時要加{ },export default則不需要,為模組指定預設輸出。
//a.js
const a = ['a']
export default a
export const map = ()=>{}
//b.js
import a from './a'
根據上面的經驗,所以我們還可以這樣;
import a,{map} from './a';
由此可見我們得出的結論是:
遵循規範
require 是 AMD規範引入方式
import是es6的一個語法標準,如果要相容瀏覽器的話必須轉化成es5的語法
呼叫時間
require是執行時呼叫,所以require理論上可以運用在程式碼的任何地方
import是編譯時呼叫,import命令具有提升效果,會提升到整個模組的頭部,最好放在檔案開頭
本質
require是賦值過程,import是解構過程,在import遇到default的時候,和require完全不同。
require('jquery') 和 import $ from 'jquery'是兩種完全不一樣的。