NPM是什么
npm makes it easy for JavaScript developers to share and reuse code, and it makes it easy to update the code that you're sharing.
簡(jiǎn)單來說擂仍,npm就是javascript的包管理工具含蓉,類似java語(yǔ)法當(dāng)中的maven, gradle, python的pip炸渡。
安裝
npm是和Node.js一起發(fā)布的,只要安裝了Node.js,npm也安裝好了侯勉,可以從Node.js的下載頁(yè)下載對(duì)應(yīng)操作系統(tǒng)的安裝包安裝即可焕盟。 安裝好后,執(zhí)行如下命令介衔,檢查是否安裝成功腌乡。
$ node -v
v6.10.0
$ npm -v
4.4.1
但是由于npm自身的更新頻率比Node.js高很多,所以通過上面的命令安裝的npm可能不是最新版本夜牡,可以通過下面的命令單獨(dú)更新npm
$ npm install npm@latest -g
安裝包
執(zhí)行命令
$ npm install <package_name>
便可以安裝對(duì)應(yīng)的包到執(zhí)行命令的當(dāng)前目錄与纽,并創(chuàng)建一個(gè)node_modules
的文件夾,然后把需要安裝的安裝包下載到里面。
使用package.json
通過上面的命令塘装,直接安裝的包默認(rèn)都是最新版本的急迂。但是在項(xiàng)目中,我們?cè)趺醋屢黄痖_發(fā)的同事知道項(xiàng)目中用了哪些包蹦肴,具體包的版本信息呢僚碎?這時(shí)package.json
就上場(chǎng)了,可以把它想成是java語(yǔ)言中的pom.xml
,
python語(yǔ)言中的requirements.txt
阴幌。
一個(gè)基本的package.json
文件至少需要包含兩個(gè)重要信息: 包名name
和版本信息version
勺阐。
例如:
{
"name": "my-awesome-package",
"version": "1.0.0"
}
創(chuàng)建package.json
我們可以使用命令npm init
來初始化一個(gè)package.json
文件,運(yùn)行這個(gè)命令后矛双,它會(huì)詢問一些關(guān)于包的基本信息渊抽,根據(jù)實(shí)際情況回答即可。如果不喜歡這種方式议忽,可以使用npm init --yes
命令直接使用默認(rèn)的配置來創(chuàng)建package.json
文件懒闷,最后根據(jù)需要修改創(chuàng)建好的package.json
文件即可。
package.json
文件創(chuàng)建好后,我們來看看它長(zhǎng)得什么樣子吧愤估!
{
"name": "my_package",
"description": "",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/ashleygwilliams/my_package.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/ashleygwilliams/my_package/issues"
},
"homepage": "https://github.com/ashleygwilliams/my_package"
}
主要字段的含義如下:
-
name: 模塊名, 模塊的名稱有如下要求:
- 全部小寫
- 只能是一個(gè)詞語(yǔ)帮辟,沒有空格
- 允許使用破折號(hào)和下劃線作為單詞分隔符
version: 模塊版本信息
description:關(guān)于模塊功能的簡(jiǎn)單描述,如果這個(gè)字段為空的話玩焰,默認(rèn)會(huì)從當(dāng)前目錄的
READMD.md
或README
文件讀取第一行內(nèi)容作為它的默認(rèn)值由驹。main: 模塊被引入后,首先加載的文件昔园,默認(rèn)為
index.js
荔棉。scripts: 定義一些常用命令入口
類似git一樣,npm也可以做一些簡(jiǎn)單的配置來設(shè)置一些我們常用的信息
$ npm set init.author.email "wombat@npmjs.com"
$ npm set init.author.name "ag_dubs"
$ npm set init.license "MIT"
這樣下次執(zhí)行npm init
的時(shí)候蒿赢,就會(huì)用上我們配置的一些默認(rèn)信息啦润樱!
安裝模塊
使用npm install
會(huì)讀取package.json
文件來安裝模塊。安裝的模塊分為兩類
dependencies
和devDependencies
羡棵,分別對(duì)應(yīng)生產(chǎn)環(huán)境需要的安裝包和開發(fā)環(huán)境需要的安裝包壹若。
同樣在安裝模塊的時(shí)候,可以通過指定參數(shù)來修改package.json
文件皂冰,如
$ npm install <package_name> --save
$ npm install <package_name> --save-dev
來將新安裝的模塊信息記錄到package.json
文件店展。
更新模塊
$ npm update
卸載模塊
$ npm uninstall <package_name>
如果要在卸載模塊的同時(shí),也將他從package.json文件中移除秃流,可以添加跟安裝時(shí)候一樣的參數(shù)赂蕴,例如:
$ npm uninstall --save lodash
全局包管理
默認(rèn)情況下。我們執(zhí)行默認(rèn)的安裝命令安裝的包都是安裝到當(dāng)前目錄下的舶胀,只能在當(dāng)前目錄下使用概说。但是假如我們需要使用一些全局的軟件,如grunt
嚣伐,我們可以在安裝的時(shí)候糖赔,添加-g
選項(xiàng)來安裝,方便后面在任何目錄下都可以使用grunt
相關(guān)的命令
$ npm install -g grunt
同理轩端,更新全局的安裝包只需要執(zhí)行命令
$ npm update -g
為了查看當(dāng)前哪些包需要更新放典,可以使用如下命令來查看
$ npm outdated -g --depth=0
Package Current Wanted Latest Location
vue-cli 2.7.0 2.8.1 2.8.1
webpack 1.13.2 2.2.1 2.2.1
webpack-dev-server 1.14.1 2.4.1 2.4.1
卸載全局安裝的包也只需要加上-g
選項(xiàng)即可。如
$ npm uninstall -g jshint
創(chuàng)建自己的Node.js模塊
一個(gè)Node.js模塊就是一個(gè)可以發(fā)布到npm基茵,供其他開發(fā)者下載和使用的模塊奋构。那么,到底怎樣和其他開發(fā)者分享我們的模塊呢拱层?
首先弥臼,我們必須創(chuàng)建一個(gè)package.json
文件,添加上關(guān)于我們想要分享的模塊信息舱呻,如:模塊功能醋火,開發(fā)者信息等悠汽。
一旦package.json
文件創(chuàng)建好后箱吕,我們需要?jiǎng)?chuàng)建一個(gè)模塊被引入時(shí)芥驳,就加載的文件。
即package.json
中main
字段指定的文件茬高,默認(rèn)為index.js
兆旬。我們需要在文件中將一個(gè)函數(shù)賦值給exports
模塊,方便其他開發(fā)者調(diào)用我們的模塊怎栽。如
exports.printMsg = function() {
console.log("This is a message from the demo package");
}
包(Pacakges)和模塊(Modules)
在使用npm的時(shí)候丽猬,有兩個(gè)概念容易搞混,那就是包(Pacakges)和模塊(Modules)熏瞄。簡(jiǎn)單來說脚祟,包和模塊的區(qū)別如下:
- 包是一個(gè)被
package.json
文件描述了的文件或者目錄 - 模塊是可以被Node.js引用的文件或目錄
什么是包?
a) a folder containing a program described by a package.json file
b) a gzipped tarball containing (a)
c) a url that resolves to (b)
d) a <name>@<version> that is published on the registry with (c)
e) a <name>@<tag> that points to (d)
f) a <name> that has a latest tag satisfying (e)
g) a git url that, when cloned, results in (a).
什么是模塊强饮?
- A folder with a package.json file containing a main field.
- A folder with an index.js file in it.
- A JavaScript file.
npm配置
在使用npm時(shí)由桌,我們可以根據(jù)個(gè)人的需要,指定很多配置信息邮丰。
npm的配置信息加載優(yōu)先級(jí)如下(從高到低)
- 命令行參數(shù)
- 環(huán)境變量
-
npmrc
文件- 項(xiàng)目級(jí)別的npmrc文件(/path/to/my/project/.npmrc)
- 用戶級(jí)別的npmrc文件(~/.npmrc)
- 全局的npmrc文件($PREFIX/etc/npmrc)
- npm內(nèi)置的npmrc文件(/path/to/npm/npmrc)
查看配置
$ npm config list -l
配置npm源
最后介紹一個(gè)比較重要的配置行您,當(dāng)我們使用默認(rèn)配置從npm官網(wǎng)下載模塊時(shí),由于網(wǎng)絡(luò)的因素剪廉,會(huì)導(dǎo)致我們的下載速度特別慢娃循。所以,我們可以配置一些國(guó)內(nèi)的鏡像來加快我們的下載速度斗蒋。在這里捌斧,我推薦使用[淘寶的npm鏡像](淘寶 NPM 鏡像), 具體使用方式如下:
-
臨時(shí)使用, 安裝包的時(shí)候通過
--registry
參數(shù)即可$ npm install express --registry https://registry.npm.taobao.org
-
全局使用
$ npm config set registry https://registry.npm.taobao.org // 配置后可通過下面方式來驗(yàn)證是否成功 npm config get registry // 或 npm info express
-
使用cnpm使用
// 安裝cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org // 使用cnpm安裝包 cnpm install express
更多使用
請(qǐng)參考官方文檔