npm 简介

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

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用

关于npm的一些说明:

  • 新版的nodejs已经集成了npm,可以通过输入 npm -v来测试是否成功安装。但是,Node附带的npm可能不是最新版本,最好用命令 npm install npm@latest -g 更新到最新版本。命令中,@latest 表示最新版本,-g 表示全局安装。所以,命令的主干是npm install npm,也就是使用npm安装自己。之所以可以这样,是因为npm本身与Node的其他模块没有区别
  • $ npm help 查看 npm 命令列表
  • $ npm -l 查看 npm 各个命令的简单用法
  • $ npm -v 查看 npm 的版本
  • $ npm config list -l 查看 npm 的配置

使用 npm 命令安装模块

  • 语法格式: $ npm install <模块名> 例如使用 npm 安装 jquery 框架 $ npm install jquery 安装好之后,jquery库文件 就放在了工程目录下的 node_modules 目录中

全局安装与局部安装

  • npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已
    1
    2
    npm install jquery          # 本地安装
    npm install jquery -g # 全局安装

如果出现以下错误:

1
npm err! Error: connect ECONNREFUSED 127.0.0.1:8087

解决办法为:

1
$ npm config set proxy null

  • 本地安装:
      1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
      1. 本地安装的模块只在当前目录下使用
  • 全局安装:
      1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
      1. 可以任何目录下都可以使用全局安装的模块

卸载模块

  • 我们可以使用命令:$ npm uninstall jquery 来卸载模块 ,如果安装时安装为依赖–save 或者 –save-dev 在卸载的时候需要这样 $ npm uninstall --save express $ npm uninstall --save-dev express

更新模块

  • 我们可以使用命令:$ npm update express 来更新模块

搜索模块

  • 我们可以使用命令:$ npm search express 来搜索模块

package.json 配置文件

  • 每个项目的根目录下面,一般都有一个 package.json 文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境
  • 下面是一个最简单的package.json文件,只定义两项元数据:项目名称和项目版本

    1
    2
    3
    4
    {
    "name" : "豆瓣电影",
    "version" : "1.1.0",
    }
  • 上面代码说明,package.json文件内部就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。比如name就是项目名称,version是版本

  • 下面是一个更完整的package.json文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    {
    "name": "Hello World",
    "version": "0.0.1",
    "author": "张三",
    "description": "第一个node.js程序",
    "keywords":["node.js","javascript"],
    "repository": {
    "type": "git",
    "url": "http://github.com/isaacs/npm.git"
    },
    "license":"MIT",
    "contributors":[{"name":"李四","email":"lisi@example.com"}],

    "scripts": {
    "start": "node index.js"
    },
    "dependencies": {
    "express": "latest",
    "mongoose": "~3.8.3",
    "handlebars-runtime": "~1.0.12",
    "express3-handlebars": "~0.5.0",
    "MD5": "~1.2.0"
    },
    "devDependencies": {
    "bower": "~1.2.8",
    "grunt": "~0.4.1",
    "grunt-contrib-concat": "~0.3.0",
    "grunt-contrib-jshint": "~0.7.2",
    "grunt-contrib-uglify": "~0.2.7",
    "grunt-contrib-clean": "~0.5.0",
    "browserify": "2.36.1",
    "grunt-browserify": "~1.3.0",
    }
    }

字段说明

  • name 定义项目的名称 (必填)
  • version 定义项目的版本 (必填)
  • description 项目的简介 (选填)
  • keywords 关键字 (选填)
  • author 项目的作者 (选填)
  • contributors 项目成员 (选填)
  • repository 指定代码存放的地方 (选填)
  • license 许可证 (选填)

scripts 字段

  • scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。
  • 下面的设置指定了npm run preinstallnpm run postinstallnpm run startnpm run test 时,所要执行的命令
    1
    2
    3
    4
    5
    6
    "scripts": {
    "preinstall": "echo here it comes!",
    "postinstall": "echo there it goes!",
    "start": "node index.js",
    "test": "tap test/*.js"
    }

