包
Node.js的包和模块并没有本质的区别,包是在模块基础上更深一步的抽象,Node.js的包类似于C/C++的函数库或者java的类库,它将某个独立的功能封装起来,用于发布、更新、依赖管理的版本控制。
Node.js包和模块的关系:
Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依赖关系的模块进行统一管理。
Node.js的包遵循CommonJS规范,一个包应该具有如下结构:
包结构 | 作用 |
---|---|
package.json | 包描述文件。 |
bin | 用于存放可执行二进制文件的目录。 |
lib | 用于存放 JavaScript 代码的目录。 |
doc | 用于存放文档的目录 |
NPM
包管理器(Node Package Manage),NPM是Node.js提供的包管理工具,用于下载,安装,升级和删除包,或者发布并维护包。NPM工具默认到https://wwww.npmjs.com上下载和更新第三方模块,如果将自己编写的模块发布到网上,默认也是这个网站。
NPM 是随同 Node.js 一起安装的包管理工具,能解决 Node.js代码部署上的很多问题, 常见的使用场景有以下几种:
- 允许用户从 NPM 服务器下载别人编写的第三方包到本地使用。
- 允许用户从 NPM 服务器下载并安装别人编写的命令行程序(工具)到本地使用。
- 允许用户将自己编写的包或命令行程序上传到 NPM 服务器供别人使用。
NPM的基本使用
常用命令 | 作用 |
---|---|
npm init [-y] | 初始化一个package.json文件 |
npm install | 会根据项目中的package.json文件自动下载项目所需的全部依赖。 |
npm install <包名> | 安装某一个包 |
npm install –g <包名> | 执行全局安装某一个包 |
npm docs <包名> | 查看某一个包的文档 |
npm root -g | 查看全局安装路径 |
npm config set prefix “路径” | 修改全局安装路径 |
npm list | 查看当前目录下安装的所有包 |
npm list -g | 查看全局包的安装路径下所有的包 |
npm update <包名> | 更新当前目录下的某一个包 |
npm uninstall <包名> | 卸载当前目录下的某一个包 |
npm uninstall -g <包名> | 卸载全局安装路径下的某一个包 |
使用NPM初始化项目
初始化后会出现一个package.json配置文件,解决了多个包的管理问题。
NPM安装软件包
当使用 NPM 安装软件包时,可以执行两种安装类型:
1. 本地安装
将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
在这种情况下,npm 还会在当前文件夹中存在的 package.json 文件的 dependencies 属性中添加 lodash 条目。
2. 全局安装
全局的位置到底在哪里?
在 macOS 或 Linux 上,默认可能是 /usr/local/lib/node_modules。 在 Windows 上,默认可能是 C:\Users[用户名]\AppData\Roaming\npm\node_modules。
查看 NPM 包安装的版本
查看所有已安装的 npm 软件包(包括它们的依赖包)的最新版本。
卸载 NPM 软件包
若要卸载之前在本地安装的软件包,则从项目的根文件夹(包含 node_modules 文件夹的文件夹)中运行
如果该软件包是全局安装的,则需要添加 -g 或 --global 标志,此命令可以在系统上的任何位置运行。
package.json文件
package.json 文件作用
package.json 文件其实就是对项目或者模块包的描述,里面包含许多元信息。比如项目名称,项目版本,项目执行入口文件,项目贡献者等等。npm install 命令会根据这个文件下载所有依赖模块。
package.json 文件创建
package.json 文件创建有两种方式,手动创建或者自动创建。
- 手动创建
在项目根目录新建一个 package.json 文件,然后输入相关的内容。
package.json 文件中的内容没有固定的要求。 唯一的要求是必须遵守 JSON 格式,否则,尝试以编程的方式访问其属性的程序则无法读取它。 - 自动创建
在项目根目录下执行 npm init 或 npm init -y,然后根据提示一步步输入相应的内容完成后即可自动创建。
3.3.3 package.json 文件说明
package.json文件的示例,该示例是从 Vue.js 应用程序中提取的:
属性说明
属性 | 作用 |
---|---|
name | 设置了应用程序/软件包的名称。 |
version | 表明了当前的版本。 |
description | 是应用程序/软件包的简短描述。 |
main | 设置了应用程序的入口点。 |
private | 如果设置为 true,则可以防止应用程序/软件包被意外地发布npm。 |
scripts | 定义了一组可以运行的 node 脚本。 |
dependencies | 设置了作为依赖安装的 npm 软件包的列表。用于保存项目的第三方包的依赖信息。 |
devDependencies | 设置了作为开发依赖安装的 npm 软件包的列表。 |
engines | 设置了此软件包/应用程序在哪个版本的 Node.js 上运行。 |
browserslist | 用于告知要支持哪些浏览器(及其版本)。 |
软件包版本
所有的版本都有 3 个数字,第一个是主版本,第二个是次版本,第三个是补丁版本,具有以下规则:
版本说明符 | 作用 |
---|---|
~ | 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。 |
^ | 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.1、0.14.0、依此类推。 |
* | 如果写入的是 *,则表示接受所有的更新,包括主版本升级。 |
> | 接受高于指定版本的任何版本。 |
>= | 接受等于或高于指定版本的任何版本。 |
<= | 接受等于或低于指定版本的任何版本。 |
< | 接受低于指定版本的任何版本。 |
无符号 | 仅接受指定的特定版本。 |
latest | 使用可用的最新版本。 |
package-lock.json文件
在Node5 中,npm 引入了 package-lock.json 文件。当安装包的时候,npm都会生成或者更新package-lock.json文件。
package-lock.json文件锁定所有模块的版本号,包括主模块和所有依赖子模块。当你执行npm install时,node从package.sjon文件读取模块名,从package-lock.json文件中获取版本号,然后下载更新。
当我们使用npm管理包时,package.json 及package-lock.json 的内容都会自动更新。
require加载第三方模块的规则
第三方模块加载规则:
- 先在当前文件的模块所属目录去找 node_modules目录如果找到,则去该目录中找 模块名的目录,如 : jquery。
- 如果找到 jquery目录,则找该目录中的 package.json文件,如果找到 package.json 文件,则找该文件中的 main属性,如果找到main 属性,则拿到该属性对应的文件。
- 如果找到 jquery目录之后,没有package.json或者有 package.json没有 main 属性或者有 main 属性,但是指向的路径不存在,则 node 会默认去看一下jquery目录中有没有 index.js --> index.json–> index.node 文件,如果找不到index 或者找不到 jquery或者找不到 node_modules,则进入上一级目录找 node_moudles 查找(规则同上)。如果上一级还找不到,继续向上,一直到当前文件所属磁盘的根目录。如果到磁盘概目录还没有找到,则会报错:can not find module xxx。
注意:一个项目只有一个node_modules,放在项目根目录中,子目录可以直接调用根目录的文件。
安装CNPM
npm存储包文件的服务器在国外,有时候会被墙,速度很慢,所以需要解决这个问题。淘宝 NPM 镜像是一个完整 npmjs.org 镜像,可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
淘宝 npm 镜像官网:https://developer.aliyun.com/mirror/NPM
安装命令:npm install -g cnpm --registry=https://registry.npm.taobao.org
安软件包的时候把以前的npm替换成cnpm。
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位指点,在此表示感激不尽。文章持续更新中…