1. 程式人生 > 實用技巧 >模組化開發

模組化開發

CommonJS模組開發

CommonJS定義

每個檔案就一個模組,有自己的作用域。在一個檔案裡面定義的變數、函式、類,都是私有的,對其他檔案不可見。

  • 私有作用域不會汙染全域性作用域。
  • 模組可載入多次,只會在第一次載入時執行一次,然後結果會被快取起來,
    以後在使用,就直接讀取快取結果。想要讓模組再次執行,必須清除快取
  • 模組載入順序是按照其在程式碼中出現的順序

基礎用法

1、require()用來引入外部模組,
2、exports()用來匯出當前模組的變數和方法,
3、module物件代表模組物件

單變數方法匯出引入

// a.js  匯出
function add(a, b) {
    return a + b;
}
module.exports = add;
// b.js 引入
const add = require('./a.js');
console.log(add(10, 20));

多方法變數匯出引入

// a.js 匯出
function add(a, b) {
    return a + b;
}

function mul(a, b) {
    return a * b;
}

module.exports = {
    add,
    mul
};
// b.js 引入
const { add, mul } = require('./a.js');

console.log(add(10, 20));
console.log(mul(10, 20));

補充說明:

//const { add, mul } = require('./a.js');
const opt = require('./a.js');
const add = opt.add
const mul = opt.mul

和上面的註釋是等價的,這就是解構的語法.

物件解構
let node = {
        type : 'identifier',
        name : 'foo'
};
let {type,name} = node;
console.log(type);//'identifier'
console.log(name);//'foo'

ES6模組化開發

ES6的模組化分為匯出(export)與匯入(import)兩個模組。

export、import

在ES6中每一個模組即是一個檔案,在檔案中定義的變數,函式,物件在外部是無法獲取的。如果你希望外部可以讀取模組當中的內容,就必須使用export來對其進行暴露(輸出)。

然後可以建立一個檔案,以import的形式將這個變數進行引入:

單變數

export let myName="laowang";
import {myName} from "./test.js";
console.log(myName);//laowang

多變數

let myName="laowang";
let myAge=90;
let myfn=function(){
    return "我是"+myName+"!今年"+myAge+"歲了"
}
export {
    myName,
    myAge,
    myfn
}
/******************************接收的程式碼調整為**********************/
import {myfn,myAge,myName} from "./test.js";
console.log(myfn());//我是laowang!今年90歲了
console.log(myAge);//90
console.log(myName);//laowang

如果你不想暴露模組當中的變數名字,可以通過as來起別名

let myName="laowang";
let myAge=90;
let myfn=function(){
    return "我是"+myName+"!今年"+myAge+"歲了"
}
export {
    myName as name,
    myAge as age,
    myfn as fn
}
/******************************接收的程式碼調整為**********************/
import {fn,age,name} from "./test.js";
console.log(fn());//我是laowang!今年90歲了
console.log(age);//90
console.log(name);//laowang

也可以直接匯入整個模組,將上面的接收程式碼修改為:

import * as info from "./test.js";//通過*來批量接收,as 來指定接收的名字
console.log(info.fn());//我是laowang!今年90歲了
console.log(info.age);//90
console.log(info.name);//laowang

預設匯出(default export)

一個模組只能有一個預設匯出,對於預設匯出,匯入的名稱可以和匯出的名稱不一致。

/******************************匯出**********************/
export default function(){
    return "預設匯出一個方法"
}
/******************************引入**********************/
import myFn from "./test.js";//注意這裡預設匯出不需要用{}。
console.log(myFn());//預設匯出一個方法

可以將所有需要匯出的變數放入一個物件中,然後通過default export進行匯出

/******************************匯出**********************/
export default {
    myFn(){
        return "預設匯出一個方法"
    },
    myName:"laowang"
}
/******************************引入**********************/
import myObj from "./test.js";
console.log(myObj.myFn(),myObj.myName);//預設匯出一個方法 laowang

同樣也支援混合匯出

/******************************匯出**********************/
export default function(){
    return "預設匯出一個方法"
}
export var myName="laowang";
/******************************引入**********************/
import myFn,{myName} from "./test.js";
console.log(myFn(),myName);//預設匯出一個方法 laowang