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你真的会吗?(二)中来讲解大家敬请期待。