Node.js从入门到实战(三)Npm使用介绍

一、NPM

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  1. 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  2. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  3. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入  "npm -v"  来测试是否成功安装。命令如下,出现版本提示表示安装成功:

$ npm -v
2.3.0

npm的安装和升级:

npm的安装通过官网进行,升级通过如下npm命令:

npm install npm@latest -g

二、使用npm安装node.js模块

模块安装

npm 安装 Node.js 模块语法格式如下:

npm install <Module Name>
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

var express = require('express');

全局安装

npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
  1. npm install express # 本地安装
  2. npm install express -g # 全局安装
本地安装
1. 将安装包放在  ./node_modules  下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules  目录。
2. 可以通过  require () 来引入本地安装的包。
全局安装
1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
2. 可以 直接在命令行里使用

按照package约定的版本安装:

npm install 默认会安装 package.json 中 dependencies 和 devDependencies 里的所有模块。如果想只安装 dependencies 中的内容,可以使用 --production 字段:

npm install --production

模块卸载

模块卸载可以使用如下的命令:

npm uninstall express
安装参数 --save 和 --save -dev

在使用 npm install 时增加 --save 或者 --save -dev 后缀:
  • npm install <package_name> --save 表示将这个包名及对应的版本添加到 package.json的 dependencies
  • npm install <package_name> --save-dev 表示将这个包名及对应的版本添加到 package.json的 devDependencies


三、package.json文件

管理本地安装 npm 包的最好方式就是创建 package.json 文件。一个 package.json 文件可以有以下几点作用:

  1. 作为一个描述文件,描述了你的项目依赖哪些包
  2. 允许我们使用 “语义化版本规则”(后面介绍)指明你项目依赖包的版本
  3. 让你的构建更好地与其他开发者分享,便于重复使用

在npm使用时,在本地目录中如果没有 package.json 这个文件的话,那么最新版本的包会被安装。如果存在 package.json 文件,则会在 package.json 文件中查找针对这个包所约定的语义化版本规则,然后安装符合此规则的最新版本。
使用 npm init 即可在当前目录创建一个 package.json 文件,package.json 文件至少要有两部分内容:

  1. “name”        全部小写,没有空格,可以使用下划线或者横线
  2. “version”     x.x.x 的格式,符合“语义化版本规则”
其他内容:
  1. description:描述信息,有助于搜索
  2. main: 入口文件,一般都是 index.js
  3. scripts:支持的脚本,默认是一个空的 test
  4. keywords:关键字,有助于在人们使用 npm search 搜索时发现你的项目
  5. author:作者信息
  6. license:默认是 MIT
  7. bugs:当前项目的一些错误信息,如果有的话
我们需要在 package.json 文件中指定项目依赖的包,这样别人在拿到这个项目时才可以使用 npm install 下载。包有两种依赖方式:
  • dependencies:在生产环境中需要用到的依赖
  • devDependencies:在开发、测试环境中用到的依赖
举个例子:

{
    "name": "my-weex-demo",
    "version": "1.0.0",
    "description": "a weex project",
    "main": "index.js",
    "scripts": {
        "build": "weex-builder src dist",
        "build_plugin": "webpack --config ./tools/webpack.config.plugin.js --color",
        "dev": "weex-builder src dist -w",
        "serve": "serve -p 8080"
    },
    "keywords": [
        "weex"
    ],
    "author": "[email protected]",
    "license": "MIT",
    "devDependencies": {
        "babel-core": "^6.14.0",
        "babel-loader": "^6.2.5",
        "babel-preset-es2015": "^6.18.0",
        "vue-loader": "^10.0.2",
        "eslint": "^3.5.0",
        "serve": "^1.4.0",
        "webpack": "^1.13.2",
        "weex-loader": "^0.3.3",
        "weex-builder": "^0.2.6"
    },
    "dependencies": {
        "weex-html5": "^0.3.2",
        "weex-components": "*"
    }
}
Semantic versioning(语义化版本规则)

