­

vue 開發常用工具及配置五:hash 與快取控制

  • 2020 年 1 月 14 日
  • 筆記

本文大約 1500 字。

目錄

  • hash
  • 三種 hash
  • 在 vue.config.js 中配置 hash
  • 源碼

hash

以前使用 JQuery 開發前端頁面的時候,頁面中引用的資源文件如js、css等,一般尾部加一個 t=[時間戳] 參數,用於防止修改不生效。現在工程化開發,使用 Webpack 編譯,打包的資源文件路徑里自動帶有一串隨機字元串,稱為 hash:

<link href=/static/css/chunk-vendors.d637be65.css rel=preload as=style>

「d637be65」即是hash。每次 build 都會生成不同的 hash,所以每次編譯部署,都不會有快取問題。

這個 hash 是如何生成的?它的生成機制是什麼?

三種 hash

Webpack 打包後的資源按大小分有三類,從小到大排列:

  • module,即模組,每個引入的文件就是一個module,常言模組化,是開發中的物理最小程式碼單位
  • chunk, N 個模組打包在一起形成的的一個文件(如果 chunk 有 split,則每個分開的文件都是一個獨立的 chunk)
  • bundle,一次工程編譯打包的最終產物,有可能就是 chunk,也有可能包含多個chunk的綜合體

這三類資源都可以生成 hash,粒度從低到高依次為:

  • hash,根據每次編譯的內容計算所得,不是針對每個具體文件的,每次編譯都會有一個 hash
  • chunkhash,入口級別的 hash,如果入口文件有改動,則從該入口打包引入的所有文件的hash都會變化,主要指同一個入口的js和css文件。
  • contenthash,文件級別的 hash,只有文件的內容變了hash才會變

在 vue 項目中,啟用的是哪一類 hash?

在 vue.config.js 中配置 hash

在vue.config.js配置文件中,與輸出文件名有關的主要配置有:

  outputDir: 'dist',    assetsDir: 'static',    filenameHashing:true,    pages: {      index: {        // page 的入口        entry: 'src/main.js',        // 模板來源        template: 'public/index.html',        // 在 dist/index.html 的輸出        filename: 'index.html',        // 當使用 title 選項時,        // template 中的 title 標籤需要是 <title><%= htmlWebpackPlugin.options.title %></title>        title: 'Index Page',        hash: true,        // 在這個頁面中包含的塊,默認情況下會包含        // 提取出來的通用 chunk 和 vendor chunk。        chunks: ['chunk-vendors', 'chunk-common', 'index']      }    },

這裡的 pages.*.chunks 有什麼含義?

這部分配置,其實會編譯到webpack中的html-webpack-plugin的配置里。所以vue.config.js中的pages.chunks也就等同於html-webpack-plugin中的chunks。

再看一下 html-webpack-plugin 的 chunks,有什麼含義。

chunks 選項的作用主要是針對多入口(entry)文件。當你有多個入口文件的時候,對應就會生成多個編譯後的 js 文件。那麼 chunks 選項就可以決定是否都使用這些生成的 js 文件。例如這個html-webpack-plugin配置:

entry: {      index: path.resolve(__dirname, './src/index.js'),      index1: path.resolve(__dirname, './src/index1.js'),      index2: path.resolve(__dirname, './src/index2.js')  }  ...  plugins: [      new HtmlWebpackPlugin({          ...          chunks: ['index','index2']      })  ]

注意,而如果沒有顯式指定 chunks 選項,默認會全部引用。

通過編譯發現,如果不修改圖片或源碼,生成的 hash 是不會變化的。如果修改了 vue 組件,部分文件的 hash,例如 css、js文件的,會變化,但不想乾的圖片不會變化。

所以,回到前面的問題,在 vue 項目中,啟用的是哪一類 hash?答案當是 contenthash。

源碼

https://git.code.tencent.com/shiqiaomarong/vue-go-rapiddev-example/tags/v20200101

參考鏈接

https://segmentfault.com/q/1010000016925412/a-1020000016946034

關於Vue-cli3.0 的配置pages.chunks的參數的意義

https://segmentfault.com/a/1190000007294861#articleHeader9

html-webpack-plugin用法全解

[專欄]基於 vue+go 如何快速進行業務迭代?