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总结 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729002874h1305603.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论