Node模塊

理解包結(jié)構(gòu)

commonjs包結(jié)構(gòu)規(guī)范:http://wiki.commonjs.org/wiki/Packages/1.0

  • 一個(gè)package.json文件應(yīng)該存在于包頂級(jí)目錄下
  • 二進(jìn)制文件應(yīng)該包含在bin目錄下南吮。
  • JavaScript代碼應(yīng)該包含在lib目錄下义钉。
  • 文檔應(yīng)該在doc目錄下环形。
  • 單元測(cè)試應(yīng)該在test目錄下。

理解描述文件package.json

輸入 npm init 后會(huì)彈出一堆問題,我們可以輸入對(duì)應(yīng)內(nèi)容,也可以使用默認(rèn)值。在回答一堆問題后輸入 yes 就會(huì)生成圖中所示內(nèi)容的 package.json 文件鸠天。如果嫌回答這一大堆問題麻煩,可以直接輸入 npm init --yes 跳過回答問題步驟帐姻,直接生成默認(rèn)值的 package.json 文件

  • name稠集。包名,需要在NPM上是唯一的卖宠,不能帶有空格巍杈。
  • description忧饭。包簡(jiǎn)介扛伍,通常會(huì)顯示在一些列表中。
  • version词裤。版本號(hào)刺洒,一個(gè)語(yǔ)義化的版本號(hào)(http://semver.org/ ),通常為x.y.z吼砂。
  • keywords逆航。關(guān)鍵字?jǐn)?shù)組,用于NPM中的分類搜索渔肩。
  • maintainers因俐。包維護(hù)者的數(shù)組,數(shù)組元素是一個(gè)包含name周偎、email抹剩、web三個(gè)屬性的JSON對(duì)象。
  • contributors蓉坎。包貢獻(xiàn)者的數(shù)組澳眷。第一個(gè)就是包的作者本人。在開源社區(qū)蛉艾,如果提交的patch被merge進(jìn)master分支的話钳踊,就應(yīng)當(dāng)加上這個(gè)貢獻(xiàn)patch的人。格式包含name和email勿侯。
"contributors": [{
    "name": "Jackson Tian",
    "email": "mail @gmail.com"
    }, {
    "name": "fengmk2",
    "email": "mail2@gmail.com"
}],
  • bugs拓瞪。一個(gè)可以提交bug的URL地址,可以是郵件地址(mailto:mailxx@domain)助琐,也可以是網(wǎng)頁(yè)地址(http://url)祭埂。

  • licenses。包所使用的許可證弓柱,例如:

  • "licenses": [{
        "type": "GPLv2",
        "url": "http://www.example.com/licenses/gpl.html",
    }]
    
  • repositories沟堡。托管源代碼的地址數(shù)組侧但。

  • dependencies。當(dāng)前包需要的依賴航罗,這個(gè)屬性十分重要禀横,NPM會(huì)通過這個(gè)屬性,幫你自動(dòng)加載依賴的包粥血。

理解npm install

我們可以把項(xiàng)目發(fā)布到npm中央倉(cāng)庫(kù)柏锄,別人拿到我們的項(xiàng)目時(shí),可以執(zhí)行npm install下載所需要的模塊复亏,這些模塊是依賴package.json中定義的趾娃,這些依賴都會(huì)被安裝在當(dāng)前目錄下。

npm的包安裝分為本地安裝(local)缔御、全局安裝(global)兩種抬闷。

npm install xxx # 本地安裝 

將安裝包放在 ./node_modules 下(運(yùn)行npm時(shí)所在的目錄)

npm install -g xxx # 全局安裝

將安裝包放在/usr/local/lib/node_modules下。

使用 npm install 時(shí)增加 --save 或者 --save -dev 表示將這個(gè)包名及對(duì)應(yīng)的版本添加到 package.jsondependenciesdevDependencies耕突。

使用模塊

使用require函數(shù)用于在當(dāng)前模塊中加載和使用別的模塊笤成,傳入一個(gè)模塊名,返回一個(gè)模塊導(dǎo)出對(duì)象眷茁。

優(yōu)先從緩存中加載模塊炕泳,其次在核心模塊中加載,然后是指定文件路徑的模塊加載上祈,如果以上三個(gè)條件均不滿足培遵,則定義為自定義模塊,查找策略為從當(dāng)前目錄下的node_modules查找登刺,找不到則向父目錄的node_modules查找籽腕,直到根目錄或找到為止。

如果在環(huán)境變量中設(shè)置了HOME目錄和NODE_PATH目錄的話塘砸,整個(gè)路徑還包含NODE_PATH和HOME目錄下的.node_libraries與.node_modules节仿。

全局模塊

為什么我們使用npm install -g命令安裝的模塊不能即時(shí)生效,那是因?yàn)閚pm install -g 會(huì)將模塊默認(rèn)安裝在/usr/local/lib/node_modules中掉蔬,而require模塊的流程如剛才所說廊宪,默認(rèn)情況下并沒有自動(dòng)查找到全局路徑中。

