admin 管理员组

文章数量: 887021

# 服务器基础

## 第一个服务器

术语:

- ip: 计算机在网络中的地址 其中本机地址为 127.0.0.1

- 一般情况可以使用 localhost 代表 127.0.0.1,若不成功则可以修改 `C:\Windows\System32\drivers\etc\hosts` 来定义 localhost

- 端口号: 一个应用程序与互联网连接通信的出入口

- 协议: 例如 http https 都是协议名,规定网络通信如何进行

- http 协议默认端口: 80

- https 协议默认端口: 443

## 服务器获取参数

术语:

- url: 统一资源定位符, 其实就是一个网络资源在网络中的地址路径

- uri: 统一资源定位标识, 任意资源在系统中的一个唯一标识符,并不局限于网络中。例如: 身份证号就是每个人的uri

## 简单路由

## 路由器 Router

路由(route)

什么是路由?

- 动词: 通过不同请求地址的路径,分发请求

- 分发请求时,请求可能被重新分配到另一个服务器,或者被分配到自己服务器的另一个应用程序,又或者分配给接收请求的服务器某个处理函数等

- 名词: 包含访问地址url,访问参数等一系列和路径相关的信息

以下代码中的 ```if else``` 代码块就是个简单的路由器

```javascript

server.on('request', (req, resp) => {

resp.setHeader('Content-Type', 'text/html;charset=utf-8')

let url = req.url

// 这段if else代码块,可以看作是个简单的路由器

if (url === '/') {

resp.end('感谢您的访问')

} else if (url === '/text') { // 读取一段文本

resp.setHeader('Content-Type', 'text/plain;charset=utf-8')

fs.readFile('./a.txt', (_, data) => {

resp.end(data)

})

} else if (url === '/3.png') { // 读取一个图片

resp.setHeader('Content-Type', 'image/jpeg')

fs.readFile('./3.png', (_, data) => {

resp.end(data)

})

} else {

resp.end('404 资源没找到')

}

})

```

## 请求文件

## 静态资源服务器

- 静态资源: 不会产生变化的文件

## 重定向

重定向就是当用户访问一个地址时,服务器返回另一个地址,然后浏览器重新访问该地址,这个过程称为重定向

例如:

- 服务器有个地址 `/img/1.jpg`

- 用户访问该地址 `/img/1.jpg`

- 服务器重新返回一个地址 `/image/1.jpg`

- 客户端重新访问地址 `/image/1.jpg`

- 以上过程称为重定向

重定向的一个特点就是地址栏会发生变化

#### 基于路由创建简单的静态资源服务器

静态资源服务器就是一个只提供资源下载的服务器,常见的产品有nginx,apache等。之所以叫做“静态”是因为资源是静态的,不受服务器逻辑产生变化。有静态肯定就有动态,之后讲模板引擎的时候会进行说明。

也有使用node.js搭建的静态资源服务器。

主要方法:

- 指定静态资源文件夹

- 将路由地址匹配到文件目录

## 服务器C/S模型

- C代表Client,是客户端的意思

- S代表Server 服务端的意思

- 该模型规范定义了一次完整请求的全过程

具体模型请参考`` `cs模型.png` ``图片

### 什么是服务器和客户端?

- 服务器:提供服务(后端)

- 客户端:面向用户的程序(前端)

> 前端看得见,后端看不见

## 前后端分离和服务端渲染

- 前后端分离:前端和后端分别是两个项目开发,前端所有动态数据需要通过请求服务器才能获取。

- 服务端渲染:由服务器动态生成html,直接返回前端进行显示。

如何选择?

服务端渲染利于SEO(Search Engine Optimization),也就是搜索引擎优化。大型商业网站为了提高搜索排名,利于搜索,都会使用服务端渲染。而前后端分离则多用于混合开发,内嵌页面,后台管理页面等。

还有一种选择方法:通常服务端渲染的页面多用于展示内容,而不是和用户交互;前后端分离的页面多用于和用户交互。

本次课程选择使用服务端渲染,服务器开发是重点。

## 什么是node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。

> 太学术了听不懂?

## 什么是浏览器引擎

浏览器引擎是用于解析翻译和渲染页面的工具,主要用于解释翻译html css js

浏览器引擎分为两个:

- 渲染引擎:用于解释翻译和运行 html + css (通常指的浏览器引擎就是指的渲染引擎)

- js 引擎:浏览器用于编译运行 js 的工具

#### 类比

软件 | 平台

---|---

电脑游戏 | 电脑

手机游戏 | 手机

主机游戏 | 游戏主机

js代码 | node.js

js代码 | 浏览器

#### node.js特点

```

Node.js 应用程序运行于单个主线程中,具有线程安全性。Node.js 在其标准库中提供了一组异步的 I/O 原生功能(用以防止 JavaScript 代码被阻塞),并且 Node.js 中的库通常是使用非阻塞的范式编写的(从而使阻塞行为成为例外而不是规范)。

```

英文原文地址:https://nodejs/en/about/

- 单线程(JavaScript execution in Node.js is single threaded)

- 非阻塞(NI/O)的范式编写,同步行为是不规范的,官方解释:https://nodejs/zh-cn/docs/guides/blocking-vs-non-blocking/

对于 js 单线程问题,请参考 《js的单线程.md》

#### 进程和线程的理解

从 cpu 的单核和多核理解进程和线程

理解进程和线程,要理解以下几个问题

1. 单核cpu同时能运行几个应用程序?

2. 单核cpu如何做到“同时”运行两个及其以上的应用程序的?

