html前后端缓存,前后端分离系列-缓存篇

本文介绍了如何通过调整Koa服务器配置,将静态文件如HTML和CSS设置为长期缓存,同时利用Webpack的哈希策略确保更新后的资源被正确加载。作者详细讲解了如何区分URL和静态文件,并讨论了HTML缓存问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.我们需要在静态文件返回给浏览器的时候header中的缓存变长,这样就可以在本地秒加载,省去了带宽和加载时间

修改server.js

const path = require('path');

const Koa = require('koa');

const send = require('koa-send');

const Router = require('koa-router');

const app = new Koa();

const router = new Router();

// 匹配了所有url

router.get(['/', '/**'], async (ctx) => {

const url = ctx.path;

await send(ctx, './index.html', {

root: path.join(__dirname, 'dist'),

maxAge: 365 * 24 * 60 * 60 * 1000

});

})

app.use(router.routes()).use(router.allowedMethods())

app.listen(3000);

这样,我们将文件的缓存时间改为十年,当然也可以改为永久,看心情

2.但是这样,如果更新了js,用户就没办法看到新的网页,永远在读缓存

我们改一下webpack,

webpack从0开始搭建react的ts开发环境

webpack.prod.ts

import path from "path";

import webpack from "webpack";

import {BundleAnalyzerPlugin} from "webpack-bundle-analyzer";

import merge from "webpack-merge";

import common from "./webpack.common";

const config: webpack.Configuration = merge(common, {

mode: "production",

devtool: "source-map",

output: {

filename: "app.[hash].js",

path: path.resolve(__dirname, "..", "dist"),

},

plugins: [

new BundleAnalyzerPlugin(),

],

});

export default config;

这样我们在运行

npm run build

的时候,生成的js会带有hash后缀,当我们没有更新代码的时候,hash不变,一旦更新代码,生成的hash也会跟着变化,这样就可以保证未更新时候的极致用户体验

css部分

webpack.common.ts

...

plugins: [

new HtmlWebpackPlugin({

title: "test",

template: path.resolve(__dirname,'template.html'),

}),

new MiniCssExtractPlugin({

filename: "app.[hash].css",

}),

],

...

3.但是还有一个问题,我们将html也缓存了,没办法获取新的html,就没办法拿到新的文件的hash

改一下server.js

const path = require('path');

const Koa = require('koa');

const send = require('koa-send');

const Router = require('koa-router');

const app = new Koa();

const router = new Router();

router.get(['/', '/**'], async (ctx) => {

const url = ctx.path;

// 当访问静态文件的时候 十年缓存 用.来区分是url还是静态文件,别的方法也是可以的

if (url.includes('.')) {

await send(ctx, ctx.path, {

root: path.join(__dirname, 'dist'),

maxAge: 365 * 24 * 60 * 60 * 1000

});

}else{

await send(ctx, './index.html', {

root: path.join(__dirname, 'dist'),

maxAge: 0

});

}

})

app.use(router.routes()).use(router.allowedMethods())

app.listen(3000);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值