《深入浅出 node.js 笔记》 - part3( 二 )


缓存
缓存需要浏览器与服务器共同协作来完成 。

《深入浅出 node.js 笔记》 - part3

文章插图
通常来说 POST、、PUT 这类待行为性的请求操作一般不做任何缓存,大多数缓存只应用在 GET 请求中 。
本地没有文件时,浏览器必然会请求服务器端的内容,并将这部分内容放置在本地的某个缓存目录中 。
在第二次请求时,它将对本地文件进行检查,如果不能确定这份本地文件是否可以直接使用,它将会发起一次条件请求 。
所谓条件请求,就是在普通的 GET 请求报文中附带 If--Since 字段,如下所示:
If--Since: Sun, 03 Feb 2019 06:01;12 GMT
它将询问服务器端是否有更新的版本,本地文件的最后修改时间 。如果服务器端没有新的版本,只需响应一个 304 状态码,客户端就使用本地版本;如果服务器有新版本,就将新的内容发送给客户端,客户端放弃本地版本,代码如下:
const handler = function (req, res) {fs.stat(filename, function (err, stat) {const lastModified = stat.mtime.toUTCString()if (lastModified === req.headers['if-modified-since']) {res.writeHead(304, 'Not Modified')res.end()} else {fs.readFile(filename, function (err, file) {const lastModified = stat.mtime.toUTCString()res.setHeader('Last-Modified', lastModified)res.writeHead(200, 'OK')res.end(file)})}})}
浏览器在收到 Etag:"83-"这样的响应后,下次请求会将其放置在请求头中:If-None-Match:“83-”
设置或 Cache- 头,浏览器就可以不向服务器发送 HTTP 请求而知晓是否直接使用本地版本 。
其区别之前已经提到过, 可能会出现服务器端和浏览器端时间不同步的情况,Cache- 设置 max-age 是倒计时的方式 。
如果同时设置了 max-age 和 ,max-age 会覆盖。
const handler = function (req, res) {fs.readFile(filename, function (err, file) {const expires = new Date()expires.setTime(expires.getTime() + 10 * 365 * 24 * 60 * 60 * 1000)res.setHeader('Expires', expires.toUTCString())res.writeHead(200, 'OK')res.end(file)})}const handelr = function (req, res) {fs.readFile(filename, function (err, file) {res.setHeader('Cache-Control', 'max-age=' + 10 * 365 * 24 * 60 * 60 * 1000)res.writeHead(200, 'OK')res.end(file)})}
如果使用 Nginx 做静态资源服务器就看看 Nginx 的缓存配置即可
清除缓存
缓存一旦设定,当服务端意外更新内容时,却无法通知客户端更新 。一般有两种更新机制:
一般采用的是第二种方式(所以打包生成的文件都要哈希啊)
MVC
MVC 模型的主要思想是将业务逻辑按职责分离
它的工作模式如下:
《深入浅出 node.js 笔记》 - part3

文章插图
REST 全称是State ,它是一个关于 URL 的设计规范 。
比如我们过去对用户的增删改查或许是这么设计 URL 的:
POST /user/add?username=jacksontianGET /user/remove?username=jacksontianPOST /user/update/username=jacksontianGET /user/get?username=jacksontian
在设计中,它应该是这样的:
POST /user/username=jacksontianDELETE /user/username=jacksontianPUT /user/username=jacksontianGET /user/username=jacksontian
过去设计资源的格式与后缀有很大的关联,比如:
GET /user/jacksontian.jsonGET /user/jacksontian.xml
在设计中,资源的具体格式由请求报头中的字段和服务器端的支持情况来决定 。