您好,登錄后才能下訂單哦!
http,process等等這些都是模塊
一、Node.js的模塊與Commonjs規(guī)范
1.js的天生缺陷——缺少模塊化管理機制
·表現(xiàn)——JS中容易出現(xiàn)變量被覆蓋,方法被替代的情況(既被污染)。特別是存在依賴關(guān)系時,容易出現(xiàn)錯誤。這是因為JS缺少模塊管理機制,來隔離實現(xiàn)各種不同功能的JS判斷,避免它們相互污染。
·解決——經(jīng)常采用命名空間的方式,把變量和函數(shù)限制在某個特定的作用域內(nèi),人肉約定一套命名規(guī)范來限制代碼,保證代碼安全運行。jQuery中有許多變量和方法,但是無法直接訪問,必須通過jQuery,$調(diào)用 各個方法。
2.Commonjs規(guī)范
不同于jQuery,Commonjs是一套規(guī)范,約定了js如何組織,如何編寫,包括包,二進制,套接字,單元測試等等。大部分標準在擬定和討論之中,首先把執(zhí)行不同任務(wù)的代碼塊和代碼文件看為獨立的模塊,每一個模塊都是一個單獨的作用域,但不是孤立的,可能存在依賴關(guān)系。每個模塊分為三個部分,定義、標識和引用。這套規(guī)范與現(xiàn)實產(chǎn)品如node.js相互影響,良性循環(huán)。
3.NodeJs的模塊管理機制
基于commonjs實現(xiàn)了模塊管理系統(tǒng)。node中每一個js文件都是一個獨立的模塊,在其內(nèi)部不需要有命名空間,不需要擔心變量的污染和方法定義時的隔離。同時模塊之間可以組合形成更強大的模塊或功能包。npm即是用來管理各種功能包的。
二、模塊的分類
在NodeJs中文件和模塊是一一對應(yīng)的
文件分為幾種不同的類型,大概分為核心模塊、本地模塊和通過npm安裝的第三方模塊
根據(jù)模塊的類型有幾種引用模塊的方式
1.可以通過文件路徑來引用模塊
2.通過模塊名來引用
如果用模塊名來引用非核心模塊的話,Node最終會把模塊名映射到
對應(yīng)的模塊文件的路徑,而那些包含核心函數(shù)的核心模塊會在Node啟動時預(yù)先加載
三、簡單的Nodejs模塊
創(chuàng)建模塊:一個入口的js文件,里面加入一些特定的功能
導(dǎo)出模塊:把這個功能和這個文件也就是這個模塊名建立關(guān)系
加載模塊:在其他的文件里引入并加載這個模塊,在NodeJs使用require來完成這個工作
使用模塊:直接調(diào)用模塊中命名好的方法來做一些特定的邏輯處理,完成某種功能
三、簡單的NodeJs模塊
功能描述:
一個學(xué)校,有班級,有老師,有學(xué)生
把學(xué)生看做是一個模塊,把老師看做一個模塊,把班級看做一個模塊
在學(xué)校下添加班級,班級內(nèi)指定老師,然后再添加一群學(xué)生
為了演示模塊的形成路徑,從下往上走
首先是student.js
function add(student){ console.log('Add Student:'+student) } exports.add = add
寫一個add方法,光寫完add方法還不行,還需要把add方法暴露出去
exports是一個對象,在它上面可以掛載任何合法的JavaScript對象
屬性、number、date、string、array等等
有學(xué)生之后就得有老師teacher.js
也是只有一個add方法
function add(teacher){ console.log('Add Teacher:'+teacher) } exports.add = add
現(xiàn)在學(xué)生和老師都有了,就需要加載班級了
班級需要學(xué)生和老師klazz.js
可以使用require函數(shù)來加載模塊,不用擔心在代碼里調(diào)用require會影響全局的命名空間,Node里就沒有全局命名空間這個概念
如果模塊存在并且沒有任何語法錯誤,require就會返回這個模塊的對象,這個require對象指的就是exports
當然還可以賦值給局部變量,使用之前需要用require來導(dǎo)入它
每一個被當前的腳本導(dǎo)入的模塊都會向當前這個腳本暴露一組公開的API,比如說:添加老師
teacher.add()
把屬性賦值給
exports.add = add
module.exports = add
是一樣的
下面來實現(xiàn)一個班級的代碼
同樣是一個方法,2個參數(shù);1個老師,多個學(xué)生
module.exports是真實存在的東西
exports是module.exports的一個輔助方法
最終返回的module.exports給調(diào)用者,掛載屬性和方法
如果module.exports上已有的屬性,exports就會被忽略
推薦使用exports這種方式
var student = require('./student') var teacher = require('./teacher') teacher.add('Scott') function add(teacherName,students){ teacher.add(teacherName) students.forEach(function(item,index){ student.add(item) }) } exports.add = add //module.exports = add
最后新建一個啟動的文件index.js
var klazz = require('./klazz') klazz.add('Scott',['白富美','高富帥'])
這樣一個簡單的小項目就完成了
最后用我們的git bash來啟動node
運行結(jié)果如下:
當然還可以繼續(xù)完善
把學(xué)校暴露出去,我們對這個學(xué)習也就再加個方法叫做exports.add
里面是一個function
add里面也接收一個參數(shù),這個參數(shù)是一個班級的集合把它看做是一個數(shù)組
var klazz = require('./klazz') exports.add = function(klasses){ klasses.forEach(function(item,index){ var _klass = item; var teacherName = item.teacherName var students = item.students klazz.add(teacherName,students) }) }
調(diào)用方法如下:
var klazz = require('./index') klazz.add([{teacherName:'zhangsan',students:['張1','張2','張3']}, {teacherName:'lisi',students:['李1','李2','李3']}])
運行結(jié)果如下:
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。