文:鐵樂貓
引子
2018年6月1日的兒童節,我在北京學習python。
課程來到前端的javascript 和 jquery,今天老師還給科普了node.js的包管理npm。
雖然以前工作時己有安裝和使用npm,但畢竟只知其然不知其所以然。
直到今天聽老師科普了一下才恍然大悟它是怎樣用法的。
后面還參考引用了一些網上的npm教程,更加深刻理解了。
何為node.js 和 npm
Node.js是一個基於Chrome JavaScript運行時建立的平台, 用於方便地搭建響應速度快、易於擴展的網絡應用。Node.js 使用
事件驅動
,非阻塞I/O
模型而得以輕量和高效,非常適合在分布式設備上運行數據密集型的實時應用。
以上摘自百度百科,簡單來說,Node.js很適合搭建輕量的服務器(應用),所以它又被人稱為服務器語言,前端中的后端語言。
node翻譯過來是節點的意思,而node.js后面特地帶了.js,就表示它與JavaScript有莫大的關系。
node.js是javascript的一種運行環境,是服務器端的javascript的解釋器。
npm則是包含在node.js里面的一個包管理工具,就如同linux中的yum倉庫,rpm包管理;如同python中的pip包管理工具一樣。
而這些包管理工具都是予以使用的人們方便,同時解決各種包依賴之間的關系的。
等下面演示后,就會知道有npm去解決項目及包之間的依賴關系是多么的便利,省去了人手上的多少心力。讓開發人員專注於代碼上。
既然npm是包管理工具,那么它自己也和node.js分開自成一個網站,在npm的網站上面,就如同github,其倉庫中保管了N多的開源項目,有世界上眾多開發者提供的項目。我們只需要在npm的網站上搜索相關的就可以找到,然后在線上下載也行,直接在自己的項目中使用命令行安裝也行。
npm 由三個獨立的部分組成:
- npm官方網站(倉庫源)
- 注冊表(registry)(package.json)
- 命令行工具 (CLI)
網站 是開發者查找包(package)、設置參數以及管理 npm 使用體驗的主要途徑。
注冊表 是一個巨大的數據庫,保存了每個包(package)的信息。
CLI 通過命令行或終端運行。開發者通過 CLI 與 npm 打交道。
怎么使用node.js和npm
安裝node.js & npm
官方下載安裝包鏈接: https://nodejs.org/en/download/
windows下安裝msi方式的安裝包,很簡單,基本就是一路點擊鼠標確認下來的,所以就不詳說了。
這里放上一個詳細截圖說明安裝的鏈接地址:
https://www.runoob.com/nodejs/nodejs-install-setup.html
其實安裝完node.js后就已經將npm也安裝上了。不過若是想要單獨更新npm時怎么辦?
可以使用以下兩個命令進行更新:
npm install npm@latest -g
npm install npm@next -g
npm init 初始化項目(創建node.js模塊)
npm init
在項目中引導創建一個package.json文件。
安裝包的信息可保持到項目的package.json文件中,以便后續的其它的項目開發或者他人合作使用,package.json在項目中是必不可少的。
語法:
npm init [-f|--force|-y|--yes]
在本地創建一個項目文件夾,例如我這次的例子目錄是GhostScoolScreatBase。
cmd中進入到該目錄下。
開始初始化項目:npm init
和git的初始化倉庫是不是很像。
這樣初始化之后,項目目錄下會自動生成一個package.json
文件。
注意的是,npm init
命令后,npm會詢問你一系列問題,當你填入答案后才會正式結束初始化,如果不太想自定義一些關於項目的描述,可以不敲npm init
,而是直接敲npm init --yes
命令行中將會提示 package.json
字段中需要你輸入的值。
名稱(name)
和 版本(version)
這兩個字段是必填的。
你還需要輸入 入口文件字段(main)
字段,默認值是 index.js
。
在index.js文件中,添加一個函數,作為 exports
對象的一個屬性。這樣,require 此文件之后,這個函數在其他代碼中就可以使用了。
exports.printMsg = function() {
console.log("This is a message from the demo package");
}
如圖:
如果想為作者(author)字段添加信息,可以使用以下格式(郵箱、網址都是選填的):
Your Name <email@example.com> (http://example.com)
打開生成的package.json文件,可以看到類似如下的:
{
"name": "ghostschoolscreatbase",
"version": "1.0.0",
"description": "鐵血丹心-劇場經典大戲-幽靈學院第六部2018夏季特別篇-你和我的秘密基地",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "鐵樂貓",
"license": "ISC"
}
Package.json 屬性說明
-
name - 包名。
-
version - 包的版本號。
-
description - 包的描述。
-
homepage - 包的官網 url 。
-
author - 包的作者姓名。
-
contributors - 包的其他貢獻者姓名。
-
dependencies - 依賴包列表。如果依賴包沒有安裝,npm 會自動將依賴包安裝在 node_module 目錄下。
-
repository - 包代碼存放的地方的類型,可以是 git 或 svn,git 可在 Github 上。
-
main - main 字段指定了程序的主入口文件,require('moduleName') 就會加載這個文件。這個字段的默認值是模塊根目錄下面的 index.js。
-
keywords - 關鍵字
npm install 下載安裝依賴包
前面有提到初始化項目,可視為創建node.js模塊的時候,會生成package.json文件。
而我們的項目顯然會在途中用上很多模塊,這些模塊是不便全部上傳到github倉庫供用戶下載的(github有限制倉庫大小不能超過100M)。且用戶還需自己手動安裝這些依賴包也容易出錯。
為此,npm提供了很大的便利,比如這次的項目,我們會用上jquery。
命令行進入項目目錄;
執行npm install jquery --save
npm install <package_name> # 安裝一個本地包,如果加上-g選項則是安裝全局包
有兩種方式用來安裝 npm 包:本地安裝和全局安裝。至於選擇哪種方式來安裝,取決於我們如何使用這個包。
- 如果你自己的模塊依賴於某個包,並通過 Node.js 的
require
加載,那么你應該選擇本地安裝,這種方式也是npm install
命令的默認行為。- 如果你想將包作為一個命令行工具,(比如 grunt CLI),那么你應該選擇全局安裝。
回到實例,這時項目下自動會生成一個node_modules,並且node_modules文件下有jquery包,另外在package.json文件中也會有當前記錄:
"dependencies": {
"jquery": "^3.
}
安裝好之后,express 包就放在了工程目錄下的 node_modules 目錄中,因此在代碼中只需要通過 require('express') 的方式就好,無需指定第三方包路徑。
var express = require('express');
同理,你在npm中下載別人發布的項目或模塊后,也需要npm install
來安裝好依賴以便運行。
本地安裝和全局安裝區別
-
本地安裝
- 1. 將安裝包放在 ./node_modules 下(運行 npm 命令時所在的目錄),如果沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成 node_modules 目錄。
- 2. 可以通過 require() 來引入本地安裝的包。
-
全局安裝
- 1. 將安裝包放在 /usr/local 下或者你 node 的安裝目錄。
- 2. 可以直接在命令行里使用。
如果你希望具備兩者功能,則需要在兩個地方安裝它或使用 npm link。
補充-模塊操作
卸載模塊
我們可以使用以下命令來卸載 Node.js 模塊。
$ npm uninstall express
卸載后,你可以到 /node_modules/ 目錄下查看包是否還存在,或者使用以下命令查看:
$ npm ls
更新模塊
我們可以使用以下命令更新模塊:
$ npm update express
搜索模塊
使用以下來搜索模塊:
$ npm search express
創建模塊和發布模塊
創建模塊使用的命令和步驟在前面npm init
中己提到。
使用以下命令在 npm 資源庫中注冊用戶(使用郵箱注冊):
$ npm adduser Username: tielemao
Password:
Email: (this IS public)tieleyumao@gmail.com
用以下命令來發布模塊:
$ npm publish
如果你以上的步驟都操作正確,你就可以跟其他模塊一樣使用 npm 來安裝自己發布的模塊。
版本號
使用NPM下載和發布代碼時都會接觸到版本號。NPM使用語義版本號來管理代碼,這里簡單介紹一下。
語義版本號分為X.Y.Z三位,分別代表主版本號、次版本號和補丁版本號。當代碼變更時,版本號按以下原則更新。
- 如果只是修復bug,需要更新Z位。
- 如果是新增了功能,但是向下兼容,需要更新Y位。
- 如果有大變動,向下不兼容,需要更新X位。
版本號有了這個保證后,在申明第三方包依賴時,除了可依賴於一個固定版本號外,還可依賴於某個范圍的版本號。例如"argv": "0.0.x"表示依賴於0.0.x系列的最新版argv。
NPM支持的所有版本號范圍指定方式可以查看官方文檔。
使用淘寶 NPM 鏡像
大家都知道國內直接使用 npm 的官方鏡像是非常慢的,這里推薦使用淘寶 NPM 鏡像。
淘寶 NPM 鏡像是一個完整 npmjs.org 鏡像,可以用此代替官方版本(只讀),同步頻率目前為 10分鍾一次,以保證盡量與官方服務同步。
使用淘寶定制的 cnpm (gzip 壓縮支持) 命令行工具代替默認的 npm:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
這樣就可以使用 cnpm 命令來安裝模塊了:
$ cnpm install [name]
更多信息可以查閱:http://npm.taobao.org/。
參考和引用:
npm使用介紹|菜鳥教程
npm中文文檔|npm中文網