# 包
* 包(Package)是 Node.js 最重要的支柱。
* Node.js 根据 CommonJS 规范实现了包机制,但不完全遵循。
* 包是在模块基础上更深一步的抽象,Node.js 的包类似于 C/C++ 的函数库或者 Java/.Net 的类库。它将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制。
* 开发中使用 npm 来解决包的发布和获取需求。Node.js package manager
# 包规范
## CommonJS 包规范和 Node.js 包实现
CommonJS 规范的包应该具备以下特征:
* package.json 必须在包的顶层目录下;
* 二进制文件应该在 bin 目录下;
* JavaScript 代码应该在 lib 目录下;
* 文档应该在 doc 目录下;
* 单元测试应该在 test 目录下。
Node.js 对包的要求并没有这么严格,要求如下:
* 包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json;
* 但为了提高兼容性,建议在制作包的时候,严格遵守 CommonJS 规范。
Node.js 在调用某个包时,会首先检查包中 package.json 文件的 main 字段,将其作为包的接口模块,如果 package.json 或 main 字段不存在,会尝试寻找 index.js 或 index.node 作为包的接口。
## package.json
package.json 是 CommonJS 规定的用来描述包的文件,完全符合规范的 package.json 文件应该含有以下字段。
* name :包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。
* description :包的简要说明。
* version :符合语义化版本识别规范的版本字符串。
* keywords :关键字数组,通常用于搜索。
* maintainers :维护者数组,每个元素要包含 name、email(可选)、web (可选)字段。
* contributors :贡献者数组,格式与 maintainers 相同。包的作者应该是贡献者数组的第一个元素。
* bugs :提交 bug 的地址,可以是网址或者电子邮件地址。
* licenses :许可证数组,每个元素要包含 type(许可证的名称)和 url(链接到许可证文本的地址)字段。
* repositories : 仓库托管地址数组,每个元素要包含 type(仓库的类型,如 git )
* url(仓库的地址)和 path(相对于仓库的路径,可选)字段。
* dependencies :生成环境包的依赖,一个关联数组,由包名称和版本号组成。
* devDependencies:开发环境包的依赖,一个关联数组,由包的名称和版本号组成。
# npm
npm 是 Node.js 官方提供的包管理工具,它已经成了 Node.js 包的标准发布平台。用于 Node.js 包的发布、传播、依赖控制。npm 提供了命令行工具,使你可以方便地下载、安装、升级、删除包,也可以让你作为开发者发布并维护包。常用的引用场景:
* 开发者从 npm 服务器下载别人编写的第三方包到本地使用。
* 开发者从 npm 服务器下载并安装别人编写的命令行程序到本地使用。
* 开发者将自己编写的包或命令行程序上传到 npm 服务器供别人使用。
在安装 Node.js 的时候已一并安装了,不需要额外安装。
## 使用 nmp 被墙问题
使用 npm 安装包时候,其会到 [npm 包网站](https://www.npmjs.com/)下载依赖,但有这个网站是国外,在下载依赖的时候会很慢或是下载失败。
* 配置淘宝镜像,淘宝 NPM 镜像,与官方 npm 的同步频率目前为 10 分钟一次。[官方网站](http://npm.taobao.org/)
~~~
npm config set registry=https://registry.npm.taobao.org
~~~
* 安装 cnpm,安装完之后使用 cnpm 来操作。
~~~
npm install -g cnpm –registry=https://registry.npm.taobao.org
~~~
## 包的相关命令
* 安装包命令:`npm install [-g] 包名[@版本号] [-D]`
* 带有 -g,表示全局安装,安装到 Node.js 根据目录 node\_modules 文件夹中,用于命令行下使用,不带有 -g 表示本地安装,安装到当前项目中 node\_modules 文件夹中,并修改 package.json 中包依赖配置,用于当前项目用开发使用。
* 没有带版本号的话安装的是最新版本,带了版本号安装指定版本。
* 不带 -D 表示生产环境的包依赖,带了 -D 表示开发环境的包依赖。
* 查看包命令:`npm list [-g] [包名]`
* 带有 -g,表示全局查看,不带有 -g 表示本地查看。
* 带有包名表示查看特定包,不带有包名表示查看所有包。
* 更新包命令:`npm update [-g] [包名][@版本号]`
* 带有 -g,表示全局更新,不带有 -g 表示本地更新。
* 带有包名表示更新特定包,不带有包名表示更新所有包。
* 没有带版本号的话更新到最新版本,带了版本好更新到指定的版本。
* 卸载包命令:`npm uninstall [-g] 包名`
* 带有 -g,表示全局卸载,不带有 -g 表示本地卸载。
## 全局包操作
~~~
npm install -g es-checker // 安装检测 Node.js 对 ES6 工具
es-checker // 在命令行输入这命令就可以查看
npm list -g es-checker // 查看 es-checker 包
npm list -g // 查看所有的包
npm update -g es-checker // 更新 es-checker 包
npm uninstall -g es-checker // 卸载 es-checker 包
~~~
## 本地包操作
### 创建包
* 首先建一个文件夹,例如 somepackage。
* 在这目录里打开 Windows 命令行(终端)
* 输入命令 `npm init` 即可,根据提示输入,作为 package.json 文件的内容。
* 若想生成 package.json 内容都使用默认值,那么输入命令 `npm init -y` 按回车即可。
* 命令执行完之后,在 somepackage 目录出现 package.json 文件。
* 自己手动在 somepackage 中新建一个 index.js 文件。
* 运行此包:
* `node .` 执行当前项目 packjson 中 main 指向的 JavaScript 文件。
* `npm run test` 执行的是 scripts 中 test 字段对应命令。
### 安装包,更新包,卸载包
~~~
npm install ejs
npm update ejs
npm list ejs
npm uninstall ejs
~~~
### 使用包
参考官方文档,在当前项目中,新建两个文件写好下面的代码,之后在命令行运行 node index.js 就可以看到效果。
```
// index.js
const ejs = require('ejs');
people = ['geddy', 'neil', 'alex'];
html = ejs.render('<%= people.join(", "); %>', {people: people});
console.log(html);
```
- NodeJs
- 01-万维网
- 02-CS 架构 VS BS 架构
- 03-Web 服务器访问流程
- 04-url
- 05-网络传输协议
- 06-HTTP 协议
- 07-报文
- 08-命令行界面
- 09-什么是 Node.js
- 10-环境安装及配置
- 11-JavaScript 代码运行环境
- 12-全局对象
- 13-Buffer
- 14-模块化
- 15-EventEmitter
- 16-path模块
- 17-流式操作
- 18-包
- 19-模板技术
- 20-ejs入门
- 21-express
- 01-什么是express
- 02-Hellow Express
- 03-静态资源服务
- 04-路由
- 05-模块化路由处理程序
- 06-中间件
- 07-手动实现中间件
- 08-常用内置中间件和第三方中间件
- 09-响应
- 10-获取请求参数
- 11-Express 中使用模板引擎
- 22-web存储与安全
- 01-cookie
- 02-sessionStorage
- 03-localStorage
- 04-base64
- 05-https
- 06-同源策略