>[success] # 文件指纹 1. 在 `loader` 图片和字体章节中使用**文件指纹**,不仅在图片重命名时候可以使用,在出口文件命名的时候也可以使用**文件指纹** ~~~ output: { path: path.resolve(__dirname,'dist'), filename: '[name][chunkhash:8].js' }, ~~~ 2. **文件指纹**的应用场景是在项目打包时候,为了实现增量发布,我们一般都会对静态资源加上`md5`的文件后缀,保证每次发布的文件都没有缓存,同时对于未修改文件,不会受发布的影响,最大程度**利用缓存**。 3. 对于一些哈希值含义讲解 * `hash`:整个项目的构建相关,当有文件修改,整个项目构建的hash值就会更新。 * `chunkhash`:和webpack打包的chunk相关,不同的entry会生成不同chunkhash,一般用于js的打包。 * `contenthash`:根据文件内容来定义hash,文件内容不变,contenthash不变。例如 css的打包,由于 修改js或html文件,但是没有修改引入的css样式时,文件不需要生成新的哈希值,所以可适用于css的打包。 因此命名规则一般 ~~~ // 项目级别,有任一地方改动 则哈希值都会发生变化 // filename: '[name]-[hash].bundle.css' // 同一路打包的文件 hash值都是相同的 控制更精确 // filename: '[name]-[chunkhash].bundle.css' // 根据输出文件的内容生成的hash值 解决缓存问题的 -- '最好方式' // 可以在哈希末尾配置哈希值的长度 // filename: '[name]-[contenthash:8].bundle.css' ~~~ ![](https://img.kancloud.cn/1e/4b/1e4b890193f941366da4d7d723779d0a_220x97.png) >[danger] ##### 更多 * 使用了md5指纹之后发现每次打包还是会发生变化? 这是由于webpack的处理机制导致的,webpack每次打包会把每个模块的配置信息 如文件名、文件顺序、文件md5等信息作为配置打入js中,以便于其进行模块管理,而这部内容,每次打包都有可能发生变化,导致整个js文件名每次都会发生变化。 webpack提供了一个 manifest 的机制来剥出这个配置文件。我们需要使用CommonsChunkPlugin 来将其剥离,同时使用 chunk-manifest-webpack-plugin 读取其内容导出另外一个文件,防止其内容变化导致整个js文件指纹发生变化