ES6 import和export

export

在es6中一個文件可以默認(rèn)為一個模塊,模塊通過export向外暴露接口,實(shí)現(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)前模塊的默認(rèn)對外接口
export default var i = 0;
3. import

以上述exportDemo.js為例,在importDemo.js中利用import進(jìn)行導(dǎo)入

import variable from './exportDemo';
console.log(variable); // 0;

代碼解釋:上述import語句僅僅導(dǎo)入了exportDemo.js文件中定義為默認(rèn)的接口即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)中,否則報(bào)錯

由于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中獲得的是接口運(yùn)行結(jié)果的緩存】
es6 module內(nèi)部自動采用嚴(yán)格模式
對于es6 module的其他詳細(xì)內(nèi)容參考阮一峰老師的 ES6 Module

6. commonjs規(guī)范

commonJS規(guī)范規(guī)定,每一個模塊內(nèi)部,module變量代表當(dāng)前模塊,這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口,加載某個模塊其實(shí)就是加載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: "運(yùn)行"
}
module.exports textConst
// importCommonjsDemo.js
import { COPY, RUN } from './commonjsDemo'
console.log(COPY); // 復(fù)制
console.log(RUN); // 運(yùn)行
6.1 module對象

Node中提供了一個Module構(gòu)建函數(shù),所有模塊都是Module的實(shí)例

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)前模塊對外的接口,其他模塊加載時,實(shí)際上是讀取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對象,如果沒有指定模塊路徑,則報(bào)錯
require的加載規(guī)則
后綴默認(rèn)為.js
當(dāng)nodejs中遇到require(X)時,按照下面的順序進(jìn)行處理

如果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
本文目的僅僅是為了個人查找閱讀等提供方便

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容