Webcourse/10-Node.js和数据库/01-Node.js介绍和环境配置.md
2020-04-20 10:16:01 +08:00

787 lines
19 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Node.js的介绍
### 什么是 Node.js
Node.js 是一个基于 **Chrome V8** 引擎的 JavaScript 运行环境Node.js使用了一个**事件驱动****非阻塞式I/O**的模型 Node.js的特性使其轻量级又高效Node.js 的包管理工具 npm 是全球最大的开源库生态系统
![](http://img.smyhvae.com/20180301_1540.png)
如上图所示
- Node.js 不是一门语言也不是 JavaScript 的框架**Node.js是 JavaScript 语言在服务器端的运行环境平台**
- Node.js 内部采用 Google Chrome V8 引擎作为 JavaScript 语言解释器同时结合自行开发的 libuv 扩展了 JS 的功能使得 JS 既可以在前端进行DOM操作浏览器端又可以在后端调用操作系统资源I/O操作文件读写数据库操作等是目前最简单的全栈式语言
### Node.js的特点
- 事件驱动
- 非阻塞IO模型异步
- 轻量和高效
### 运行环境平台的含义
首先JavaScript 语言通过 Node 在服务器上运行在这个意义上Node 有点像 JavaScript 虚拟机
其次Node 生态系统活跃提供了大量的开源库使得 JavaScript 语言能与操作系统进行交互比如读写文件新建子进程在这个层次上Node 又是属于 JavaScript 的工具库
**引申**
与PHPJSPPythonPerlRuby的既是语言也是平台不同Node.js的使用JavaScript进行编程运行在 Chrome V8 引擎上
与PHPJSP等相比PHPJSP.net都需要运行在服务器程序上ApacheNaginxTomcatIIS
Node.js跳过了ApacheNaginxIIS等HTTP服务器它自己不用建设在任何服务器软件之上Node.js的许多设计理念与经典架构LAMP = Linux + Apache + MySQL + PHP有着很大的不同可以提供强大的伸缩能力Node.js没有web容器
## Node.js和服务器端开发
> 在这一段服务器端开发后台开发是一个概念
### 前端同学为什么要学习后台开发
- 了解前后端交互流程
- 能够和后台开发的程序员更佳紧密地结合更顺畅地沟通
- 当网站的业务逻辑需要前置时前端人员需要学习一些后台开发的技术以完成相应的任务
- 拓宽知识视野和技术栈能够站在全局的角度审视整个项目
### 为什么选择 Node.js 做后台开发Node.js的优势
1使用 JavaScript 语言开发服务器端应用**便于前端同学上手**一些公司甚至要求前端工程师掌握 Node.js 开发
2**性能高**AO操作的性能可能没有优势但运算方面的性能不错
3**有利于和前端代码整合**甚至共用部分代码
比如说针对接口返回的各种字段前后端都必须要做校验此时如果用 Node.js 来做后台开发的话前后端可以共用校验的代码
4Node.js 生态系统活跃提供了大量的开源库
**思考**限制语言能力的不是语言本身而是语言的运行环境平台
### Node.js 的用途
**1中间层**
前端访问中间层的接口中间层再访问后台的 Java/C++ 服务这样做的好处是安全性不会把主服务器暴露在外面提高性能做缓存等降低主服务器的复杂度
当然有时候做 Node.js 开发是因为后台人力不够所以把后台开发的一部分工作量转移给前端同学
**2做公司内部工具项目构建工具**
**3做小型服务小型网站的后端**比如管理系统
需要声明的是目前来看Node.js很难像 Java/C++ 那样成为后台的主力开发语言这并非是因为 Node.js的性能问题实际上Node.js的性能还不错主要是因为Node.js的框架的支持度不够很难独立成为后台开发语言
### Node.js 的组成
我们知道JavaScript 的组成分为三个部分
- ECMAScript
- DOM
- BOM
ECMAScript JS 的语法DOM BOM 浏览器运行环境为 JS 提供的API
Node.js 的组成分为
- **ECMAScript**ECMAScript的所有语法在Node环境中都可以使用
- **Node 环境**提供的一些**附加API**(包括文件网络路径等等 API)
如下图所示
![](http://img.smyhvae.com/20200409_1545.png)
## Node.js的发展
### Node 的历史
Node.js 诞生于 2009 Joyent 的员工 Ryan Dahl 开发而成, 目前官网最新版本已经更新到 13.x.x版本最新稳定的是10.15.3
- 2008年左右随着 Ajax 的逐渐普及Web 开发逐渐走向复杂化系统化
- 2009年2月Ryan Dahl 想要创建一个轻量级适应现代 Web 开发的平台
- 2009年5月Ryan Dahl GitHub 中开源了最初版本同年11月JSConf 就安排了 Node 讲座
- 2010年底Joyent 公司资助Ryan Dahl 也加入了该公司专门负责 Node 的开发
- 2011年7月在微软的支持下登陆 Windows 平台PSnode 的生产环境基本是在 Linux
Node.js 创始人 Ryan Dahl 回忆他最初希望采用 Ruby但是 Ruby 的虚拟机效率不行
注意 Node 选择了 JavaScript不是 JavaScript 发展出来了一个 Node
### Node.js的主要应用领域
- RESTFul API
- 实时通信如消息推送等
- 高并发
- I/O阻塞
### 知名度较高的Node.js开源项目
![](http://img.smyhvae.com/20180301_2009.png)
- expressNode.js中著名的web服务器框架
- Koa下一代的 Node.js Web 框架
- mocha功能强大的 node.js 测试框架
- PM2node 本来是单进程的PM2可以实现和管理多进程
- jade非常优秀的模板引擎不仅限于 js 语言
- CoffeeScript用简洁的方式展示 JavaScript 优秀的部分
- Atom文本编辑器
- socket.io实时通信框架
## Node.js 运行环境配置通过 Node.js 安装包不推荐
Node.js [官网](https://nodejs.org/en/)下载安装包:
![](http://img.smyhvae.com/20180301_1505.png)
我们也可以在<https://nodejs.org/en/download/releases/> 里下载历史版本。
![](http://img.smyhvae.com/20180301_1507.png)
注意我们以一定要用偶数版V4V6等)不要用奇数版比如V5因为奇数版不稳定
后续如果需要安装其他版本可以这样做重新下载最新的安装包覆盖安装即可
但我们并不推荐直接采用 Node.js.msiwindows或者 Node.js.pkgMac 安装包进行安装因为会产生如下问题
**通过 Node.js 安装包产生的问题**
- 安装新版本时以前版本安装的很多全局工具包需要重新安装
- 无法回滚到之前的版本
- 无法在多个版本之间切换很多时候我们要使用特定版本
因此我们暂时先不用安装 Node.js稍后用 NVM 的方式来安装 Node.js
### Node.js 版本常识
- 偶数版本为稳定版0.6.x 0.8.x 8.10.x
- 奇数版本为非稳定版0.7.x 0.9.x 9.11.x
- LTSLong Term Support
参考链接[node.js中LTS和Current的区别](https://blog.csdn.net/u012532033/article/details/73332099)
## Node.js 运行环境配置通过 NVM推荐
**NVM**node.js version manager用来管理 node 的版本
**我们可以先安装 NVM然后通过 NVM 安装 Node.js**这是官方推荐的做法
Windows Mac 下安装的Node.js 的步骤如下
### Windows 系统安装 Node.js
**1安装 NVM**
1我们去 <https://github.com/coreybutler/nvm-windows/releases> 下载 NVM 的安装包:
![](http://img.smyhvae.com/20180301_1603.png)
下载下来后直接解压到 `D:\web`目录下
![](http://img.smyhvae.com/20180301_1610.png)
2在上面的目录中新建一个`settings.txt`文件里面的内容填充如下
```bash
root: D:\web\nvm
path: D:\web\nodejs
arch: 64
proxy
```
上方内容的解释
- root 配置为当前 nvm.exe 所在的目录
- path 配置为node 快捷方式所在的目录
- arch 配置为当前操作系统的位数32/64
- proxy 不用配置
3配置环境变量
- `NVM_HOME` = `D:\web\nvm`当前 nvm.exe 所在目录
- `NVM_SYMLINK` = `D:\web\nodejs` node 快捷方式所在的目录
- PATH += `;%NVM_HOME%;%NVM_SYMLINK%`
配置成功后重启资源管理器
**2验证**( cmd 命令行中输入命令)
1输入`nvm`命令查看环境变量是否配置成功
![](http://img.smyhvae.com/20180301_1645.png)
2输入 `nvm ls`查看已安装的所有 node 版本
3输入 `nvm -v`查看 已安装的 nvm 版本
4输入 `node -v`查看正在使用的 node 版本
- **参考链接**[安装npmnvmnode](https://segmentfault.com/a/1190000011114680)
如果 Node 安装失败可以参考上面这个链接
**3安装指定版本的 Node.js**
```bash
nvm install 版本号
# 举例
nvm install 8.10.0
```
输入 `node -v`查看当前使用的 node 版本
关于 NVM 的常用命令详见下一段
### Mac 系统安装 Node.js
**1安装 NVM**
1打开 终端.app输入
```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
```
安装成功的界面
![](http://img.smyhvae.com/20180302_2126.png)
完成后nvm就被安装在了`~/.nvm`
如果发现安装失败
![](http://img.smyhvae.com/20180302_2111.png)
原因Xcode 软件进行过更新
解决办法打开 Xcode 软件同意相关内容即可
2配置环境变量
编辑器打开`~/.bash_profile`文件如果不会就输入`open ~/.bash_profile`
补充如果你的Mac电脑里找不到`~/.bash_profile`文件那就找找有没有`~/.profile`文件或者`~/.bashrc`文件或者`~/.zshrc`文件如果还是没有那你就手动创建一个`~/.bash_profile`文件
在最后一行输入
```bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
```
如果你发现文件中已经存在了上面这行代码就不用往里面加了这一步的作用是每次新打开一个bashnvm都会被自动添加到环境变量中
最后输入 `source ~/.bash_profile`重启环境变量的配置
PSNVM 现在已经不支持 Homebrew 的方式来安装了
参考链接<https://www.jianshu.com/p/a3f8778bc0a1>
**2验证**( 终端命令行中输入命令)
1输入 `nvm` 命令查看环境变量是否配置成功
2输入 `nvm ls`查看已安装的所有 node 版本
3输入 `nvm -v`查看 已安装的 nvm 版本
4输入 `node -v`查看正在使用的 node 版本
**3安装指定版本的 Node.js**
和Windows下一样也是执行如下命令
```bash
nvm install 版本号
# 举例
nvm install 8.10.0
```
网速有点慢要稍等
![](http://img.smyhvae.com/20180302_2148.png)
输入 `node -v`查看当前使用的 node 版本
安装好 `Node` 之后`npm` 也会自动安装的输入 `npm -v`查看 npm 的版本
关于 NVM 的常用命令详见下一段
## NVM 的常用命令
> 注意这一段说的是 NVM 的常用命令不是 Node 的常用命令
查看当前使用的 nvm 版本
```bash
nvm -v
nvm --version
```
查看本地安装的所有的 Node.js 版本
```bash
nvm list|ls
```
**安装指定版本的 Node.js**
```bash
nvm install 版本号
# 举例
nvm install 8.10.0
```
卸载指定版本 Node.js
```bash
nvm uninstall 版本号
```
切换使用指定版本的node
```bash
nvm use 版本号
```
## Node.js 的常用命令
查看 node 的版本
```bash
$ node -v
```
执行脚本字符串
```bash
$ node -e 'console.log("Hello World")'
```
运行脚本文件
```bash
$ node index.js
$ node path/index.js
$ node path/index
```
查看帮助
```bash
$ node --help
```
**进入 REPL 环境**
```bash
$ node
```
REPL 的全称ReadEval PrintLoop类似于浏览器的控制台
![](http://img.smyhvae.com/20180301_1900.png)
如果要退出 REPL 环境可以输入`.exit` `process.exit() `
VS Code 我们可以在菜单栏选择帮助->切换开发人员工具打开console控制台
## 包和 NPM
### 什么是包
由于 Node 是一套轻内核的平台虽然提供了一系列的内置模块但是不足以满足开发者的需求于是乎出现了包package的概念
与核心模块类似就是将一些预先设计好的功能或者说 API 封装到一个文件夹提供给开发者使用
Node 本身并没有太多的功能性 API所以市面上涌现出大量的第三方人员开发出来的 Package
### 包的加载机制
如果 Node中自带的包和第三方的包名冲突了该怎么处理呢原则是
- 先在系统核心优先级最高的模块中找
- 然后到当前项目中 node_modules 目录中找
比如说
```javascript
requiere(`fs`)
```
那加载的肯定是系统的包所以我们尽量不要创建一些和现有的包重名的包
### NPM的概念
>包的生态圈一旦繁荣起来就必须有工具去来管理这些包NPM 应运而生
**NPM**Node Package Manager官方链接 <https://www.npmjs.com/>
随着时间的发展NPM 出现了两层概念
- 一层含义是 Node 的开放式模块登记和管理系统亦可以说是一个生态圈一个社区
- 另一层含义是 Node 默认的模块管理器是一个命令行下的软件用来安装和管理 Node 模块
### NPM 的安装不需要单独安装
NPM 不需要单独安装默认在安装 Node 的时候会连带一起安装 NPM
![](http://img.smyhvae.com/20180302_1105.png)
NVMNodeNPM 安装之后目录分布如下
![](http://img.smyhvae.com/20180302_1134.png)
![](http://img.smyhvae.com/20180302_1137.png)
![](http://img.smyhvae.com/20180302_1138.png)
输入 `npm -v`查看 npm 的版本
![](http://img.smyhvae.com/20180302_1139.png)
如果上方命令无效可能是之前的 node 并没有完全安装成功解决办法<https://segmentfault.com/a/1190000011114680>
另外Node 附带的 NPM 可能不是最新版本可以用下面的命令更新到最新版本
```bash
$ npm install npm -g
```
### 配置 NPM 的全局目录暂略
NPM 默认安装到当前正在使用 Node 版本所在目录下我们建议重新配置 NPM 的全局目录
输入`npm config ls`查看
![](http://img.smyhvae.com/20180302_1210.png)
## NPM的常用命令
查看 npm 当前版本
```bash
npm -v
```
更新 npm
```bash
npm install npm@latest -g
```
项目初始化执行完成后会生成`package.json`文件
```bash
npm init
# 快速跳过问答式界面,选择默认配置
npm init --yes
```
只在当前工程下安装指定的包
```bash
npm install [package]
```
在全局安装指定的包
```
npm install -g [package]
```
安装的包只用于开发环境不用于生产环境会出现在 package.json 文件中的 devDependencies 属性中
```bash
npm install [package] --save-dev
# 或者
npm install [package] -D
```
安装的包需要发布到生产环境会出现在 package.json 文件中的 dependencies 属性中
```bash
npm install [package] --save
# 或者
npm install [package] -S
```
查看当前目录下已安装的node包
```bash
npm list
```
查看全局已经安装的node包
```bash
npm list -g
```
查看npm帮助命令
```bash
npm --help
```
查看指定命令的帮助
```bash
npm [指定命令] --help
```
更新指定的包
```bash
npm update [package]
```
卸载指定的包
```bash
npm uninstall [package]
```
查看配置信息
```bash
npm config list
```
查看本地安装的指定包的信息没有则显示empty
```bash
npm ls [package]
```
查看全局安装的指定包的信息没有则显示empty
```bash
npm ls [package] -g
```
查看远程npm上指定包的所有版本信息
```bash
npm info [package]
```
查看当前包的安装路径
```bash
npm root
```
查看全局包的安装路径
```bash
npm root -g
```
## 配置 npm 镜像源
由于 npm 默认的下载地址在国外npmjs.com有时候会被墙导致无法下载或者下载很慢因此我们可以尝试切换成从其他的镜像源下载npm包
切换镜像源有下面这几种方式
- 方式1临时切换镜像源
- 方式2切换镜像源
- 方式3通过 NRM 切换镜像源最为推荐的方式
- 方式4cnpm
下面来分别讲一下
### 方式1临时切换镜像源
安装指定包的时候通过追加 `--registry`参数即可格式如下
```bash
# 格式
npm install [package] --registry [https://xxx]
# 举例:在下载安装 express 这个包的时候,临时指定镜像源为 https://registry.npm.taobao.org
npm install express --registry https://registry.npm.taobao.org
```
### 方式2切换镜像源
```bash
npm config set registry https://registry.npm.taobao.org
```
执行上述命令后以后下载所有 npm 包的时候都会改为使用淘宝的镜像源
### 方式3通过 NRM 切换镜像源推荐
**NRM**Node Registry Manager作用是**切换和管理npm包的镜像源**
- 项目地址<https://www.npmjs.com/package/nrm>
- GitHub地址 <https://github.com/Pana/nrm>
**安装 NRM**
```bash
npm install -g nrm
```
![](http://img.smyhvae.com/20180302_1208.png)
**NRM 的常用命令**
```bash
# 显示全部的镜像
nrm ls
# 使用淘宝的镜像
nrm use taobao
```
效果如下
![](http://img.smyhvae.com/20180302_1215.png)
推荐的国内加速镜像淘宝<https://npm.taobao.org/>
## 方式4安装cnpm
- 项目地址<https://npm.taobao.org/>
安装`cnpm`替换npmnpm 由于源服务器在国外下载包的速度较慢cnpm 会使用国内镜像
```bash
npm install -g cnpm --registry=https://registry.npm.taobao.org
```
![](http://img.smyhvae.com/20180302_2204.png)
以后我们就可以通过 cnpm 命令去安装一个包举例如下
```bash
# 安装 vue 这个包
cnpm install vue
```
这里的单词 `install` 可以简写成 `i`
## Node.js 的简单使用
我们可以输入`node`命令然后在里面写 js 的代码
或者也可以 通过 node 运行 指定的 js 文件比如编写好一个 js文件`01.js`然后在命令行输入
```bash
node 01.js
```
就可以执行这个 js 程序直接在命令行查看运行结果
## 我的公众号
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**id`qianguyihao`
扫一扫你将发现另一个全新的世界而这将是一场美丽的意外
![](http://img.smyhvae.com/20200101.png)