Day2: Node.js的module和npm

寫在前面


總是喜歡自己造輪子, 自己造的輪子又不如已有的輪子好, 然后就半途而廢了. 現(xiàn)在想起來, 還是沒有到自己造輪子的時候啊. 畢竟, 先把東西寫出來才是最重要的.

Node.js的module

Node.js的module非常重要, 因為你為了方便, 會使用很多別人提供的包, 或者叫框架, 所以, 知道Node.js是如何引入的, 就重要了.

Node.js Modules 文檔

把Modules的文檔看一遍就全懂了, 是在沒什么值得寫的. 需要注意的就是module.exportsexports, 還有unfinished copy.

加載的時候會進行一些初始化, 其中module可以認為是全局對象, 記錄當前塊的信息, 而exports就是exports = module.exports, 然后引用你的包. 引用完畢之后, 返回modules.exports. 而問題就出現(xiàn)在這里. 你使用exports = function func(){}后, exports引用的是func, module.exports沒受影響. 所以func沒有被導出. exports只是作為exports.propertyName = value的方式使用的.

有一個也值得注意, 就是require.main指向的是node命令執(zhí)行腳本是, 這個腳本的module, 利用require.main就可以判斷, 本文件是作為腳本直接執(zhí)行的, 還是作為包載入的

if(require.main === module)
  // loaded as script
}else{
  // loaded as module
}

require引入一個包的時候大致循序就是如果是相對路徑, 就通過當前文件計算相對路徑.

  1. 如果指向的是一個核心模塊, 則加載這個模塊并返回.
  2. 如果指向的是一個文件, 則加載(后綴只能是.js, .json, .node), 否則當成一個目錄.
  3. 如果是目錄, 則看里面有沒有package.json, 有的話, 計算main字段指向的文件, 跳到步驟2加載, 如果沒有就看該目錄下有沒有index.js, index.json, index.node. 有就加載, 沒有就看該目錄下的node_modules下有沒有, 有的話就在其內(nèi)找有沒有符合指向的, 按照2, 3的步驟加載, 沒有就去父目錄的node_modules下找, 重復3直到根目錄.
  4. 最后, 如果還沒找到, 就去NODE_PATH指定的目錄(可以是多個)目錄下接著找.

雖然提供了NODE_PATH, 但是盡量別用.

現(xiàn)在的目錄結構差不多都是這個樣子:

project/
  src/  # 源代碼
  lib/ # 如果作為一個模塊以供使用, 那么源代碼會放到這里
  test/ # 測試
  dist/ # 壓縮過的代碼, 用于生產(chǎn)環(huán)境, 前端庫經(jīng)常有這個目錄
  package.json # 利用"main"指向入口文件
  README.md # 項目說明

npm


npm作為包管理工具, 使用挺簡單的, 其實看一遍文檔就可以懂了. 文檔也很短.

npm 文檔

Node.js已經(jīng)提供了模塊機制, 這就為依賴管理奠定了基礎. 使用npm的好處是什么呢? 管理代碼依賴更輕松. 如果把項目分為不同的包, 既有利于一起開發(fā); 在下一個項目中, 也可以輕易重用. 包的開發(fā)者可以自由開發(fā)不同版本, 而使用者也可以通過版本號指定采用哪個版本.

指定版本的時候可以指定一定范圍, 以使用較新版本的包

Patch releases: 1.0 or 1.0.x or ~1.0.4
Minor releases: 1 or 1.x or ^1.0.4
Major releases: * or x

Node.js自帶npm, 但是由于npm更新比Node.js更新更頻繁, 所以有的時候需要手動更新npm

sudo npm install -g npm@latest

有時候npm很慢, 可以換別的源. 使用nrm可以輕松更換源. 一般來說, 國內(nèi)淘寶比較快.

sudo npm install -g nrm # 安裝nrm
nrm test # 顯示各個院的時延
nrm set <repo> # 設置當前源為repo

Node.js會發(fā)布新版本, 如果是Linux下, 你有福了, 可以使用工具, 在命令行上更換不同版本的Node.js(包括Io.js)

sudo npm install -g n # 安裝n
n lts # 將Node.js切換到最新的長期支持版本
n stable # 將Node.js切換到最新的穩(wěn)定版本
n latest # 將Node.js切換到最新版本

對于npm來說, 一個包就是一個文件夾, 里面包含package.json和代碼. package.json用來描述這個包的信息, 其中, 有幾個重要的信息:

  • name, 名字
  • version, 版本號
  • main, 入口文件
  • scripts, 腳本
  • keywords, 關鍵字
  • author, 作者信息 author-name <email@host.com> (personal.me)
  • license, 包使用的協(xié)議
  • repository, 維護信息
  • bugs, 遞交bugs的鏈接
  • homepage, 項目主頁
  • dependencies, 程序依賴的包, 是一個JavaScript對象, 屬性名是包名, 屬性值是依賴的版本號, 這里可以通過一定的語義來指定一定范圍內(nèi)的版本, 方便以后對被依賴的包進行升級.
  • devDependencies, 開發(fā)過程中依賴的包, 同dependencies

