1. 程式人生 > >AMD、CMD、require、import的區別

AMD、CMD、require、import的區別

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'是兩種完全不一樣的。