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 如何快速进行业务迭代?