溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Node.js(二)——模塊與包管理工具

發(fā)布時間:2020-10-16 13:51:08 來源:網(wǎng)絡(luò) 閱讀:818 作者:mazongfei 欄目:web開發(fā)

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ù)先加載

Node.js(二)——模塊與包管理工具


三、簡單的Nodejs模塊

創(chuàng)建模塊:一個入口的js文件,里面加入一些特定的功能

導(dǎo)出模塊:把這個功能和這個文件也就是這個模塊名建立關(guān)系

加載模塊:在其他的文件里引入并加載這個模塊,在NodeJs使用require來完成這個工作

使用模塊:直接調(diào)用模塊中命名好的方法來做一些特定的邏輯處理,完成某種功能

Node.js(二)——模塊與包管理工具


三、簡單的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é)果如下:

Node.js(二)——模塊與包管理工具



當然還可以繼續(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é)果如下:

Node.js(二)——模塊與包管理工具

向AI問一下細節(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)容。

AI