欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何利用node實現(xiàn)靜態(tài)文件緩存詳解

 更新時間:2021年07月08日 15:21:41   作者:nameIsZoe27  
HTTP 緩存機制作為 Web 應用性能優(yōu)化的重要手段,對于從事 Web 開發(fā)的同學們來說,應該是知識體系的基礎環(huán)節(jié),也是想要成為前端架構的必備技能,這篇文章主要給大家介紹了關于如何利用node實現(xiàn)靜態(tài)文件緩存的相關資料,需要的朋友可以參考下

緩存

瀏覽器緩存(Brower Caching)是瀏覽器對之前請求過的文件進行緩存,以便下一次訪問時重復使用,節(jié)省帶寬,提高訪問速度,降低服務器壓力

緩存位置分類

memory cache:內存中的緩存,關閉瀏覽器則清空,一般存儲一些js庫

disk cache:硬盤中的緩存,關閉瀏覽器不會馬上清空,一般存儲大文件,比如 圖片資源,iconFont這類的圖標文件庫

兩者的區(qū)別:

  1. 讀取速度 :memory cache緩存的是當前解析過了的文件在瀏覽器tab進程里,下次運行使用時的可以快速讀??;

              disk cache直接將緩存寫入硬盤文件中,讀取緩存需要對該緩存存放的硬盤文件進行I/O(讀取)操作,然后重新解析緩存內容,速度比內存緩存慢

  2. 時效性:memory cache是存在tab的進程里,tab關閉,則清空;

            disk cache:被清空的時機我還不知道(希望有人可以補充)

  3. 優(yōu)先級:memory cache大于disk cache

  對于大文件來說,大概率是不存儲在memory中的,反之優(yōu)先,代碼角度目前好像也無法控制瀏覽器緩存位置

緩存設置header

cache-control

 1.   cache-control:max-age=10//10秒內重新發(fā)的請求都直接命中強緩存,無需向服務器發(fā)起請求,讀取瀏覽器緩存即可
 2.   Cache-Control:no-cache //禁止強制緩存,每次都向服務器發(fā)起請求,同時也會存在瀏覽器緩存中 (走協(xié)商緩存了基本)
 3.   Cache-Control:no-store //每次都請求服務器,且不緩存在瀏覽器中,等同于沒有緩存 
復制代碼

Expires:

兼容低版本瀏覽器,這個就是設置絕對時間,獲取的是服務器的當前時間和瀏覽器當前時間做比對(通常存在偏差,是http1.0的產物),和 cache-control同時存在時,cache-control優(yōu)先級更高

  • last-modified:協(xié)商緩存的時候用 和If-Modified-Since,成對出現(xiàn);If-Modified-Since請求頭的值對應上一次服務器的響應頭last-modified的值,擁有提供服務器比對請求資源修改時間,相等,則命中協(xié)商緩存返回304,瀏覽器讀取緩存即可
  • Etag:資源標識(也有說時指紋,通常是一個md5值),協(xié)商緩存時候用,比較文件是否修改;和If-None-Match 成對出現(xiàn)

Etag主要為了解決 Last-Modified 無法解決的一些問題。

1. 一些文件也許會周期性的更改,但是他的內容并不改變(僅僅改變的修改時間),這個時候我們并不希望客戶端認為這個文件被修改了,而重新GET;

2. 某些文件修改非常頻繁,比如在秒以下的時間內進行修改,(比方說1s內修改了N次),If-Modified-Since無法檢查到如此精細

3. 某些服務器不能精確的得到文件的最后修改時間;

4.Etag與Last-modify同時存在 Etag優(yōu)先級比較

實際項目:html不允許緩存,html里引用的js有唯一的版本號做依據,再次訪問的時候 訪問最新的html,引用的js或其他文件版本號未修改則直接用本地緩存

node實現(xiàn)靜態(tài)文件緩存

文件結構

public對應我們測試用的靜態(tài)資源

強緩存

