NPM的组成及简单原理
npm 由三个独立的部分组成:
- 网站
- 注册表(registry)
- 命令行工具 (CLI)
网站
是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径。注册表
是一个巨大的数据库,保存了每个包(package)的信息。CLI
通过命令行或终端运行。开发者通过 CLI 与 npm 打交道。
NPM 的实现原理大概是这样的:
买个服务器作为代码仓库(registry),在里面放所有需要被共享的代码
发邮件通知 jQuery、Bootstrap、Underscore 作者使用 npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和 underscore(注意大小写)
社区里的其他人如果想使用这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json 里,然后运行 npm install ,npm 就会帮他们下载代码
下载完的代码出现在 node_modules 目录里,可以随意使用了。
这些可以被使用的代码被叫做「包」(package),这就是 NPM 名字的由来:Node Package(包) Manager(管理器)
。
使用 npm 命令安装模块
我们使用 npm 命令安装模块 express:
1 | $ npm install express |
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。
1 | var express = require('express'); |
全局安装与本地安装
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
1 | npm install express # 本地安装 |
如果出现以下错误:
1 | npm err! Error: connect ECONNREFUSED 127.0.0.1:8087 |
解决办法为:
1 | $ npm config set proxy null |
本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。
使用全局方式安装 express
1 | npm install express -g |
安装过程输出如下内容,第一行输出了模块的版本号及安装位置。
1 | express@4.13.3 node_modules/express |
查看安装信息
npm list -g
命令来查看所有全局安装的模块:
1 | $ npm list -g |
npm list XXX
查看某个模块的版本号
1 | $ npm list webpack |
使用 package.json
package.json 位于模块的目录下,用于定义包的属性。
1 | { |
Package.json 属性说明
- name - 包名。
- version - 包的版本号。
- description - 包的描述。
- homepage - 包的官网 url 。
- author - 包的作者姓名。
- contributors - 包的其他贡献者姓名。
- dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
- repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
- main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
- keywords - 关键字
卸载模块
我们可以使用以下命令来卸载 Node.js 模块。
1 | $ npm uninstall webpack |
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
1 | $ npm ls |
更新模块
我们可以使用以下命令更新模块:
1 | $ npm update webpack |
搜索模块
使用以下来搜索模块:
1 | $ npm search webpack |
注册用户
1 | $ npm adduser |
发布模块
1 | $ npm publish |
npx是什么
- npx是npm5.6以后自带的一个命令,这个命令的作用和
npm
命令是一样的,都是为了安装第三方的包- 但是npm命令会直接把依赖下载到本地的开发环境(例如执行
npm install
后,就会生成一个node_modules
文件夹) - npx会先到项目的文件夹中找,如果找到的话,直接使用
node_modules
里的命令,没有的话就去下载到内存中
,执行后相关命令后,马上就会删除内存中的依赖,实现无入侵的执行命令 - 简单来说,npx是为了在不侵入源代码的基础上,调用
node_modules
中的命令行工具
- 但是npm命令会直接把依赖下载到本地的开发环境(例如执行