npm是什麼東東?npm實際上是Node.js的包管理工具(package manager)。 爲啥咱們須要一個包管理工具呢?由於咱們在Node.js上開發時,會用到不少別人寫的JavaScript代碼。若是咱們要使用別人寫的某個包,每次都根據名稱搜索一下官方網站,下載代碼,解壓,script 引入,很是繁瑣。因而一個集中管理的工具應運而生:你們都把本身開發的模塊打包後放到npm官網上,若是要使用,直接經過npm安裝就能夠直接用,不用管代碼存在哪,應該從哪下載。 更重要的是,若是咱們要使用模塊A,而模塊A又依賴於模塊B,模塊B又依賴於模塊X和模塊Y,npm能夠根據依賴關係,把全部依賴的包都下載下來並管理起來。不然,靠咱們本身手動管理,確定既麻煩又容易出錯。前端
在沒有npm的年代,你要去獲取一個模塊,或者一個框架你的方式是什麼?node
固然當時也是一個jQuery能夠走天下的時代 git
咱們程序員固然不能接受這種古老並且低效率的事情,咱們須要更加高效更加合理的代碼管理方式。
想一想其餘語言程序員
語言 | 包管理工具 |
---|---|
Java | maven |
Python | distribute、setuptools、distutils、easy_install、pip |
PHP | Composer |
前端竟然沒有!不能容忍!在這個時候有我的站了出來
Isaac Z. Schlueter GitHub 下面簡稱(Issac)github
Isaaz 通知 jQuery 做者 John Resig,他會答應嗎?不必定這仍是個未知數,可是仍是要去作。 只有前端開發工程師人人都知道有這個東西了纔會承認它對不對。 那npm是怎麼迅速在前端社區火爆起來的呢? npm 的發展是跟 Node.js 的發展相輔相成的。 Node.js 是由一個在德國工做的美國程序員 Ryan Dahl github地址 寫的。他寫了 Node.js,可是 Node.js 當時缺乏一個包管理器,因而他和 Isaaz 一拍即合、,最終 Node.js內置了npm。 後來的事情你們都知道,Node.js 火了。web
當咱們在一個空文件 npm init 初始化的時候這個文件就誕生了,express
我這裏找了express 的 package.jsonnpm
{
"name": "express", // 包名
"description": "Fast, unopinionated, minimalist web framework", // 包的描述
"version": "4.13.3", // 包的版本號
"author": { // 包的做者姓名
"name": "TJ Holowaychuk",
"email": "tj@vision-media.ca"
},
"contributors": [ // 包的其餘貢獻者姓名
{
"name": "Aaron Heckmann",
"email": "aaron.heckmann+github@gmail.com"
}
// ...
],
"license": "MIT", // 你應該爲你的模塊制定一個協議,讓用戶知道他們有何權限來使用你的模塊,以及使用該模塊有哪些限制。
"repository": { // 包代碼存放的地方的類型,能夠是 git 或 svn,git 可在 Github 上。
"type": "git",
"url": "git+https://github.com/strongloop/express.git"
},
"homepage": "http://expressjs.com/", // 包的官網 url
"keywords": [ // 關鍵字
"express",
"framework",
"sinatra",
"web",
"rest",
"restful",
"router",
"app",
"api"
],
"dependencies": { // 依賴包列表。若是依賴包沒有安裝,npm 會自動將依賴包安裝在 node_module 目錄下
"accepts": "~1.2.12",
// ...
},
"devDependencies": { // 開發環境的依賴包
"after": "0.8.1",
// ...
},
"engines": { // node版本範圍
"node": ">= 0.10.0"
},
"files": [
"LICENSE",
"History.md",
"Readme.md",
"index.js",
"lib/"
],
"scripts": { // 項目的生命週期個各個環節須要執行的命令。key是生命週期中的事件,value是要執行的命令。
"test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/",
"test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/",
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
"test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"
},
"gitHead": "ef7ad681b245fba023843ce94f6bcb8e275bbb8e",
"bugs": {
"url": "https://github.com/strongloop/express/issues"
},
"_id": "express@4.13.3",
"_shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
"_from": "express@*",
"_npmVersion": "1.4.28",
"_npmUser": {
"name": "dougwilson",
"email": "doug@somethingdoug.com"
},
"maintainers": [
{
"name": "tjholowaychuk",
"email": "tj@vision-media.ca"
}
// ...
],
"dist": {
"shasum": "ddb2f1fb4502bf33598d2b032b037960ca6c80a3",
"tarball": "http://registry.npmjs.org/express/-/express-4.13.3.tgz"
},
"directories": {},
"_resolved": "https://registry.npmjs.org/express/-/express-4.13.3.tgz",
"readme": "ERROR: No README data found!"
}
複製代碼
那麼你下次若是有這個package.json 你就能夠直接下載安裝這些依賴包。包文件就會出如今node_modules裏面。json
全局安裝與本地安裝
不少朋友一開始並不知道 npm install -g 和不帶-g的區別,npm 的包安裝分爲本地安裝(local)、全局安裝(global)兩種api
npm install express # 本地安裝
npm install express -g # 全局安裝
複製代碼
本地安裝
一、將安裝包放在./node_modules 下(運行 npm 命令時所在的目錄),若是沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成 node_modules 目錄
二、能夠經過 require() 來引入本地安裝的包。
全局安裝
一、將安裝包放在 /usr/local 下或者你 node 的安裝目錄
二、能夠直接在命令行裏使用
卸載模塊
既然能夠安裝那麼也會有卸載模塊的方式,
npm uninstall express
複製代碼
卸載完之後查看一下該模塊是否存在
npm ls
複製代碼
更新模塊
npm update express
複製代碼
更多知識咱們會在NPM你真的會嗎?(二)中來說解你們敬請期待。