前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue 开发常用工具及配置五:hash 与缓存控制

vue 开发常用工具及配置五:hash 与缓存控制

作者头像
LIYI
发布2020-01-14 18:09:17
4K0
发布2020-01-14 18:09:17
举报
文章被收录于专栏:艺述论专栏艺述论专栏

本文大约 1500 字。

目录

  • hash
  • 三种 hash
  • 在 vue.config.js 中配置 hash
  • 源码

hash

以前使用 JQuery 开发前端页面的时候,页面中引用的资源文件如js、css等,一般尾部加一个 t=[时间戳] 参数,用于防止修改不生效。现在工程化开发,使用 Webpack 编译,打包的资源文件路径里自动带有一串随机字符串,称为 hash:

代码语言:javascript
复制
<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配置文件中,与输出文件名有关的主要配置有:

代码语言:javascript
复制
  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配置:

代码语言:javascript
复制
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 如何快速进行业务迭代?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 艺述论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档