生产依赖 和 开发依赖

  • dependencies 字段指定了项目运行所依赖的模块(生产依赖)
  • devDependencies 指定项目开发所需要的模块(开发依赖)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    "devDependencies": {
    "bower": "~1.2.8",
    "grunt": "~0.4.1",
    "grunt-contrib-concat": "~0.3.0",
    "grunt-contrib-jshint": "~0.7.2",
    "grunt-contrib-uglify": "~0.2.7",
    "grunt-contrib-clean": "~0.5.0",
    "browserify": "2.36.1",
    "grunt-browserify": "~1.3.0",
    }

版本号说明:

  • 1.2.2 指定版本,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。
  • ~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。
  • ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。
  • latest:安装最新版本。
  • package.json文件可以手工编写,也可以使用 npm init 命令自动生成,这个命令采用互动方式,要求用户回答一些问题,然后在当前目录生成一个基本的package.json文件。所有问题之中,只有项目名称(name)和项目版本(version)是必填的,其他都是选填的
  • 有了package.json文件,直接使用npm install命令,就会在当前目录中安装所需要的模块
  • 如果一个模块不在package.json文件之中,可以单独安装这个模块,并使用相应的参数,将其写入package.json文件之中
    1
    2
    $ npm install jquery --save
    $ npm install jquery --save-dev

上面代码表示单独安装jquery模块
--save 参数表示将该模块写入dependencies 属性,
--save-dev表示将该模块写入devDependencies 属性。

package-lock.json 文件

  • 官网有介绍 package-lock.json
  • 大概意思就是说 package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or package.json. It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.

node 的系统模块

在介绍如何写自己的模块前,我们先来了解一下一些 Node.js 的系统模块,当然我们可以很简单的引入任何一个系统模块通过 require 关键字如: const http = require('http');

  • Assertion Testing 断言模块
  • Child Processes 子进程模块
  • Cluster 集群
  • fs 文件系统
  • http http服务器
  • Crypto 加密相关的 如 MD5 和 sha
  • Events 事件模块
  • Net 网络操作相关
  • OS 操作系统信息
  • Path 处理文件路径
  • Process 进程信息
  • Stream 流
  • Timers 定时器
  • TLS/SSL 加密传输
  • Utilities 工具类
  • VM 虚拟机
  • Zlib 压缩
    这里仅仅列出了一些常用的模块,还有很多其他的模块可以参考 Node.js 官网
    在命令行里面 直接通过命令 npm 可以看见 npm 的相关命令

写自己的模块并引入使用

  • 这个地方需要两个文件:1 my_module.js(我们写的模块,等待别的地方引入使用) 2 1.js(需要使用模块的文件)
  • 代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    //my_module.js 文件
    exports.a = 12;
    exports.b = 34;

    //1.js 文件
    //./表示在当前目录
    const my_module = require('./my_module.js');//引入我们的模块文件
    console.log(my_module.a,my_module.b);使用其中暴露的变量
  • 效果图如下:

  • pic
    使用自己的模块
  • 注意:
    • 可以看到,我们想要对外输出东西,是在 exports 上面加属性,这样略显麻烦,当我们想要输出很多东西的时候
    • 引入模块时是可以省略后缀名 .js
    • require 引入模块的规则:如果有 ./ 就从当前目录开始查找,如果没有,就先从系统模块查找,找不到再从 node_modules 文件夹里面去找
    • 这里引入自己的模块,可以不加 ./ 这时候就必须将模块放在 node_modules 文件夹里面。当放在当前目录里面,不加 ./ 是找不到模块的,以及放在 node_modules 文件夹里面加上 ./ 也是找不到的。可以看到 node_modules 是专门用来放模块的文件夹,可以放下载下来的模块,也可以存放自己写的模块
    • 模块里面没有全局变量,模块会自己加一层局部作用域如: (function(){ })()
    • 如果想要批量的输出东西可以: module.exports = {};

批量的导出数据

  • 代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //1.js
    const my_module = require('./my_module.js');
    console.log(my_module.a,my_module.b);
    console.log(my_module.sum(30,70));

    //my_module.js
    var a = 1;
    var b = 2;
    function sum (){
    return arguments[0] + arguments[1];
    }
    module.exports={a:a,b:b,sum:sum};
  • 结果截图:

  • pic
    批量的导出

npm 发布自己写的模块

  • 未完 待续,欲知后事如何,请听下回分解