因爲最近開發的我的博客(Vue + node)在使用過程當中,發現網絡加載有點慢,因此打算對它進行一次優化。本次優化的目標以下:html
index.html
設置成 no-cache
,這樣每次請求的時候都會比對一下 index.html
文件有沒變化,若是沒變化就使用緩存,有變化就使用新的 index.html
文件。maxAge: 1000 * 60 * 60 * 24 * 365
。以上三點結合,就能實現文件的精確緩存。前端
換句話說,在一年內,若是個人我的博客沒有進行任何更新,那同一臺電腦在這段時間內訪問網站不會發起任何請求;若是有某個文件更新了,只會請求新的文件,舊的文件依舊從緩存讀取。node
小知識:webpack
經過配置 output 的 filename 屬性能夠實現這個需求。filename 屬性的值選項中有一個 [contenthash],它將根據文件內容建立出惟一 hash。當文件內容發生變化時,[contenthash] 也會發生變化。git
output: { filename: '[name].[contenthash].js', chunkFilename: '[name].[contenthash].js', path: path.resolve(__dirname, '../dist'), },
因爲引入的第三方庫通常都比較穩定,不會常常改變。因此將它們單獨提取出來,做爲長期緩存是一個更好的選擇。
這裏須要使用 webpack4 的 splitChunk 插件 cacheGroups 選項。github
optimization: { runtimeChunk: { name: 'manifest' // 將 webpack 的 runtime 代碼拆分爲一個單獨的 chunk。 }, splitChunks: { cacheGroups: { vendor: { name: 'chunk-vendors', test: /[\\/]node_modules[\\/]/, priority: -10, chunks: 'initial' }, common: { name: 'chunk-common', minChunks: 2, priority: -20, chunks: 'initial', reuseExistingChunk: true } }, } },
除了提取第三方庫外,結合 Vue 使用 import 動態引入組件還能實現按需加載。web
app.use((req, res, next) => { // 將 index.html 設爲 no-cache if(req.url == '/') { res.setHeader('Cache-control', 'no-cache') } next() }) app.use(express.static('dist', { etag: false, maxAge: 1000 * 60 * 60 * 24 * 365, // 緩存一年 })) // 將dist設爲根目錄
詳細的代碼能夠看一下個人我的博客項目。express