国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

72 # http 緩存策略

這篇具有很好參考價值的文章主要介紹了72 # http 緩存策略。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前面實(shí)現(xiàn)了一個 http-server,并且實(shí)現(xiàn)了 gzip 的壓縮,下面通過前面幾節(jié)學(xué)習(xí)的緩存知識來添加一下緩存。

大致就是先強(qiáng)制緩存 10s,然后采用協(xié)商(對比)緩存,大致圖如下
72 # http 緩存策略,Node / Node 框架,前端工程架構(gòu),http,緩存,網(wǎng)絡(luò)協(xié)議,強(qiáng)制緩存,協(xié)商緩存
在之前的 http-server 的代碼基礎(chǔ)上添加 cache 方法的實(shí)現(xiàn),實(shí)現(xiàn)如下:

// 核心模塊
const http = require("http");
const path = require("path");
const url = require("url");
const fs = require("fs").promises;
const crypto = require("crypto");
const { createReadStream, createWriteStream, readFileSync } = require("fs");

// 第三方模塊
const ejs = require("ejs"); // 服務(wù)端讀取目錄進(jìn)行渲染
const mime = require("mime");
const chalk = require("chalk");
const debug = require("debug")("server");
// 根據(jù)環(huán)境變量來進(jìn)行打印 process.env.EDBUG
debug("hello kaimo-http-server");

// 同步讀取模板
const template = readFileSync(path.resolve(__dirname, "template.ejs"), "utf-8");

class Server {
    constructor(config) {
        this.host = config.host;
        this.port = config.port;
        this.directory = config.directory;
        this.template = template;
    }
    async handleRequest(req, res) {
        let { pathname } = url.parse(req.url);
        // 需要對 pathname 進(jìn)行一次轉(zhuǎn)義,避免訪問中文名稱文件找不到問題
        console.log(pathname);
        pathname = decodeURIComponent(pathname);
        console.log(pathname);
        // 通過路徑找到這個文件返回
        let filePath = path.join(this.directory, pathname);
        console.log(filePath);
        try {
            // 用流讀取文件
            let statObj = await fs.stat(filePath);
            // 判斷是否是文件
            if (statObj.isFile()) {
                this.sendFile(req, res, filePath, statObj);
            } else {
                // 文件夾的話就先嘗試找找 index.html
                let concatFilePath = path.join(filePath, "index.html");
                try {
                    let statObj = await fs.stat(concatFilePath);
                    this.sendFile(req, res, concatFilePath, statObj);
                } catch (e) {
                    // index.html 不存在就列出目錄
                    this.showList(req, res, filePath, statObj, pathname);
                }
            }
        } catch (e) {
            this.sendError(req, res, e);
        }
    }
    // 列出目錄
    async showList(req, res, filePath, statObj, pathname) {
        // 讀取目錄包含的信息
        let dirs = await fs.readdir(filePath);
        console.log(dirs, "-------------dirs----------");
        try {
            let parseObj = dirs.map((item) => ({
                dir: item,
                href: path.join(pathname, item) // url路徑拼接自己的路徑
            }));
            // 渲染列表:這里采用異步渲染
            let templateStr = await ejs.render(this.template, { dirs: parseObj }, { async: true });
            console.log(templateStr, "-------------templateStr----------");
            res.setHeader("Content-type", "text/html;charset=utf-8");
            res.end(templateStr);
        } catch (e) {
            this.sendError(req, res, e);
        }
    }
    gzip(req, res, filePath, statObj) {
        if (req.headers["accept-encoding"] && req.headers["accept-encoding"].includes("gzip")) {
            // 給響應(yīng)頭添加內(nèi)容編碼類型頭,告訴瀏覽器內(nèi)容是什么編碼類型
            res.setHeader("Content-Encoding", "gzip");
            // 創(chuàng)建轉(zhuǎn)化流
            return require("zlib").createGzip();
        } else {
            return false;
        }
    }
    // 設(shè)置緩存
    async cache(req, res, filePath, statObj) {
        // 先設(shè)置強(qiáng)制緩存
        res.setHeader("Expires", new Date(Date.now() + 10 * 1000).toGMTString());
        res.setHeader("Cache-Control", "max-age=10");
        // 再設(shè)置協(xié)商緩存
        let fileContent = await fs.readFile(filePath);
        // 指紋
        let ifNoneMatch = req.headers["if-none-match"];
        let etag = crypto.createHash("md5").update(fileContent).digest("base64");
        // 修改時間
        let ifModifiedSince = req.headers["if-modified-since"];
        let ctime = statObj.ctime.toGMTString();
        res.setHeader("Last-Modified", ctime);
        res.setHeader("ETag", etag);
        // 文件變動了就不緩存,讀取新文件
        if (ifNoneMatch !== etag) {
            return false;
        }
        if (ifModifiedSince !== ctime) {
            return false;
        }
        return true;
    }
    // 讀取文件返回
    async sendFile(req, res, filePath, statObj) {
        // 緩存
        let cache = await this.cache(req, res, filePath, statObj);
        // 有緩存直接讓用戶查找緩存即可
        if (cache) {
            res.statusCode = 304;
            return res.end();
        }
        // 設(shè)置類型
        res.setHeader("Content-type", mime.getType(filePath) + ";charset=utf-8");
        // 讀取文件進(jìn)行響應(yīng)
        // 先判斷瀏覽器是否支持 gzip 壓縮
        let gzip = this.gzip(req, res, filePath, statObj);
        if (gzip) {
            createReadStream(filePath).pipe(gzip).pipe(res);
        } else {
            createReadStream(filePath).pipe(res);
        }
    }
    // 專門處理錯誤信息
    sendError(req, res, e) {
        debug(e);
        res.statusCode = 404;
        res.end("Not Found");
    }
    start() {
        const server = http.createServer(this.handleRequest.bind(this));
        server.listen(this.port, this.host, () => {
            console.log(chalk.yellow(`Starting up kaimo-http-server, serving ./${this.directory.split("\\").pop()}\r\n`));
            console.log(chalk.green(`       http://${this.host}:${this.port}`));
        });
    }
}