思路

  • 創(chuàng)建服務
  • 首次請求 解析請求路徑, fs.createReadStream().pipe() 讀取文件
  • 設置響應頭Cache-Contro:max-age=10 強緩存的相對時間

代碼實現(xiàn)

const http = require("http");
const url = require("url");
const fs = require("fs");
const path = require("path");
// 接收文件路徑 返回該文件對應的文件類型格式
const mime = require("mime");//npm i mime 

const server = http.createServer((req, res) => {
  let { pathname, query } = url.parse(req.url, true);
  //__dirname 當前文件所在的文件夾所處的絕對路徑 和請求路徑拼接
  let filePath = path.join(__dirname, "public", pathname);
  console.log(req.url);//10s內反復刷新頁面,查看是否持續(xù)打印,命中強緩存則10s打印一次
  // 設置頭部 緩存信息,規(guī)定的緩存時間內,客戶端無需再向服務器發(fā)起請求
  res.setHeader("Cache-Control", "max-age=10"); // 設置緩存時常;請求的當前時間+max-age 的相對時間內,優(yōu)先級比Expires高
  res.setHeader("Expires", new Date(Date.now() + 10).toUTCString()); //兼容低版本瀏覽器,這個就是設置絕對時間,獲取的是服務器的當前時間
  // 獲取請求路徑 判斷是文件還是文件目錄
  fs.stat(filePath, function (err, statObj) {
    // url解析錯誤,則請求錯誤 沒有找到對應url資源 返回404
    if (err) {
      res.statusCode = 404;
      res.end("NOT FOUND");
    } else {
      // 如果是文件,用可讀流+管道 pipe 進行文件內容讀取,利用mime 獲取文件內容格式,并設置編碼規(guī)范為utf-8
      if (statObj.isFile()) {
        fs.createReadStream(filePath).pipe(res);
        res.setHeader(
          "Content-Type",
          mime.getType(filePath) + ";charset=utf-8"
        );
      } else {
        // 如果是文件目錄 找到 目錄下對應的index.html
        let htmlPath = path.join(filePath, "index.html");
        // fs.access判斷拼接的路徑是否可訪問
        fs.access(htmlPath, function (err) {
          if (err) {
            // 不可訪問 設置 狀態(tài)碼404
            res.statusCode = 404;
            res.end("NOT FOUND");
          } else {
            //可訪問,用可讀流加管道 pipe 進行文件內容讀取
            fs.createReadStream(htmlPath).pipe(res);
            res.setHeader("Content-Type", "text/html;charset=utf-8");
          }
        });
      }
    }
  });
  // 寫到這里 可以 nodemon cache.js  啟動服務 查看 http://localhost:3000/ 
});
server.listen(3000, () => {
  console.log("server start 3000");
});

效果展示

協(xié)商緩存

成功

思路

  • 創(chuàng)建服務
  • 首次請求 解析請求路徑, fs.createReadStream().pipe() 讀取文件
  • 設置響應頭Last-modified 返回瀏覽器
  • 再次請求,比較瀏覽器if-last-modified 和當前資源修改時間,相等則命中協(xié)商緩存,返回響應碼304,反之返回路徑對應的最新資源,和響應碼200

代碼實現(xiàn)

