模塊化編程
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')
模塊定義
- module對象:在每個模塊中,module對象代表該模塊本身。
- 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 總結
- 每個文件是一個模塊,有自己的作用域。
- 在模塊內部 module 變量代表模塊本身。
- 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轉換
結束語:
臺下人走過,不見舊顏色,臺上人唱着心碎離別歌。