module.exports = Server;

我們啟動服務(wù)

kaimo-http-server

72 # http 緩存策略,Node / Node 框架,前端工程架構(gòu),http,緩存,網(wǎng)絡(luò)協(xié)議,強(qiáng)制緩存,協(xié)商緩存

訪問: http://localhost:3000/public/index.html

72 # http 緩存策略,Node / Node 框架,前端工程架構(gòu),http,緩存,網(wǎng)絡(luò)協(xié)議,強(qiáng)制緩存,協(xié)商緩存
我們立即刷新,可以看到強(qiáng)制緩存

72 # http 緩存策略,Node / Node 框架,前端工程架構(gòu),http,緩存,網(wǎng)絡(luò)協(xié)議,強(qiáng)制緩存,協(xié)商緩存

過了 10s 再次刷新我們可以看到變成協(xié)商緩存

72 # http 緩存策略,Node / Node 框架,前端工程架構(gòu),http,緩存,網(wǎng)絡(luò)協(xié)議,強(qiáng)制緩存,協(xié)商緩存文章來源地址http://www.zghlxwxcb.cn/news/detail-679451.html

到了這里,關(guān)于72 # http 緩存策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端面試中經(jīng)常提到的LRU緩存策略詳解

    前端面試中經(jīng)常提到的LRU緩存策略詳解

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:2022年度博客之星前端領(lǐng)域TOP 2,前端領(lǐng)域優(yōu)質(zhì)作者、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進(jìn)步,一起加油呀! ??優(yōu)質(zhì)專欄:vue3從入門到精通、TypeScript從入門到實(shí)踐 ?? 資料領(lǐng)?。呵岸诉M(jìn)階資料以及文中源

    2024年01月16日
    瀏覽(29)
  • 前端刪除node-module和清除緩存的方法

    1、刪除node modules文件 前端刪除node_modules包,可以右鍵一鍵刪除,但是當(dāng)包體積很大時,就會要刪除很久,這時候可以使用命令行進(jìn)行刪除,可以跟快刪掉node_modules包。命令如下: 2、清除npm緩存

    2024年02月11日
    瀏覽(26)
  • 前端性能優(yōu)化之HTTP緩存

    前端性能優(yōu)化之HTTP緩存

    前端緩存可分為兩大類: HTTP 緩存 和 瀏覽器緩存 。 我們今天重點(diǎn)是 HTTP 緩存 ,下面這張圖是前端緩存的一個大致知識點(diǎn): 首先解決困擾繞人們的老大難問題: 一、什么是HTTP緩存? HTTP 緩存會存儲與請求關(guān)聯(lián)的響應(yīng),并將存儲的響應(yīng)復(fù)用于后續(xù)請求。(MDN) 通俗的講,HTTP

    2024年02月06日
    瀏覽(24)
  • 前端瀏覽器緩存知識梳理,前端工程師面試題目和答案

    前端瀏覽器緩存知識梳理,前端工程師面試題目和答案

    所謂瀏覽器緩存其實(shí)就是指在本地使用的計(jì)算機(jī)中開辟一個內(nèi)存區(qū),同時也開辟一個硬盤區(qū)作為數(shù)據(jù)傳輸?shù)木彌_區(qū),然后用這個緩沖區(qū)來暫時保存用戶以前訪問過的信息。 瀏覽器緩存過程: ?強(qiáng)緩存,協(xié)商緩存。 瀏覽器緩存位置一般分為四類: ?Service Worker–Memory Cache–Di

    2024年04月15日
    瀏覽(28)
  • 前端node.js入門-前端工程化與模塊化

    前端node.js入門-前端工程化與模塊化

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 Node.js 入門? 什么是 Node.js? 什么是前端工程化? ? Node.js 為何能執(zhí)行 JS?? fs 模塊 - 讀寫文件? path 模塊 - 路徑處理 URL 中的端口號? 常見的服務(wù)程序? Node.js 模塊化 什

    2024年02月14日
    瀏覽(158)
  • 前端通信(渲染、http、緩存、異步、跨域)自用筆記

    目錄 請求頭,響應(yīng)頭 HTTP版本、狀態(tài)碼 web安全 瀏覽器緩存、本地存儲 SSR/CSR:HTML拼接?網(wǎng)頁源碼?SEO/交互性 解析url ?合成 URL-本地緩存/攔截請求-DNS解析IP/端口號(域名緩存) TCP-HTTP請求 同步?js標(biāo)簽跨域、url 異步 web-worker(創(chuàng)建分線程):適用于計(jì)算密集型任務(wù) index.js為加

    2024年02月11日
    瀏覽(14)
  • 前端通信(解析url、異步、跨域、http、緩存、安全)自用筆記

    目錄 請求頭,響應(yīng)頭 HTTP版本、狀態(tài)碼 web安全 瀏覽器緩存、本地存儲 SSR/CSR:HTML拼接?網(wǎng)頁源碼?SEO/交互性 解析url ?合成 URL-本地緩存/攔截請求-DNS解析IP/端口號(域名緩存) TCP-HTTP請求 同步?js標(biāo)簽跨域、url 異步 web-worker(創(chuàng)建分線程):適用于計(jì)算密集型任務(wù) index.js為加

    2024年01月24日
    瀏覽(21)
  • 計(jì)算機(jī)網(wǎng)絡(luò)—HTTP基本概念、HTTPS、HTTP狀態(tài)碼、HTTP緩存、HTTP請求

    計(jì)算機(jī)網(wǎng)絡(luò)—HTTP基本概念、HTTPS、HTTP狀態(tài)碼、HTTP緩存、HTTP請求

    參考小林coding HTTP是超文本傳輸協(xié)議。所謂的超文本,就是超越了普通文本的文本,最關(guān)鍵的是有超鏈接,能從一個超文本跳轉(zhuǎn)到另一個超文本。 HTML是最常見的超文本,本身是純文字文件,但是內(nèi)部使用很多標(biāo)簽定義圖片、視頻等鏈接,再經(jīng)過瀏覽器的解釋,呈現(xiàn)出來的就是

    2024年02月07日
    瀏覽(40)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)安全,HTTP協(xié)議,同源策略,cors,jsonp

    【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)安全,HTTP協(xié)議,同源策略,cors,jsonp

    ?? Author: 老九 ?? 個人博客:老九的CSDN博客 ?? 個人名言:不可控之事 樂觀面對 ?? 系列專欄: 會生成一個公鑰一個私鑰,我現(xiàn)在有一個東西,我用公鑰給它加密,公鑰可以公開給任何一個人,只有對應(yīng)的私鑰可以解密;如果用對稱加密最重要的壞處就是需要在網(wǎng)絡(luò)上

    2024年02月07日
    瀏覽(46)
  • 【熱門前端【vue框架】】——vue框架和node.js的下載和安裝保姆式教程

    【熱門前端【vue框架】】——vue框架和node.js的下載和安裝保姆式教程

    ?????個人主頁 :@程序員-曼億點(diǎn) ????? hallo 歡迎 點(diǎn)贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 曼億點(diǎn) 原創(chuàng) ????? 收錄于專欄 :vue框架開發(fā) ??Vue.js 是一款流行的 JavaScript 前端框架,它以其簡單、靈活和高效的特性,成為了構(gòu)建現(xiàn)代化 Web 應(yīng)用程序的首選工具

    2024年04月27日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包