安裝包很簡單. 指定了-g就是全局安裝, 包被放在$(npm config get prefix)/node_modules/目錄下, 可以在命令行中使用. 前面的nrm, n都是這種. 沒有-g參數(shù)的就是本地安裝, 代碼存放在./node_modules/目錄下, 并可以用require引入.

npm install -g <package-name>

如果沒有指定<package-name>的話, 則自動安裝package.jsondependencies中指定的包.

如果指定了--save或者-S, 則將這個包的信息自動同步到package.jsondependencies中, 而如果指定了--save-dev-D, 則將這個包的信息自動同步到package.jsondevDependencies中. 這倆參數(shù)在卸載等命令中都可以使用.

npm ls列出所有已經(jīng)安裝的包, 如果./node_modules/目錄有的包不在package.json中, 則顯示是多余的, 可以用npm prune來刪除多余的包, 而在package.json中指定的在./node_modules/中沒有, 則使用npm install進行安裝, 這可以安裝很多確實的包.

npm outdated會根據(jù)package.json執(zhí)行的版本范圍來檢查當前包是否過期, 如果過期了, 就會顯示過期信息. 可以通過npm update統(tǒng)一升級, 如果只想更新某一個, 則指定報名即可.

卸載包可以使用npm uninstall [-S] [-D] [-g] <package-name>來刪除包.

如果在./node_modules/目錄下存在一些包, 在package.json中沒有依賴, 則可以用npm prune刪除這些多余的包.

創(chuàng)建包, 首先要創(chuàng)建package.json. 可以使用npm init來進入提示, 依次輸入相應的信息, 最后會為你生成一個package.json文件. 如果加上-y參數(shù), 則會直接生成package.json. 這些默認的值可以在npm config set init.<key> <value>設置, 而如果./node_modules/下有包, 則會自動添加到依賴里面.

發(fā)布包需要一個賬號, 利用npm adduser創(chuàng)建賬戶, 如果有賬戶了, 則利用npm login進行登錄. 到工程所在目錄運行npm publish就發(fā)布成功了. package.json必須有nameversion.

發(fā)布新版本的包的時候, 需要修改package.jsonversion. 可以使用npm version [major|minor|patch]來更新版本號. 如果是git項目會添加tag. 再使用npm publish發(fā)布即可.

最后

npm挺簡單的, 但是寫了這么多, 寫筆記的時間比看文檔的事件都長. 下次只記錄那些值得記錄的.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市树姨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桥状,老刑警劉巖帽揪,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辅斟,居然都是意外死亡转晰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來查邢,“玉大人蔗崎,你說我怎么就攤上這事∪排海” “怎么了缓苛?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邓深。 經(jīng)常有香客問我未桥,道長,這世上最難降的妖魔是什么芥备? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任冬耿,我火速辦了婚禮,結果婚禮上萌壳,老公的妹妹穿的比我還像新娘亦镶。我一直安慰自己,他們只是感情好袱瓮,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布缤骨。 她就那樣靜靜地躺著,像睡著了一般懂讯。 火紅的嫁衣襯著肌膚如雪荷憋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天褐望,我揣著相機與錄音勒庄,去河邊找鬼。 笑死瘫里,一個胖子當著我的面吹牛实蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谨读,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼局装,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劳殖?” 一聲冷哼從身側響起铐尚,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哆姻,沒想到半個月后宣增,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡矛缨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爹脾,在試婚紗的時候發(fā)現(xiàn)自己被綠了帖旨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡灵妨,死狀恐怖解阅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泌霍,我是刑警寧澤货抄,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站烹吵,受9級特大地震影響碉熄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肋拔,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一锈津、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凉蜂,春花似錦琼梆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纫雁,卻和暖如春煌往,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轧邪。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工刽脖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忌愚。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓曲管,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硕糊。 傳聞我的和親對象是個殘疾皇子院水,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 1 Node.js模塊的實現(xiàn) 之前在網(wǎng)上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都著...
    zlx_2017閱讀 1,245評論 0 1
  • 1 Node.js模塊的實現(xiàn)# 之前在網(wǎng)上查閱了許多介紹Node.js的文章,可惜對于Node.js的模塊機制大都...
    七寸知架構閱讀 2,062評論 1 50
  • JavaScript 模塊化編程 網(wǎng)站越來越復雜,js代碼简十、js文件也越來越多檬某,會遇到什么問題? 命名沖突螟蝙; 文件...
    magic_pill閱讀 1,429評論 0 1
  • 個人入門學習用筆記恢恼、不過多作為參考依據(jù)。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點胶逢、復制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,472評論 1 37
  • 1 在這個世界上厅瞎,要想找一個真正理解你的人很難,即使是你的父母也不一定初坠。 知己難尋和簸,如果你找到了,說明你很幸運碟刺,好...
    神月新一閱讀 729評論 0 1