什么是 NPM
npm 是什么东东?npm 其实是 Node.js 的包管理工具(package manager)。
为啥我们需要一个包管理工具呢?因为我们在 Node.js 上开发时,会用到很多别人写的 JavaScript 代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,script 引入,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到 npm 官网上,如果要使用,直接通过 npm 安装就可以直接用,不用管代码存在哪,应该从哪下载。
更重要的是,如果我们要使用模块 A,而模块 A 又依赖于模块 B,模块 B 又依赖于模块 X 和模块 Y,npm 可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。
npm 的历史
在没有 npm 的年代,你要去获取一个模块,或者一个框架你的方式是什么?
- 获取 ->JQ
- 获取 ->Boottrap
- 获取 ->Underscore
我们的 GitHub
当然当时也是一个 jQuery 可以走天下的时代
我们程序员当然不能接受这种古老而且低效率的事情, 我们需要更加高效更加合理的代码管理方式。
想想其他语言
语言 | 包管理工具 |
---|---|
Java | maven |
Python | distribute、setuptools、distutils、easy_install、pip |
PHP | Composer |
前端居然没有!不能容忍!在这个时候有个人站了出来
Isaac Z. Schlueter GitHub 下面简称(Issac)
大致的实现思路
- 找一个云服务把所有的代码都管理起来
- 然后通知 jQuery、Bootstrap、等等这些框架的坐着作者使用 npm publish 把代码提交到云服务上,
- 社区里的其他人如果想使用这些代码,就可以通过 npm install 来下载这些代码了。
- 下载完的代码出现在 node_modules 目录里,就可以通过 require 引入进行使用了。
后续发展
Isaaz 通知 jQuery 作者 John Resig,他会答应吗?不一定这还是个未知数,但是还是要去做。
只有前端开发工程师人人都知道有这个东西了才会认可它对不对。
那 npm 是怎么迅速在前端社区火爆起来的呢?
npm 的发展是跟 Node.js 的发展相辅相成的。
Node.js 是由一个在德国工作的美国程序员 Ryan Dahl github 地址 写的。他写了 Node.js,但是 Node.js 当时缺少一个包管理器,于是他和 Isaaz 一拍即合、,最终 Node.js 内置了 npm。
后来的事情大家都知道,Node.js 火了。
package.json
当我们在一个空文件 npm init 初始化的时候这个文件就诞生了,
我这里找了 express 的 package.json
{
"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 里面。
经常使用的命令
全局安装与本地安装
很多朋友一开始并不知道 npm install -g 和不带 - g 的区别,npm 的包安装分为本地安装(local)、全局安装(global)两种
npm install express # 本地安装
npm install express -g # 全局安装
本地安装
1、将安装包放在./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录
2、可以通过 require() 来引入本地安装的包。
全局安装
1、将安装包放在 /usr/local 下或者你 node 的安装目录
2、可以直接在命令行里使用
卸载模块
既然可以安装那么也会有卸载模块的方式,
npm uninstall express
卸载完以后查看一下该模块是否存在
npm ls
更新模块
npm update express
更多知识我们会在 NPM 你真的会吗?(二)中来讲解大家敬请期待。