export圃伶,export default堤如,module.exports,import窒朋,require之間的區(qū)別和關(guān)聯(lián)

module.exports

Node應(yīng)用由模塊組成搀罢,采用CommonJS模塊規(guī)范。根據(jù)這個(gè)規(guī)范侥猩,每個(gè)文件就是一個(gè)模塊榔至,有自己的作用域。在這些文件里面定義的變量欺劳、函數(shù)唧取、類(lèi)铅鲤,都是私有的,對(duì)外不可見(jiàn)枫弟,因此規(guī)避掉了作用域污染邢享。

根據(jù)CommonJS規(guī)定,每個(gè)模塊內(nèi)部淡诗,module變量代表當(dāng)前模塊骇塘,這個(gè)變量是一個(gè)對(duì)象,它的exports屬性(即module.exports)是對(duì)外的接口韩容。加載某個(gè)模塊款违,其實(shí)就是加載該模塊的exports屬性。

舉例:通過(guò)module.exports輸出變量 age 和 sayHelloTo 函數(shù)宙攻。

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    module.exports.age = age; 
    module.exports.sayHelloTo=sayHelloTo;

require:用于加載模塊

var temp = require('./MyModule.js');  //這里也可以使用 import myModule from './MyModule.js'
console.log(temp.age); // 7 
console.log(temp.sayHelloTo("Steve")); // hello Steve

額外說(shuō)明:對(duì)于自定義的模塊奠货,需要使用相對(duì)路徑,否則會(huì)提示找不到模塊/組件(默認(rèn)情況下座掘,非相對(duì)路徑的引用递惋,會(huì)從node_modules文件夾中查找)

exports 與 module.exports

為了方便,node為每個(gè)模塊提供了一個(gè)exports變量溢陪,指向module.exports萍虽。這等同于在每個(gè)模塊頭部,有這么一行代碼:

var exports = module.exports;

因此形真,我們可以直接在exports對(duì)象上添加方法(等同于在 module.exports 添加一樣)

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    exports.age = age;  //等效于:  module.exports.age = age;
    exports.sayHelloTo=sayHelloTo;  //等效于: module.exports.sayHelloTo=sayHelloTo;

P.S.不能直接將exports指向一個(gè)值杉编,這會(huì)切斷 exports 與 module.exports 的聯(lián)系(但是可以用module.exports來(lái)指向一個(gè)值)

./MyModule.js
    var age = 7; 
    var sayHelloTo= function (name) { 
        return "hello " + name;
    }; 
    exports = age;  //不要這么干。這么做會(huì)切斷exports與module.exports的聯(lián)系

不同于CommonJS咆霜,ES6使用 export 和 import 來(lái)導(dǎo)入邓馒、導(dǎo)出模塊

用 export 導(dǎo)出的模塊,需要用 import 來(lái)進(jìn)行導(dǎo)入蛾坯,而不能用 require光酣。
P.S.:export 命令規(guī)定的是對(duì)外的接口,必須與模塊內(nèi)部的變量建立一一對(duì)應(yīng)的關(guān)系

const utils = {
    showSth : function(){
        console.log("showSth");
    },
    saySth : function(){
        console.log("saySth");
    }
}
//導(dǎo)出的3種方式
export var m = utils; // 方式1脉课,這種方式在引用的時(shí)候需要這樣: import {m} from './utils.js';
export {utils}; // 方式2救军,用大括號(hào)來(lái)導(dǎo)出變量,如果導(dǎo)出的變量有多個(gè)倘零,則{變量1唱遭,變量2,變量3...呈驶,變量N}拷泽。這種方式在引用的時(shí)候需要這樣: import {utils} from './utils.js';
export {utils as myUtils}; // 方式3,這種方式在引用的時(shí)候需要這樣: import {myUtils} from './utils.js';
在引用的地方,也可以直接指定別名司致,如:import {myUtils as utils} from './utils.js';

MDN對(duì)于export和import的語(yǔ)法說(shuō)明:

export語(yǔ)法:
    export { name1, name2, …, nameN };
    export { variable1 as name1, variable2 as name2, …, nameN };
    export let name1, name2, …, nameN; // also var, const
    export let name1 = …, name2 = …, …, nameN; // also var, const
    export function FunctionName(){...}
    export class ClassName {...}

    export default expression;
    export default function (…) { … } // also class, function*
    export default function name1(…) { … } // also class, function*
    export { name1 as default, … };

    export * from …;
    export { name1, name2, …, nameN } from …;
    export { import1 as name1, import2 as name2, …, nameN } from …;
    export { default } from …;
