乐趣区

NPM你真的会吗一

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

退出移动版