服务器
简介
之前我们写好页面,如果想要给自己看,直接用浏览器打开。如果想要给其他人看,就发给他。但是如果要看的人数太多,此时不可能一个一个的发送。于是架设一台服务器。这个服务器是放在公网上的。只要你把你的网站放在该服务器上,别人就可以通过公网访问到。(得有域名:域名指的是你的服务器在公网上的一个id)
简而言之,服务器就是用于提供服务的机器。
我们根据服务器的用途不一样,划分出不同的服务器来。我们学习的是最简单的web服务器。
NodeJS服务器
之前,有一个server.js文件,就是一个简单的NodeJS服务器。
HTTP协议
简介
浏览器:chrome浏览器、ie浏览器、火狐浏览器、edge浏览器等。这都是一些应用程序。他们的级别跟qq是一样的。
服务器:NodeJS服务器。
浏览器发出请求,请求服务器上的内容。它们两者之间所使用的规范,叫做HTTP协议。
HTTP协议规定了浏览器如何发出请求。
HTTP协议规定了服务器如何相应。
HTTP请求
如果说HTTP协议是类。则HTTP请求是实例化对象。
HTTP请求包含4个部分: 请求首行、请求头、请求空行、请求正文
请求首行:
请求头:
请求空行: 只是一个空白行 什么内容也没有 作用是分割请求头和请求正文。
请求正文: 暂无
URL
简介
URL指的是统一资源定位符。
我们在想要访问某一个网站时。第一步就是输入网址。该网址就是一个URL。
Demo:
https://login.taobao.com/member/login.jhtml?from=taobaoindex&f=top&style=&sub=true&redirect_url=https%3A%2F%2Fi.taobao.com%2Fmy_taobao.htm%3Fspm%3Da21bo.2017.1997525045.1.5af911d9IjloSn#aaa
如上,就是一个URL字符串。
一个完整的URL包含: 协议、域名、端口、pathName、search(? + query)、hash
当浏览器输入URL按回车之后
当浏览器的地址栏输入URL字符串并回车之后,浏览器会解析该URL。根据HTTP协议的规则决定往哪个域名下发送。
1 解析成URL对象
2 获取域名并解析成IP地址
1 从浏览器缓存中获取对应的ip地址
2 从系统缓存中获取对应的ip地址
3 从路由缓存中获取对应的ip地址
4 从DNS中获取对应的ip地址
3 根据得到的ip地址发出HTTP请求
4 请求到达服务器
5 服务器应答 链接建立
6 服务器处理 根据链接返回数据
7 断开链接
8 浏览器得到数据开始渲染
9 在渲染过程中遇见link标签、script标签、img标签、video标签、audio标签等外链标签会重新发出HTTP请求。
缓存
当浏览器发送的请求与之前请求的数据URL一致时,会使用之前请求的数据,而不是重新发送请求。
NodeJS的特点
简介
官网:http://nodejs.org
简介:
NodeJS不是一门语言,它是一个开发平台。所使用的语言是JS。
NodeJS是一个基于ChromeV8引擎的、轻量、高效的、非阻塞I/O的开发环境。
NPM是世界上最大的开源库生态系统。
hello world
有一个JS文件:
console.log("hello world");
单线程
执行任务时,只有一个线程去执行。这叫做“单线程”。
非阻塞I/O
I: input 输入O:output输出
内存的运行速度很快、磁盘的转速相对来说很慢。如果从内存中提取数据到磁盘中,这叫从内存中"输出"。反过来叫"输入"。速度以磁盘的转速为准。此时线程是否等待?如果等待,叫阻塞I/O。不等待,叫非阻塞I/O。
事件驱动
因为非阻塞I/O。导致线程离开,I/O完成之后的后续任务将无法继续执行。当I/O完成时,会触发一个事件。该事件驱动程序继续执行。这叫“事件驱动”。
小案例
有一个诊所(NodeJS服务器)
诊所里有一个医生(单线程)
诊所里有N个护士(内存)
诊所里有仓库(磁盘)
有一天来了10个患者(前端发送的HTTP请求)。
医生处理第一个患者的症状。(处理流程包含: 诊断、开处方、抓药、医嘱)
诊断,医生可以立即完成,开处方医生也可以立即完成。抓药是由护士去仓库中拿药品。是一个I/O操作。
医生不会等待护士抓药回来,无法立即开医嘱。而是立即处理下一个患者的症状。继续如上过程。
此时,某一个护士回来了。护士不会把医生拉过去开医嘱。而是护士去排队。医生继续处理,处理到护士之后才执行该护士的对应患者的医嘱。
NodeJS中的模块化
NodeJS中的模块分两种,一种是核心模块。一种是第三方模块。
核心模块
所谓的核心模块指的就是NodeJS自带的模块。
第三方模块
所谓的第三方模块指的就是非核心模块。
定义模块
在NodeJS中,一个JS文件就是一个模块。
暴露功能
module.exports = sum; // 暴露的就是sum函数
module.exports.sum = sum; // 暴露的是一个对象 对象的sum属性才是sum函数
exports.sum = sum; // 同上
引入模块
引入第三方模块:
在NodeJS中,同样使用require函数引入内容
Demo:
// 引入b.js中的暴露功能
var b = require("./b.js");
引入时可以不写.js后缀,因为NodeJS对js文件敏感。
引入核心模块
核心模块只有一个名字,而且在内存中,所以,路径没法写。只需要写名字即可。
require("http");
node_modules文件夹
该文件夹是专门用于存放node的第三方模块的。
它的特点:
1 只要将一个第三方模块放入该文件夹,就可以像引入核心模块那样引入了
2 它可以在多层级目录中存在 当寻找文件时会先查找同级中的node_modules 如果有就进去找 如果没有就到上一级中查找是否有node_modules 依次往上
NodeJS服务器
HTTP模块
该模块用于创建HTTP服务器
引入:
var http = require("http");
调用API:
var server = http.createServer(handler);
handler: 当有请求发送到本服务器时,调用的响应函数。
监听端口号:
server.listen(3000);
request
createServer方法中的handler是一个函数,该函数有两个形参。
req与res。
Req表示前端请求对象,所有的前端数据都在该对象身上。
重要属性:
req.url URL字符串
req.method Method方法字符串(大写)
response
Res表示后端响应对象,如何响应数据由该对象的方法执行。
重要属性和方法:
res.setHeader 用于设置响应头
res.end 用于结束请求并返回数据的 只可以接收字符串和buffer
res.statusCode 用于设置响应状态码
最后
作者每周都会发布不错的文章,供大家学习,欢迎大家关注。
微信搜索【前端每日技巧】关注公众号,写作不易,希望能点赞👍️加收藏❤️和转发。