export
在es6中一個文件可以默認為一個模塊航闺,模塊通過export向外暴露接口,實現(xiàn)模塊間交互等功能
1. export相關(guān)語法
exportDemo.js文件
export var m = 1;
// 等價于
var m = 1;
export { m }
// 導(dǎo)出多個
var a = 1;
var b = 2;
var c = 3;
export { a, b, c }
// 導(dǎo)出對象
export const student = {
name: 'Megan',
age: 18
}
// 導(dǎo)出函數(shù)
export function add(a, b) {
return a + b;
}
錯誤寫法1
var k = 1;
export k;
對應(yīng)正確寫法
export { k }
錯誤寫法2
const obj = {
id: 1,
value: 'lalala'
};
export obj;
對應(yīng)正確寫法
export { obj };
錯誤寫法3
function sum(a, b){
return a + b;
}
export sum;
對應(yīng)正確寫法
export { sum };
導(dǎo)出接口別名
const person = {
name: '張呆',
age: 18,
gender: "male"
}
export { person as boy }
2. export default
exportDemo.js
//一個文件即模塊中只能存在一個export default語句,導(dǎo)出一個當(dāng)前模塊的默認對外接口
export default var i = 0;
3. import
以上述exportDemo.js為例,在importDemo.js中利用import進行導(dǎo)入
import variable from './exportDemo';
console.log(variable); // 0;
代碼解釋:上述import語句僅僅導(dǎo)入了exportDemo.js文件中定義為默認的接口即i = 0
,所以打印輸出0
import variable, { sum, boy } from './exportDemo';
console.log(variable); // 0;
console.log(sum);// function(a, b) { return a + b; }
console.log(boy); // { name: '張呆', age: 18, gender: male}
4. 相關(guān)注意
import和export只能出現(xiàn)在模塊的最外層(頂層)結(jié)構(gòu)中,否則報錯
由于es6模塊是靜態(tài)加載的薇芝,因此import和export不能出現(xiàn)在判斷等動態(tài)語句中
5. ES6 Module
es6 module 中模塊加載方式是靜態(tài)加載,因此import和export不能出現(xiàn)在判斷等動態(tài)語句
采用import獲取的是模塊接口的引用丰嘉,當(dāng)模塊內(nèi)部發(fā)生改變是夯到,import出的接口也會對應(yīng)改變【與commonjs規(guī)范不同,commonjs中獲得的是接口運行結(jié)果的緩存】
es6 module內(nèi)部自動采用嚴格模式
對于es6 module的其他詳細內(nèi)容參考阮一峰老師的 ES6 Module
6. commonjs規(guī)范
commonJS規(guī)范規(guī)定饮亏,每一個模塊內(nèi)部耍贾,module變量代表當(dāng)前模塊,這個變量是一個對象克滴,它的exports屬性(即module.exports)是對外的接口,加載某個模塊其實就是加載module.exports屬性
// test.js
var x = 5;
var add = function(a, b){
return a + b;
}
module.exports = {x, add}
在另一個文件中加載test.js
var test = require('./test.js');
console.log(test.x); // 5
console.log(test.add(1, 2)); // 3
使用import語法加載commonjs模塊
// commonjsDemo.js
const textConst = {
COPY: "復(fù)制",
RUN: "運行"
}
module.exports textConst
// importCommonjsDemo.js
import { COPY, RUN } from './commonjsDemo'
console.log(COPY); // 復(fù)制
console.log(RUN); // 運行
6.1 module對象
Node中提供了一個Module構(gòu)建函數(shù)优床,所有模塊都是Module的實例
function Module(...){
this.id = id;
this.exports = {};
this.parent = parent;
// ....
}
每個模塊內(nèi)部劝赔,都有一個module對象,表示當(dāng)前模塊胆敞,具有以下屬性
module.id 模塊的識別符着帽,通常是帶有絕對路徑的模塊文件名
module.filename 模塊的文件名杂伟,帶有絕對路徑
module.loaded 返回一個布爾值,表示模塊是否已經(jīng)加載完成
module.parent 返回一個對象仍翰,表示調(diào)用該模塊的模塊
module.children 返回一個數(shù)組赫粥,表示該模塊要用到的其他模塊
module.exports 表示模塊對外輸出的值
module.exports
該屬性表示當(dāng)前模塊對外的接口,其他模塊加載時予借,實際上是讀取module.exports變量
exports
為了方便越平,node為每個模塊提供了一個exports變量,指向module.exports灵迫。這等同于在每個模塊的頭部秦叛,存在這樣一行命令
var exports = module.exports;
這樣做的結(jié)果就是在輸出接口的同時,可以向exports對象上添加方法瀑粥;需要注意的是不要將exports重新指向別的值挣跋,否則將會切斷exports和module.exports之間的聯(lián)系
6.2 require命令
基本功能是讀入并執(zhí)行一個javascript文件,并返回該模塊的exports對象狞换,如果沒有指定模塊路徑避咆,則報錯
require的加載規(guī)則
后綴默認為.js
當(dāng)nodejs中遇到require(X)時,按照下面的順序進行處理
如果X為內(nèi)置模塊修噪,返回該模塊查库,不再繼續(xù)執(zhí)行
如果X以"./"或者"/"或者"../"開頭
根據(jù)X所在父模塊確定X的絕對路徑
將X當(dāng)成文件,依次查找下面的問題件割按,只要其中一個存在膨报,則返回存在的文件,不再繼續(xù)執(zhí)行
X
X.js
X.json
X.node
將X當(dāng)成目錄适荣,依次查找下面文件现柠,只要其中一個存在,就返回該文件弛矛,不再繼續(xù)執(zhí)行
X/package.json
X/index.js
X/index.json
X/index.node
如果X不帶路徑
根據(jù)X所在的父模塊够吩,確定X可能的安裝目錄
依次在每個目錄中,將X當(dāng)做文件名或者目錄名加載
拋出"not found"
參考:http://www.ruanyifeng.com/blog/2015/05/require.html
參考:http://javascript.ruanyifeng.com/nodejs/module.html
本文目的僅僅是為了個人查找閱讀等提供方便