const http = require("http");
const url = require("url");
const fs = require("fs");
const path = require("path");
const mime = require("mime");


  let filePath = path.join(__dirname, "public", pathname);
  console.log(req.url);
  fs.stat(filePath, function (err, statObj) {
    if (err) {
      res.statusCode = 404;
      res.end("NOT FOUND");
    } else {
      if (statObj.isFile()) {
        // 判斷 瀏覽器請求的文件路徑 的change 時間 通過statObj.ctime
        const ctime = statObj.ctime.toUTCString();
        // 瀏覽器請求頭if-modified-since ===文件上次的修改時間 ,命中協(xié)商緩存,則返回 304 瀏覽器緩存中請求資源
        if (req.headers["if-modified-since"] === ctime) {
          res.statusCode = 304; //去瀏覽器緩存中找
          res.end(); //
        } else {
          //  if-modified-since !==文件上次的修改時間,響應頭Last-modified 設置 當前請求文件的 修改時間 做下次 瀏覽器請求的last-modify-since的對應值
          res.setHeader("Last-modified", ctime);
          fs.createReadStream(filePath).pipe(res);
          res.setHeader(
            "Content-Type",
            mime.getType(filePath) + ";charset=utf-8"
          );
        }
      } else {
        fs.access(htmlPath, function (err) {
          if (err) {
            // 不可訪問 設置 狀態(tài)碼404
            res.statusCode = 404;
            res.end("NOT FOUND");
          } else {
            fs.createReadStream(htmlPath).pipe(res);
            res.setHeader("Content-Type", "text/html;charset=utf-8");
          }
        });
      }
    }
  });
  // 寫到這里 可以 nodemon cache2.js       啟動服務 查看 http://localhost:3000/ 
});
server.listen(3000, () => {
  console.log("server start 3000");
});

效果展示

每次刷新頁面都會執(zhí)行  console.log(req.url); 請求了服務器但服務器返回304 命中協(xié)商緩存 瀏覽器直接讀取緩存資源即可

成功

總結

到此這篇關于如何利用node實現(xiàn)靜態(tài)文件緩存的文章就介紹到這了,更多相關node靜態(tài)文件緩存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • NodeJS實現(xiàn)單點登錄原理解析

    NodeJS實現(xiàn)單點登錄原理解析

    隨著公司業(yè)務的增多,必然會產生各個不同的系統(tǒng),如果每個系統(tǒng)都需要單獨登錄的話就會很不方便,所以這個時候單點登錄會很方便,今天通過本文給大家講解NodeJS實現(xiàn)單點登錄原理解析,感興趣的朋友一起看看吧
    2022-05-05
  • nodejs如何讀取文件二進制 前端響應blob或base64顯示圖片

    nodejs如何讀取文件二進制 前端響應blob或base64顯示圖片

    這篇文章主要介紹了nodejs如何讀取文件二進制 前端響應blob或base64顯示圖片方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • NVM切換不同版本node的實現(xiàn)步驟

    NVM切換不同版本node的實現(xiàn)步驟

    nvm是Node.js的版本管理器,可以讓我們輕松地在不同的Node.js版本之間進行切換,本文就來介紹一下NVM切換不同版本node的實現(xiàn)步驟,感興趣的可以了解一下
    2023-12-12
  • npm 更改默認全局路徑以及國內鏡像的方法

    npm 更改默認全局路徑以及國內鏡像的方法

    今天小編就為大家分享一篇npm 更改默認全局路徑以及國內鏡像的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 用C/C++來實現(xiàn) Node.js 的模塊(一)

    用C/C++來實現(xiàn) Node.js 的模塊(一)

    這篇文章的主要內容其實簡而言之就是——用C/C++來實現(xiàn) Node.js 的模塊,非常的不錯,有需要的朋友可以參考下
    2014-09-09
  • nodejs環(huán)境使用Typeorm連接查詢Oracle數據

    nodejs環(huán)境使用Typeorm連接查詢Oracle數據

    這篇文章主要介紹了nodejs環(huán)境使用Typeorm連接查詢Oracle數據,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • nodejs和php實現(xiàn)圖片訪問實時處理

    nodejs和php實現(xiàn)圖片訪問實時處理

    這篇文章主要為大家詳細介紹了nodejs和php分別實現(xiàn)圖片訪問實時處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • node中Express 動態(tài)設置端口的方法

    node中Express 動態(tài)設置端口的方法

    本篇文章主要介紹了node中Express 動態(tài)設置端口的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • node.js中的path.dirname方法使用說明

    node.js中的path.dirname方法使用說明

    這篇文章主要介紹了node.js中的path.dirname方法使用說明,本文介紹了path.dirname的方法說明、語法、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 詳解nodejs中的process進程

    詳解nodejs中的process進程

    這篇文章主要介紹了nodejs中的process進程,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2017-03-03

最新評論