require OR import

以前在CommonJS中否纬,我們用module.exports和require來導(dǎo)出和導(dǎo)入模塊虱黄,而到了ES6卻變成了export和import了蹬刷,這兩者到底有什么區(qū)別呢畴博?
  一句話總結(jié):CommonJS模塊是運行輸出(加載)一個值(或?qū)ο?的拷貝笨忌,而ES6模塊則是編譯時輸出(加載)一個值的引用(或者叫做連接).
  這樣的差異在平常使用是不易被察覺的,可是一旦出現(xiàn)循環(huán)引用俱病,兩者的差異就很明顯了官疲。直接的循環(huán)引用(a引用b,b又引用a)一般不會有,但在依賴關(guān)系復(fù)雜的大項目中亮隙,很容易出現(xiàn)a引用b,b引用其它模塊,在若干次引用后途凫,模塊n又引用回a這樣的情況。為了講解的方便我們直接構(gòu)造出一個a,b相互引用的項目溢吻。
  首先维费,我們來看看CommonJS模塊中的現(xiàn)象:

// APage.js 關(guān)鍵代碼
let BPage = require('./BPage');
class APage extends Component {
  render() {
    return (
      <View style={styles.containerAll} >
        <TouchableOpacity style={styles.btn} onPress={this.onPress.bind(this)}>
            <Text>PushToB</Text>
        </TouchableOpacity>
      </View>
    );
  } 
  onPress() {
    this.props.navigator.push(BPage);
  }
}
var route = {
  key: 'APage',
  component: APage,
};
module.exports = route;

// BPage.js 關(guān)鍵代碼
let APage = require('./APage');
class BPage extends Component {
  constructor(props) {
    super(props);
    console.log('BPage alloc');
  }
  render() {
    return (
      <View style={styles.containerAll} >
        <TouchableOpacity style={styles.btn} onPress={this.onPress.bind(this)}>
            <Text>resetToA</Text>
        </TouchableOpacity>
      </View>
    );
  }
  onPress() {
    this.props.navigator.resetTo(APage);
  }
}
var route = {
  key: 'BPage',
  component: BPage,
};
module.exports = route;

commonJS.png

  可以看到,APage正常顯示促王,并且點擊PushToB可以正常顯示出BPage犀盟,可從BPage再Reset到APage就成了空白了。這是為什么呢蝇狼?
  我們來仔細分析一下整個過程:CommonJS的一個模塊阅畴,就是一個腳本文件,require命令第一次加載該腳本迅耘,就會執(zhí)行整個腳本贱枣,然后在內(nèi)存生成一個對象监署。本例在index.js中先require了APage.js,那就開始執(zhí)行該腳本纽哥,可是在執(zhí)行過程中先遇到了let BPage = require('./BPage');這時候就會先去執(zhí)行BPage.js焦匈。在BPage.js中又會遇到let APage = require('./APage');但這時候APage.js已經(jīng)開始執(zhí)行了,不會重復(fù)執(zhí)行昵仅,所以系統(tǒng)會去模塊對應(yīng)的exports屬性取值缓熟,可是因為APage.js還沒執(zhí)行完,從exports屬性中只能取回已經(jīng)執(zhí)行的部分,所以APage還是空的摔笤,也就是說resetTo(APage)其實是reset到一個空够滑。接著BPage.js會繼續(xù)往下執(zhí)行,等到全部執(zhí)行完畢吕世,再把執(zhí)行權(quán)還給APage.js彰触。
  從上面的例子可以看出,在復(fù)雜項目中加載CommonJS模塊需要非常小心處理各模塊之間的引用關(guān)系。接下來我們來看看同樣的場景在ES6中會是怎樣:

// APage.js 關(guān)鍵代碼
import BPage from './BPage';
...//中間部分與上文相同虐秦,故不重復(fù)貼代碼
export default route;

// BPage.js 關(guān)鍵代碼
import APage from './APage';
...//中間部分與上文相同导犹,故不重復(fù)貼代碼
export default route;

ES6.png

  只是把導(dǎo)入和導(dǎo)出改為import和export,這一次就可以順利走完整個流程尔许,得到我們想要的。這是因為import只是指向被加載模塊终娃,我們只需要保證真正取值的時候能夠取到值即可味廊。與require時相同,在APage.js中遇到import BPage from './BPage';也是會先去執(zhí)行BPage.js,也就是說BPage.js在遇到import APage from './APage';時棠耕,APage.js同樣是沒執(zhí)行完余佛,這時候APage是undefined。不同的是使用import從一個模塊加載變量窍荧,那些變量不會被緩存辉巡,而是成為一個指向被加載模塊的引用。所以等到BPage.js執(zhí)行完蕊退,把控制權(quán)交回給APage.js郊楣,這時就一切正常了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咕痛,一起剝皮案震驚了整個濱河市痢甘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茉贡,老刑警劉巖塞栅,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡放椰,警方通過查閱死者的電腦和手機作烟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾医,“玉大人拿撩,你說我怎么就攤上這事∪缪粒” “怎么了压恒?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長错邦。 經(jīng)常有香客問我探赫,道長,這世上最難降的妖魔是什么撬呢? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任伦吠,我火速辦了婚禮,結(jié)果婚禮上魂拦,老公的妹妹穿的比我還像新娘毛仪。我一直安慰自己,他們只是感情好芯勘,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布箱靴。 她就那樣靜靜地躺著,像睡著了一般借尿。 火紅的嫁衣襯著肌膚如雪刨晴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天路翻,我揣著相機與錄音,去河邊找鬼茄靠。 笑死茂契,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的慨绳。 我是一名探鬼主播掉冶,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脐雪!你這毒婦竟也來了厌小?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤战秋,失蹤者是張志新(化名)和其女友劉穎璧亚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脂信,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡癣蟋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年透硝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疯搅。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡濒生,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔欧,到底是詐尸還是另有隱情罪治,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布礁蔗,位于F島的核電站觉义,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘦麸。R本人自食惡果不足惜谁撼,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滋饲。 院中可真熱鬧厉碟,春花似錦、人聲如沸屠缭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵曹。三九已至款咖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奄喂,已是汗流浹背铐殃。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跨新,地道東北人富腊。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像域帐,于是被迫代替她去往敵國和親赘被。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容