3. 假设运行了一个《网易云音乐》,同一个软件如何“同时”播放音乐和下载音乐

4. 多核cpu同时能运行几个应用程序?

5. 多核cpu如何做到同时运行两个及其以上的应用程序的?

![](img/7.png)

#### node.js中的CommonJs和EcmaScript

CommonJs和EcmaScript都是语法和规范

- CommonJs 规定node.js模块化的语法规范,讲模块化时,再具体解释

- EcmaScript (简称ES)规定了js浏览器中的语法,也是node.js的语法

> 开发者常说的ES5,ES6就是js的语法版本,通常新版本会支持新语法特性。如:ES6中支持 ```let``` 关键字,还支持 ```lamda``` 表达式(俗称:箭头函数,箭头方法等)

> 好消息:node.js 8 已经原生支持ES6标准了

#### 为什么要学?

主要有以下作用:

- 做服务器

- 服务器应用,要在node.js上运行,很基础很重要,所以要好好听课

- 做脚本工具

- 例如:一件迁移文件,一键发布代码等

#### 安装node.js

- node.js中文网:http://nodejs/

- 验证是否安装成功:

```bat

# 查看node.js版本

node -v

# 结果

v13.7.0

```

#### Hello World!

```javascript

console.log('Hello World!')

```

控制台输入命令:

```cmd

node <js文件名>

```

#### Node.js和浏览器区别

除了浏览器,node.js也能运行js,但区别在哪?<br>

node.js没有BOM和DOM<br>

简单理解下BOM和DOM

- BOM (browser object model) 浏览器的对象模型

- node.js不能通过js控制浏览器(因为node.js不是浏览器)

- DOM (document object model) 文档的对象模型

- node.js不能直接渲染页面(因为不是浏览器,没有html文档)

- 浏览器不认识node.js内置模块的代码

#### 学会查询文档(重点)

学语文时,你查字典;学程序时,你查文档。文档就是辅助我们学习和开发的“字典”<br>

中文文档地址:http://nodejs/api/<br>

任何一门互联网技术,都有自己的技术文档供开发者查阅,阅读文档是项重要能力。曾有面试官问过我:“如何快速学会一个从未接触过的船新技术?”

- 最快方式:寻找demo(现阶段,老师课堂上的代码,对于同学们就是很好的demo)

- 稳定方式:寻找官方文档,有两种学习方法:

- 用什么,查什么(快速上手,完成工作,推荐,老师会介绍这种方法)

- 系统学习,通读文档(当开发人员有充足经验和时间的时候,可以这么做)

## 核心模块

模块的概念,当讲到引入第三方模块的时候,再进行深入学习。<br>

简单理解模块的概念:一个封装好的软件包,开箱即用。

#### fs(file system)文件系统模块(重点)

node.js中的文件系统,是一个工具,用于在操纵系统上对文件和目录进行操作,基本操作如:创建文件夹,删除文件,读取文件,写入文件等。

```javascript

let fs = require('fs')

fs.readFile('./a.txt', (err, data)=>{

if(err) {

console.error(err)

} else {

console.log(data)

let str = data.toString()

console.log(str)

}

})

```

#### http协议通信模块(重点)

```javascript

let http = require('http')

let server = http.createServer()

```

#### os(operating system)操作系统模块

```javascript

let os = require('os')

// 获取当前几期的CPU信息的

console.log(os.cpus())

```

#### path 路径模块

```javascript

let path = require('path')

//获取一个路径中的扩展名部分 extname 扩展名

console.log(path.extname('./data/hello.txt'))

```

#### event 事件模块

该模块可以创建收发事件的实体

#### assert 断言

定义一个笃定的言论就叫断言,多用于做函数的参数判断,例如:加函数function add(x, y) 需要两个参数,那么就可以使用断言判断调用函数时参数的合法性

#### cluster 集群模块

集群模块可以让js代码在多个cpu核心上运行多个副本

## 常见全局变量

```javascript

__dirname // 执行代码所在的目录

__filename // 执行代码的文件名称

console // 控制台对象

exports // 导出方法

require // 导入方法

global === globalThis // 全局对象,类似浏览器上的 window 对象

```

# ejs模板引擎简介

## 什么是模板引擎

### 模板

要了解模板引擎需要先了解模板

模板就是一个用于生成html文件的有独特语法的文件

例如:我们也可以自己写个模板名为 template.rgb 的模板

```html

<html>

<head></head>

<body>

<!-- 此处就是模板语法 -->

<div>${user.name}</div>

</body>

</html>

```

然后我们自己写个函数将他转换成html,如:

```js

// 定义个渲染函数,用于将模板转换成html

function render(templateName, params) {

// 转化过程写在这里

}

// 调用渲染函数,将模板和对应的数据传入函数

// 函数将返回html内容

let html = render('template.rgb', {user: {name: '法外狂徒张三'}})

```

上述模板最终会被翻译成html,如下:

```html

<html>

<head></head>

<body>

<!-- 此处就是转换出来的内容 -->

<div>法外狂徒张三</div>

</body>

</html>

```

### 模板引擎是什么

模板引擎就是用于解释翻译模板的工具,例如上述例子中的render函数,应该由模板引擎提供

## 模板引擎ejs

ejs 是个被许多框架使用的模板引擎

github: https://github/mde/ejs

### 安装与使用

```batch

# 安装

npm install ejs

```

使用流程

- 创建模板文件.ejs

- 引入ejs模块

- 编译模板

- 返回html内容

代码参考《ejs-project》的 `ejs-demo.js`

### express 中集成 pug

代码参考《ejs-project》的 `ejs-express.js`

本文标签: Node JS