Node.js从入门到实战(三)Npm使用介绍
一、NPM
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
$ npm -v
2.3.0
npm的安装和升级:
npm的安装通过官网进行,升级通过如下npm命令:
npm install [email protected] -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而已,比如
-
npm install express # 本地安装
-
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 文件可以有以下几点作用:
- 作为一个描述文件,描述了你的项目依赖哪些包
- 允许我们使用 “语义化版本规则”(后面介绍)指明你项目依赖包的版本
- 让你的构建更好地与其他开发者分享,便于重复使用
在npm使用时,在本地目录中如果没有 package.json 这个文件的话,那么最新版本的包会被安装。如果存在 package.json 文件,则会在 package.json 文件中查找针对这个包所约定的语义化版本规则,然后安装符合此规则的最新版本。
使用 npm init 即可在当前目录创建一个 package.json 文件,package.json 文件至少要有两部分内容:
- “name” 全部小写,没有空格,可以使用下划线或者横线
- “version” x.x.x 的格式,符合“语义化版本规则”
- description:描述信息,有助于搜索
- main: 入口文件,一般都是 index.js
- scripts:支持的脚本,默认是一个空的 test
- keywords:关键字,有助于在人们使用 npm search 搜索时发现你的项目
- author:作者信息
- license:默认是 MIT
- bugs:当前项目的一些错误信息,如果有的话
- 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 版本开始。以后要升级版本应该遵循以下标准:
- 补丁版本:解决了 Bug 或者一些较小的更改,增加最后一位数字,比如 1.0.1
- 小版本:增加了新特性,同时不会影响之前的版本,增加中间一位数字,比如 1.1.0
- 大版本:大改版,无法兼容之前的,增加第一位数字,比如 2.0.0
1. 如果只打算接受补丁版本的更新(也就是最后一位的改变),就可以这么写:
- 1.0
- 1.0.x
- ~1.0.4
- 1
- 1.x
- ^1.0.4
- *
- x
获取字段
通过npm_package_前缀,npm 脚本可以拿到package.json里面的字段。比如,下面是一个package.json。
-
{
-
"name": "foo",
-
"version": "1.2.5",
-
"scripts": {
-
"view": "node view.js"
-
}
-
}
那么,变量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 脚本有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]