import語(yǔ)法:
    import defaultExport from "module-name";
    import * as name from "module-name";
    import { export } from "module-name";
    import { export as alias } from "module-name";
    import { export1 , export2 } from "module-name";
    import { export1 , export2 as alias2 , [...] } from "module-name";
    import defaultExport, { export [ , [...] ] } from "module-name";
    import defaultExport, * as name from "module-name";
    import "module-name";
    var promise = import(module-name);

export 和 export default

  1. export 和export default 均可用于導(dǎo)出(常量 | 函數(shù) | 文件 | 模塊)等订晌。
  2. 可以在其他文件中通過(guò) import+(常量 | 函數(shù) | 文件 | 模塊)名的方式,將其導(dǎo)入蚌吸,以便能夠進(jìn)行使用锈拨。
  3. 在一個(gè)文件或者模塊中,export羹唠、import 可以有多個(gè)奕枢,但 export default 僅有一個(gè)。
    const utils = {
        showSth : function(){
            console.log("showSth");
        },
        saySth : function(){
            console.log("saySth");
        }
    }
    const name = "my name is Artech";
    export {name}; //命名導(dǎo)出
    export {utils};
    
    對(duì)于命名方式導(dǎo)出的佩微,在導(dǎo)入的時(shí)候必須使用相應(yīng)對(duì)象的相同名稱
    引用的時(shí)候:import {utils,name as myName} from './utils.js';
    
  4. 通過(guò) export 方式導(dǎo)出缝彬,在導(dǎo)入時(shí)要用花括號(hào){ };而通過(guò) export default 方式導(dǎo)出的哺眯,則不需要:
    如通過(guò) export default 導(dǎo)出
       export default utils;  
    則在使用的時(shí)候不用加花括號(hào)谷浅,且導(dǎo)入時(shí)的名字可以自定義,如:
       import myUtils from './utils.js';  對(duì)于默認(rèn)方式導(dǎo)出的奶卓,則導(dǎo)入的時(shí)候一疯,名稱可以隨便取
    
    默認(rèn)導(dǎo)出:不能使用 let,var 或 const 作為默認(rèn)導(dǎo)出
    

import *

將一個(gè)js文件中定義的方法夺姑,模塊墩邀,對(duì)象等,全部導(dǎo)出盏浙,一般結(jié)合別名使用眉睹,如:

myModule.js
   export const fun1 = ()=>{}
   export const objInfo = {...};
demo.js:引用mymODULE。JS
    import * as myAlias from './myModule';
    //fun1()和objInfo都是定義在myModule中的方法和對(duì)象
    myAlias.fun1();
    myAlias.objInfo;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末废膘,一起剝皮案震驚了整個(gè)濱河市竹海,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丐黄,老刑警劉巖斋配,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異孵稽,居然都是意外死亡许起,警方通過(guò)查閱死者的電腦和手機(jī)十偶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)菩鲜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惦积,你說(shuō)我怎么就攤上這事接校。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蛛勉,是天一觀的道長(zhǎng)鹿寻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诽凌,這世上最難降的妖魔是什么毡熏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮侣诵,結(jié)果婚禮上痢法,老公的妹妹穿的比我還像新娘。我一直安慰自己杜顺,他們只是感情好财搁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著躬络,像睡著了一般尖奔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上穷当,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天提茁,我揣著相機(jī)與錄音,去河邊找鬼馁菜。 笑死甘凭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火邓。 我是一名探鬼主播丹弱,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铲咨!你這毒婦竟也來(lái)了躲胳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纤勒,失蹤者是張志新(化名)和其女友劉穎坯苹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摇天,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粹湃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泉坐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片为鳄。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腕让,靈堂內(nèi)的尸體忽然破棺而出孤钦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布偏形,位于F島的核電站静袖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俊扭。R本人自食惡果不足惜队橙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萨惑。 院中可真熱鬧喘帚,春花似錦、人聲如沸咒钟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)朱嘴。三九已至倾鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萍嬉,已是汗流浹背乌昔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壤追,地道東北人磕道。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像行冰,于是被迫代替她去往敵國(guó)和親溺蕉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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