您好,登錄后才能下訂單哦!
在Node.js中,以模塊為單位劃分所有的功能,并且提供了一個(gè)完整的模塊加載機(jī)制,所以我們可以將應(yīng)用程序劃分為各個(gè)不同的部分,并且對這些部分進(jìn)行很好的協(xié)同管理。通過將各種可重用代碼編寫在各種模塊中的方法,可以大大減少應(yīng)用程序的代碼量,提高應(yīng)用程序的開發(fā)效率以及應(yīng)用程序代碼的可讀性。通過模塊加載機(jī)制,可以將各種第三方模塊引入到我們的應(yīng)用程序中。
在node.js中,提供npm包管理工具,用于從第三方網(wǎng)站上下載各種Node.js包。
一、模塊
1.1 加載模塊
在Node.js中,以模塊為單位劃分所有的功能,一個(gè)Node.js應(yīng)用程序由大量的模塊組成,每一個(gè)模塊都是一個(gè)JavaScript文件,在加載node.js中預(yù)先定義的核心模塊,我們只需要require('模塊名'),例如require('http'),在將第三方類庫引入到我們的應(yīng)用程序時(shí),需要指定該文件的完整路徑及文件名,例如 require('./script/foo.js')
1.2 訪問模塊
1.2.1使用exports對象訪問
在一個(gè)模塊文件中定義變量、函數(shù)或?qū)ο笾辉谠撃K內(nèi)有效,當(dāng)你需要從外部模塊引用這些變量、函數(shù)或?qū)ο髸r(shí),需要再改模塊內(nèi),例如,建一個(gè)testModule.js,代碼如下:
var testVar = "Can you see me now ? "; var funName = function(name){ console.log('My name is' + name); } exports.testVar = testVar ; exports.funName = funName ;
那么我們想在http.js中使用這些變量、函數(shù)或?qū)ο?,可在http.js中書寫如下代碼:
var test1 = require('./testModule.js'); // 通過test1訪問testModule.js模塊內(nèi)的testVar變量 和funName函數(shù) console.log(test1.testVar) test1.funName('Luckfine')
node 運(yùn)行下這個(gè)http.js node http.js
運(yùn)行結(jié)果如下
1.2.2使用module.exports對象訪問
當(dāng)你需要從外部模塊引用這些變量、函數(shù)或?qū)ο髸r(shí),使用exports對象,也可以使用module.exports,但是需要將模塊定義一個(gè)類時(shí),只能用module.exports。
例如定義一個(gè)testModule類,在testModule.js中如下代碼:
var _name,_age var name = '',age = 0; var foo = function(name,age){ _name = name ; _age = age ; } // 獲取私有變量_name的變量只 foo.prototype.GetName = function(name){ return _name; }; // 設(shè)置私有變量_name的變量值 foo.prototype.SetName = function(name){ _name = name; } // 獲取私有變量_age的變量只 foo.prototype.GetAge = function(age){ return _age; }; // 設(shè)置私有變量_name的變量值 foo.prototype.SetAge = function(age){ _age = age; } foo.prototype.name = name; foo.prototype.age = age; module.exports = foo;
那么我們想在http.js中使用這個(gè)類的變量、函數(shù)或?qū)ο?,可在http.js中書寫如下代碼:
var foo = require('./testModule.js'); var myFoo = new foo('Luckfine',18); console.log('獲取修改前的私有變量值') console.log(myFoo.GetName()); console.log(myFoo.GetAge()); console.log('修改私有變量'); myFoo.SetName('Baby'); myFoo.SetAge(16); console.log('獲取修改后的私有變量值') console.log(myFoo.GetName()); console.log(myFoo.GetAge()); console.log('獲取修改前的公有變量值') console.log(myFoo.name); console.log(myFoo.age); console.log('修改公有變量') myFoo.name = "Tom"; myFoo.age = 20; console.log('獲取修改后的公有變量值') console.log(myFoo.name); console.log(myFoo.age);
然后在iTerm中運(yùn)行node http.js命令,運(yùn)行結(jié)果如下所示
總結(jié)以上:
也就是說,js文件和js文件之間有兩種合作的模式:
1) 某一個(gè)js文件中,提供了函數(shù),供別人使用。 只需要暴露函數(shù)就行了; exports.msg=msg;
2) 某一個(gè)js文件,描述了一個(gè)類。 module.exports = People;
二、npm包管理
npm是跟隨Node.js一起的包管理工具,能解決Node.js代碼部署上的很多問題,當(dāng)我們使用npm去安裝一些第三方庫的時(shí)候,安裝包會放在運(yùn)行npm命令時(shí)所在的目錄中的node_modules文件夾中,如果當(dāng)前目錄下沒有node_modules,會在當(dāng)前目錄下生成node_modules目錄,并把我們需要的第三方庫放在node_modules中。
所以在安裝的時(shí)候,要注意,命令提示符所在的位置。
安裝第三方庫的命令 npm install 模塊名字, 假如我們需要安裝express,那么只需要在命令行中輸入npm install express
1.我們的依賴包,可能在隨時(shí)更新,我們永遠(yuǎn)想保持更新,或者某持某一個(gè)版本;
2.項(xiàng)目越來越大的時(shí)候,給別人看的時(shí)候,沒有必要再次共享我們引用的第三方模塊。
所以我們可以使用package.json來管理依賴包。
在cmd中,使用npm init可以初始化一個(gè)package.json文件,用回答問題的方式生成一個(gè)新的package.json文件。
生成package.json的作用就是,如果一不小心我們丟了什么依賴,那么只要我們直接npm install就可以安裝package.json中的缺失的依賴;
package.json中版本號前面有一個(gè)尖角號,表示固定版本,即固定使用我現(xiàn)在安裝的版本;
例如我們現(xiàn)在新建一個(gè)文件夾
1、新建文件夾
我們現(xiàn)在需要安裝一個(gè)第三方庫express,就先進(jìn)入這個(gè)文件夾,打開命令行,在此輸入 npm install express'' 等命令行完成之后,我們會看到在文件夾中就新建了一個(gè)node_modules文件夾,并且把我們需要的庫已經(jīng)安裝在文件夾中
2、安裝后文件夾中內(nèi)容
然后我們需要一個(gè)package.json管理我們的包,就可以在命令行中輸入npm init,這時(shí)可已根據(jù)命令行的提示回答問題建立package.json
3、建立package.json
那么我們這個(gè)項(xiàng)目的一些依賴,版本號,描述,作者等都可以通過package.json進(jìn)行相應(yīng)管理。
4、包管理
我這個(gè)包管理內(nèi)容比較少,那么正常情況下package.jaon都有如下內(nèi)容
三、模塊對象的屬性
這個(gè)作為更深入的了解。
在模塊文件內(nèi)部,可以訪問當(dāng)前模塊的如下一些屬性。
module.id : 表示該模塊文件的絕對路徑。
module.filename :屬性值為當(dāng)前模塊的文件名
module.loaded :屬性值為布爾值,當(dāng)屬性值為false時(shí)表示模塊尚未加載完畢,反之為加載完畢。
module.parent:屬性值為當(dāng)前模塊的父模塊對象,即調(diào)用當(dāng)前模塊的模塊對象
module.children:屬性值為一個(gè)數(shù)組,其中存放了當(dāng)前模塊所有子模塊對象,即當(dāng)前模塊中已加載的所有模塊對象。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。