dependencies 的内容,以 "weex-html5": "^0.3.2"为例,我们知道 key 是依赖的包名称,value 是这个包的版本。那版本前面的 ^ 或者版本直接是一个 * 是什么意思呢?
这就是 npm 的 “Semantic versioning”,简称”Semver”,中文含义即“语义化版本规则”。在安卓开发中我们有过这样的经验:有时候依赖的包升级后大改版,之前提供的接口不见了,这对使用者的项目可能造成极大的影响。因此我们在声明对某个包的依赖时需要指明是否允许 update 到新版本,什么情况下允许更新。
这就需要先了解 npm 包提供者应该注意的版本号规范。如果一个项目打算与别人分享,应该从 1.0.0 版本开始。以后要升级版本应该遵循以下标准:

  1. 补丁版本:解决了 Bug 或者一些较小的更改,增加最后一位数字,比如 1.0.1
  2. 小版本:增加了新特性,同时不会影响之前的版本,增加中间一位数字,比如 1.1.0
  3. 大版本:大改版,无法兼容之前的,增加第一位数字,比如 2.0.0
了解了提供者的版本规范后, npm 包使用者就可以针对自己的需要填写依赖包的版本规则。作为使用者,我们可以在 package.json 文件中写明我们可以接受这个包的更新程度(假设当前依赖的是 1.0.4 版本):
1. 如果只打算 接受补丁版本的更新 (也就是最后一位的改变),就可以这么写: 
  • 1.0
  • 1.0.x
  • ~1.0.4
2. 如果 接受小版本的更新 (第二位的改变),就可以这么写: 
  • 1
  • 1.x
  • ^1.0.4
3. 如果可以 接受大版本的更新 (自然接受小版本和补丁版本的改变),就可以这么写: 
  • *
  • x
小结一下:总共三种版本变化类型,接受依赖包哪种类型的更新,就把版本号准确写到前一位。

获取字段

通过npm_package_前缀,npm 脚本可以拿到package.json里面的字段。比如,下面是一个package.json。

  1. {
  2. "name": "foo",
  3. "version": "1.2.5",
  4. "scripts": {
  5. "view": "node view.js"
  6. }
  7. }

那么,变量npm_package_name返回foo,变量npm_package_version返回1.2.5。

package-lock.json

package-lock.json是当 node_modules 或 package.json 发生变化时自动生成的文件。这个文件主要功能是确定当前安装的包的依赖,以便后续重新安装的时候生成相同的依赖,而忽略项目开发过程中有些依赖已经发生的更新。其最大的好处就是能获得可重复的构建(repeatable build),当你在CI(持续集成)上重复build的时候,得到的artifact是一样的,因为依赖的版本都被锁住了。在npm5以后,其内容和npm-shrinkwrap.json一模一样。

四、npm run运行

npm 还可以直接运行 package.json 中 scripts 指定的脚本:

{
  "name": "demo",
  "scripts": {
    "lint": "jshint **.js",
    "test": "mocha test/"
  }
}
npm run 是 npm run-script 的缩写。命令行输入 npm run lint  或者  npm run-script lint  就会执行 jshint **.js 。
这些定义在package.json里面的脚本,就称为 npm 脚本。它的优点很多。

  • 项目的相关脚本,可以集中在一个地方。
  • 不同项目的脚本命令,只要功能相同,就可以有同样的对外接口。用户不需要知道怎么测试你的项目,只要运行npm run test即可。
  • 可以利用 npm 提供的很多辅助功能。
查看当前项目的所有 npm 脚本命令,可以使用不带任何参数的npm run命令。
npm 脚本有pre和post两个钩子。举例来说,build脚本命令的钩子就是prebuild和postbuild。用户执行npm run build的时候,会自动按照下面的顺序执行。因此,可以在这两个钩子里面,完成一些准备工作和清理工作。



五、使用淘宝镜像

国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。可以使用淘宝定制的cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
$ cnpm install [name]


猜你喜欢

转载自blog.csdn.net/plpldog/article/details/80869042