Node.js和Typescript都有自己模塊化的方式除秀,它們有一點(diǎn)相似也有一些區(qū)別。
Node.js中的export與require
(這部分主要參考廖雪峰的JS教程)
對外輸出變量:
module.exports = variable;
或:
exports.hello = hello;
exports.greet = greet;
引入其他模塊輸出的變量:
var foo = require('other_module');
Node.js模塊原理:
Node.js會(huì)用函數(shù)閉包將每個(gè)文件的內(nèi)容封裝起來算利,以防止全局變量受到污染:
var module = {id: 'moduleName', exports: {} };
function(exports, module) {
? ? // 文件內(nèi)容
? ? exports.foo = 111;
? ? exports.bar = 222;
? ? // 文件內(nèi)容結(jié)束
} (module.exports, module);
其他模塊引用這個(gè)模塊的時(shí)候册踩,只需要找到這個(gè)模塊的module對象并返回module.exports就行了。
注意效拭,我們在對外輸出變量的時(shí)候不能直接對exports賦值暂吉,因?yàn)閑xports只是module.exports的一個(gè)引用而已,如果直接對exports賦值缎患,只是改變了這個(gè)引用的指向慕的,而并沒有改變module.exports的內(nèi)容。
Typescript中的import與export
在Typescript中我們有更加方便的導(dǎo)入導(dǎo)出方法:
export { name1, name2, …, nameN }; // 同時(shí)導(dǎo)出本模塊中的name1挤渔,name2等
export { variable1 as name1, variable2 as name2, …, nameN }; // 同時(shí)導(dǎo)出本模塊中的name1肮街,name2等,但是以別的變量名來發(fā)布
export let name1, name2, …, nameN;// 同時(shí)導(dǎo)出本模塊中的name1判导,name2等
export let name1 = …, name2 = …, …, nameN;// 同上
export default expression;? // 默認(rèn)導(dǎo)出 (每個(gè)腳本只能有一個(gè))
export default function (…) { … } // 可以默認(rèn)導(dǎo)出函數(shù)嫉父,class等
export default function name1(…) { … } // 指定默認(rèn)導(dǎo)出的變量名
export { name1 as default, … };
export * from …; ?// 導(dǎo)入再導(dǎo)出
export { name1, name2, …, nameN } from …;
export { import1 as name1, import2 as name2,…, nameN } from …;
import defaultMember from "module-name";? //? 導(dǎo)入默認(rèn)變量defaultMember,不需要{}
import * as name from "module-name"; ?// 導(dǎo)入所有變量骡楼,name是所有導(dǎo)出變量組成的對象
import { member } from "module-name";? //? 導(dǎo)入非默認(rèn)變量member,需要{}
import { member as alias } from "module-name";? // ?以別名導(dǎo)入
import { member1 , member2 } from "module-name"; // ?導(dǎo)入多個(gè)變量
import { member1 , member2 as alias2 , [...] } from "module-name";
import defaultMember, { member [ , [...] ] } from "module-name"; ?// 既導(dǎo)入默認(rèn)變量稽鞭,也導(dǎo)入非默認(rèn)變量
import defaultMember, * as name from "module-name";? //既導(dǎo)入默認(rèn)變量鸟整,也導(dǎo)入所有變量的整體。此時(shí)name.defaultMember 與 defaultMember完全等價(jià)
import "module-name"; ?// 導(dǎo)入所有變量朦蕴,但是不用一個(gè)對象來封裝篮条,可以直接使用導(dǎo)出變量名