欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-31 20:04:36
...

一、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 [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而已,比如
  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]