可以通過三種方法解決:

  • 可以在工程目錄下執(zhí)行npm link module_name
  • 可以設(shè)置環(huán)境變量NODE_PATH
  • 可以軟鏈接一個(gè)目錄女轿,在某個(gè)父節(jié)點(diǎn)路徑中創(chuàng)建node_modules箭启,如下:

設(shè)置一個(gè)代理全局模塊路徑,這樣npm install -g的模塊都會(huì)安裝在此

npm config set prefix "~/npm_global"

建立一個(gè)軟鏈接

ln -s ~/npm_global/lib/node_modules ~/node_modules

查看全局安裝模塊的命令:

npm list --depth=0 -global

導(dǎo)出模塊

exports該對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象蛉迹,用于導(dǎo)出模塊公有方法和屬性傅寡,默認(rèn)為一個(gè)空對(duì)象{}。別的模塊通過require()函數(shù)使用當(dāng)前模塊時(shí)得到的就是當(dāng)前模塊的exports對(duì)象。以下代碼中導(dǎo)出了一個(gè)公有方法:

exports.hello = function() {
    console.log("Hello World!");
};

在下面的情況下荐操,你的模塊是一個(gè)類:

module.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +' is '+ this.age +' years old');
    };
};

然后你應(yīng)該這樣使用它:

var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old

在下面的情況下芜抒,你的模塊是一個(gè)數(shù)組:

module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];

然后你應(yīng)該這樣使用它:

var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio

exports只是module.exports的輔助方法。你的模塊最終返回module.exports給調(diào)用者托启,而不是exports宅倒。exports所做的事情是收集屬性,如果module.exports當(dāng)前沒有任何屬性的話屯耸,exports會(huì)把這些屬性賦予module.exports拐迁。如果module.exports已經(jīng)存在一些屬性的話,那么exports中所用的東西都會(huì)被忽略疗绣。

簡(jiǎn)單理解核心模塊

核心模塊中线召,有些模塊使用C/C++編寫,有些則由C/C++完成核心部分多矮,由JavaScript實(shí)現(xiàn)包裝和向外導(dǎo)出缓淹。

內(nèi)建模塊被統(tǒng)一放在一個(gè)node_module_list數(shù)組中,通過get_builtin_module方法取出工窍,通過執(zhí)行register_func()填充exports對(duì)象割卖,將exports對(duì)象緩存并返回給調(diào)用方前酿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末患雏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罢维,更是在濱河造成了極大的恐慌淹仑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肺孵,死亡現(xiàn)場(chǎng)離奇詭異匀借,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)平窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門吓肋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑰艘,你說我怎么就攤上這事是鬼。” “怎么了紫新?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵均蜜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我芒率,道長(zhǎng)囤耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮充择,結(jié)果婚禮上德玫,老公的妹妹穿的比我還像新娘。我一直安慰自己椎麦,他們只是感情好化焕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铃剔,像睡著了一般撒桨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上键兜,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天凤类,我揣著相機(jī)與錄音,去河邊找鬼普气。 笑死谜疤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的现诀。 我是一名探鬼主播夷磕,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仔沿!你這毒婦竟也來了坐桩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤封锉,失蹤者是張志新(化名)和其女友劉穎绵跷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體成福,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碾局,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奴艾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净当。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蕴潦,靈堂內(nèi)的尸體忽然破棺而出像啼,到底是詐尸還是另有隱情,我是刑警寧澤品擎,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布埋合,位于F島的核電站,受9級(jí)特大地震影響萄传,放射性物質(zhì)發(fā)生泄漏甚颂。R本人自食惡果不足惜蜜猾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望振诬。 院中可真熱鬧蹭睡,春花似錦、人聲如沸赶么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辫呻。三九已至清钥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間放闺,已是汗流浹背祟昭。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怖侦,地道東北人篡悟。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像匾寝,于是被迫代替她去往敵國(guó)和親搬葬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容