Common JS

模塊化編程

1.什麼是模塊
在node.js中,所謂的模塊,就是一個文件,通常是js文件或json文件。
換言之,一個js文件就是一個模塊。

模塊是Node.js應用程序的基本組成部分。

2.爲什麼需要模塊機制?

回顧一下,在瀏覽器爲何需要模塊化?

主要是解決兩大問題:

 全局變量污染
 繁瑣的文件依賴

到了服務端,情況是有些不同的。

在服務端,只有js代碼,沒有html。所以在服務端不可能借助script標籤來引入js文件。

如何在一個js文件中,引入其他的js文件,需要一種機制來完成,這種機制就是模塊機制。

爲了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。

可以稍微回顧一下,模塊化的發展簡史:

萌芽時代,使用的編程技巧

09年Node.js在出現,實現了commonjs規範

三大派系之保守派,遵循了commonjs規範,提出了browserify工具

三大派系之革新派,提出了AMD規範,推出了require.js

三大派系之中立派,提出了CMD規範,推出了sea.js

es6,自己實現了export和import的模塊化

而且,在node.js也會支持es6的模塊化。

什麼是CommonJs?

官方:
CommonJs規範主要彌補當前JavaScript沒有標準的缺陷,它的終極目標是提供一個類似Python,Ruby和Java標準庫。

  • CommonJs 是 JavaScript 語言的模塊化規範
  • CommonJs 是模塊化的標準,nodejs是CommonJs(模塊化)的實現

CommonJs 是一種 JavaScript 語言的模塊化規範,它通常會在服務端的 Nodejs 上使用。項目是由多個模塊組成的,模塊和模塊之間的調用,需要各個模塊有相同規範的 API,這樣一來在使用的過程中不會有那麼多的學習成本,並且對於單個模塊來說是類聚的。

CommonJS模塊的特點。

  • 代碼在模塊作用域,不會污染全局作用域。
  • 第一次加載某個模塊時,Node會緩存該模塊。以後再加載該模塊,就直接從緩存取出該模塊的module.exports屬性。
  • 模塊加載的順序,按照其在代碼中出現的順序。

模塊化規範給項目帶來極大的好處,在業務複雜,模塊衆多的大型項目中,開發者都遵循相同的規則來開發各自的模塊,通過模塊規範來約束,大家不需要太多的溝通或者大量的文檔來說明自己的模塊使用規則,成千上萬的模塊就這樣生產,並能夠容易的使用。它的意義不僅是讓模塊看起來很規範,在合作開發、社區中傳播中也起到了重大的作用

模塊規範

每個文件就是一個模塊,有自己的作用域。在一個文件裏面定義的變量、函數、類,都是私有的,對其他文件不可見。

CommonJS規範規定,每個模塊內部,module變量代表當前模塊。
這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口。
加載某個模塊,其實是加載該模塊的module.exports屬性。

CommonJS模塊規範主要分爲三部分:模塊引用、模塊標識、模塊定義。

模塊引用

require命令的基本功能是,讀入並執行一個JavaScript文件,然後返回該模塊的exports對象。如果沒有發現指定模塊,會報錯。(說白了就是將另一個文件中暴露的值,引用到本文件中。)

 var math = require("math");

require命令用於加載文件,後綴名默認爲.js。

模塊標識

模塊引入沒有帶路徑,引用的是當前所在目錄下的node_modules目錄。

 var math = require("math");

模塊引入的有其他路徑,就需要使用到相對路徑或絕對路徑。

var add = require('./add.js')

模塊定義

  1. module對象:在每個模塊中,module對象代表該模塊本身。
  2. export 屬性:module對象的一個屬性,他向外提供接口。

require 規則

  • / 表示絕對路徑,./ 表示相對於當前文件的。
  • 支持js、json、node擴展名,不寫後綴則依次嘗試。
  • 不寫路徑則認爲是模塊或者各級node_modules內的第三方模塊。

require 特性

  • module 被加載的時候執行,加載後緩存。
  • 一旦出現某個模塊被循環加載,只輸出已經執行的部分,還未執行的部分不會輸出。(避免這種寫法)

例子:

//comon.js代碼

const text = "非凡主力";
function add(num1, num2){
    return console.log(num1+num2);
}

module.exports.add = add;
module.exports.text = text;
//或
module.exports = {add,text}

引用

// index.js

var com = require('./comon.js'); //引入

com.add(2,3); //調用
let txt = com.text;
console.log(txt);

common.js 總結

  1. 每個文件是一個模塊,有自己的作用域。
  2. 在模塊內部 module 變量代表模塊本身。
  3. module.exports 屬性代表模塊對外接口。

ES6 的 導入導出

模塊功能主要由兩個命令構成:export和import。export命令用於規定模塊的對外接口,import命令用於輸入其他模塊提供的功能。

導出:export

// profile.js
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export { firstName, lastName, year };

導入:import … from

// main.js
import { firstName, lastName, year } from './profile.js';

function setName(element) {
  element.textContent = firstName + ' ' + lastName;
}

需要使用babel轉換

結束語:
臺下人走過,不見舊顏色,臺上人唱着心碎離別歌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章