在前端開發(fā)中,我們可以使用很多模塊化的庫來幫助我們更好的實(shí)現(xiàn)效果,有一些庫的功能類似很多同學(xué)就不知道該如何選擇,比如require和import,今天小千就給大家介紹一下兩者的區(qū)別。
一、區(qū)別
1.require是commonjs的規(guī)范,在node中實(shí)現(xiàn)的api,import是es的語法,由編譯器處理。所以import可以做模塊依賴的靜態(tài)分析,配合webpack、rollup等可以做treeshaking。
2.commonjs導(dǎo)出的值會(huì)復(fù)制一份,require引入的是復(fù)制之后的值(引用類型只復(fù)制引用),es module導(dǎo)出的值是同一份(不包括export default),不管是基礎(chǔ)類型還是應(yīng)用類型。
3.寫法上有差別,import可以使用import * 引入全部的export,也可以使用import aaa, { bbb}的方式分別引入default和非default的export,相比require更靈活。
二、require和import會(huì)不會(huì)循環(huán)引用?
答案是不會(huì),因?yàn)槟K執(zhí)行后會(huì)把導(dǎo)出的值緩存,下次再require或者import不會(huì)再次執(zhí)行。這樣也就不會(huì)循環(huán)引用了。比如a引入了b,b引入了a,如果a再次執(zhí)行那么會(huì)再引入b,那就循環(huán)起來了,但實(shí)際上會(huì)做緩存,再次引入不會(huì)再執(zhí)行??梢酝ㄟ^require.cache來查看緩存的模塊,key為require.resolve(path)的結(jié)果。
三、模塊中有定時(shí)器改變了導(dǎo)出的值,導(dǎo)出的值會(huì)不會(huì)變?
web前端培訓(xùn)1" />
結(jié)果是import引入的值是2,而require引入的值一直是1,這也是require和imort很重要的一個(gè)區(qū)別,es module的export導(dǎo)出的值會(huì)靜態(tài)的綁定,而commonjs exports導(dǎo)出的值是一個(gè)對(duì)象,會(huì)復(fù)制一份。這樣也就出現(xiàn)了這樣的現(xiàn)象。
四、總結(jié)
問 require和import的區(qū)別就是問commonjs和es module的區(qū)別,這兩者一個(gè)是api的規(guī)范,一個(gè)是語言的語法,所以后者可以做靜態(tài)分析,基于這個(gè)實(shí)現(xiàn)treeshaking,同時(shí)es module會(huì)靜態(tài)的綁定導(dǎo)出的值,而commonjs會(huì)復(fù)制一份。但兩者都會(huì)做緩存,所以不會(huì)有循環(huán)引用問題。
以上就是require和import的區(qū)別介紹了,最后歡迎對(duì)web前端開發(fā)培訓(xùn)感興趣的同學(xué)來到千鋒WEB前端培訓(xùn)班參加我們的前端培訓(xùn)課程的學(xué)習(xí),現(xiàn)在咨詢還有免費(fèi)學(xué)習(xí)資料和兩周免費(fèi)試聽等你來。
千鋒web前端培訓(xùn):http://www.2667701.com/page/html5.html