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
- export 和export default 均可用于導(dǎo)出(常量 | 函數(shù) | 文件 | 模塊)等订晌。
- 可以在其他文件中通過(guò) import+(常量 | 函數(shù) | 文件 | 模塊)名的方式,將其導(dǎo)入蚌吸,以便能夠進(jìn)行使用锈拨。
- 在一個(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';
- 通過(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;