文档章节

webpack的hash问题

sunshinewyf
 sunshinewyf
发布于 2017/04/26 18:26
字数 1022
阅读 70
收藏 0

webpack-demo

webpack中的hash问题

简单的项目目录如下图所示:

template

webpack中的配置文件如下的时候:

  module.exports = {
      entry: {
          'example1': './example1',
          'example2': './example2'
      },
      output: {
          filename: '[name]-[hash:8].js'
      }
  };

第一次执行webpack命令的时候,会出现下面的目录:

template2

但是当改变example1.js和example2.js中的任何一个文件的时候,然后再执行webpack,就会看到下面的目录:

template3

可以看到目录中又新添了两个文件,并且两个文件名的hash值是一样的。这里又一个弊端,就是没有改变的那个文件,也会生成一个新的hash值的文件名。这是因为hash字段是根据每次编译 compilation的内容计算得到,也就是整个文件的hash值,这样的编译方式明显不太好,没有改变的文件也会随着其他文件的改变而改变 解决上面的问题有如下几种方式:

使用chunkhash

配置文件如下所示:

module.exports = {
    entry: {
        'example1': './example1',
        'example2': './example2'
    },
    output: {
        filename: '[name]-[chunkhash:8].js'
    }
};

执行webpack之后,文件目录如下所示:

template4

改变example1.js之后,然后再执行webpack,目录结构如下所示:

template5

这样就解决了上面的问题。但是当加入css文件之后,文件目录如下:

template5

并且在a.js中引入a.css,如下所示:

require('./a.css')

webpack的配置文件如下所示:

module.exports = {
    entry: {
        'a': './a',
        'b': './b'
    },
    output: {
        filename: '[name]-[chunkhash:8].js'
    },
    module: {
        loaders:[
            {
                test: /\.css$/, // Only .css files
                use: ["style-loader", "css-loader"] // Run both loaders
            }
        ]
    }
};

执行webpack之后,目录结构变成如下:

template5

改变a.css之后再执行webpack

发现文件目录变成如下:

template5

从目录可以看出,文件打包没有打包出css文件,而且只要修改a.css,那么a.js也会发生改变,所以chunkhash在含有css依赖的时候就会有问题

contenthash

webpack配置修改如下:

const extractTextPlugin = require('extract-text-webpack-plugin');
const webpack = require('webpack');

module.exports = {
    entry: {
        'a': './a',
        'b': './b'
    },

    output:{
        filename:'[name]-[chunkhash].js'
    },
    module: {
        loaders: [{
            test: /\.css$/,
            loader: extractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
        }],
    },
    plugins: [
        // 这里的 contenthash 是 ExtractTextPlugin 根据抽取输出的文件内容计算得到
        new extractTextPlugin('[name].[contenthash:4].css'),
    ],
}

执行webpack后的文件目录:

template5

然后改变a.css 文件之后,再执行webpack,可以看到文件目录如下:

template5

看到目录下只是生成了改变的新的css文件,达到目的.

使用webpackMd5Hash插件

webpack的配置如下:

const webpack = require('webpack');
const extractTextPlugin = require('extract-text-webpack-plugin');
const WebpackMd5Hash = require('webpack-md5-hash')

module.exports = {
    entry: {
        'a': './a',
        'b': './b'
    },

    output:{
        filename:'[name]-[chunkhash].js'
    },
    module: {
        loaders: [{
            test: /\.css$/,
            loader: extractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
        }],
    },
    plugins: [
        new extractTextPlugin('[name].[contenthash:4].css'),
        new WebpackMd5Hash()
    ],
}

文件目录如下图所示:

template5

修改a.css之后,文件目录变成如下所示:

template5

可以看出,当a.css发生改变的时候,依赖它的其他文件并没有重新生成新的hash值,所以使用webpackMd5Hash也可以解决问题 webpackMd5Hash通过模块路径来排序chunk的所有依赖模块,并将这些排序后的模块源代码拼接,最后用MD5拼接后内容的chunkhash, 但是webpackMd5Hash有一些issue,有一些坑,具体可以参见这里还有这里

图片的hash问题

在文件中难免会用到图片,比如在文件目录中,a.css文件代码如下:

a{
    font-size:14px;
    background:url('./1.png') no-repeat;
}

a.js中的文件代码如下:

require('./1.png');
require('./a.css')
require('./b.js')
var a = 'this is a';

webpack配置如下:

const webpack = require('webpack');
const extractTextPlugin = require('extract-text-webpack-plugin');
const WebpackMd5Hash = require('webpack-md5-hash')

module.exports = {
    entry: {
        'a': './a',
        'b': './b'
    },

    output:{
        filename:'[name]-[chunkhash].js'
    },
    module: {
        loaders: [
            {
            test: /\.css$/,
            loader: extractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' })
            },
            {
                // 图片加载器,雷同file-loader,更适合图片,可以将较小的图片转成base64,减少http请求
                // 如下配置,将小于8192byte的图片转成base64码
                test: /\.(png|jpg|gif)$/,
                loader: 'url-loader?limit=1000&name=../images/[name].[ext]?[hash]',
            }
        ],
    },
    plugins: [
        new extractTextPlugin('[name].[contenthash:4].css'),
        new WebpackMd5Hash()
    ],
}

执行webpack之后,目录结构如下图所示:

template5

可以看出图片也有相对应的编译文件,当图片的大小小于1000时,就不会创建相应的imags目录,只有大于1000时才会生成。当该目录的cssjs发生改变的时候,也不会重新出现新的image

© 著作权归作者所有

共有 人打赏支持
上一篇: PWA初探
下一篇: webpack 2 打包实战
sunshinewyf
粉丝 16
博文 97
码字总数 64205
作品 0
武汉
程序员
私信 提问
webpack增量打包多页应用

一,webpack打包存在的问题 webpack的打包顺序: 1,找到入口文件 2,根据入口文件,找出具有依赖关系的文件js/css 3,最后,把css/js全部打包成一个js包 好的,打包完成,打包了整个世界,那...

大灰狼的小绵羊哥哥
2018/11/22
0
0
使用 Webpack 打包单页应用的正确姿势

前言:在现代前端工程中,模块化已经成了前端项目组织文件的标配,网站上线前都会把需要的相关模块预先打包、处理一番。然而打包的方式多种多样,如何才能最优雅的分离业务代码和依赖库、如何...

ElemeFe
2017/12/26
0
0
基于webpack4[.3+]构建可预测的持久化缓存方案

基于webpack4[.3+]构建可预测的持久化缓存方案 web缓存的好处不用多说,自从webpack一桶江湖后,如何做Predictable long term caching with Webpack让配置工程师们头疼不已。 webpack4.3前,...

楞球不将就
2018/09/11
0
0
webpack初试

接触webpack其实已经很久了,但是真正去研究它还是第一次,所以记录一下自己的学习体验: webpack的主要功能是:Webpack 是一个前端资源加载/打包工具,只需要相对简单的配置就可以提供前端工...

sunshinewyf
2016/07/20
20
0
Webpack实现持久缓存

持久缓存 使用webpack构建工程的时候,我们往常会把功能不同的代码打包到不同的包里(如lib,vendor,业务代码)。 而持久缓存的目的就是每一次更新线上代码的时候,尽可能使内容未做更改的模块的...

dev双皮奶
2018/01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

uml类图

平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一、类的属性的表示方式 在UML类图中,...

asdf08442a
6分钟前
0
0
Linux下执行脚本报错提示invalid option 3: set: -

1、在环境下执行sh报错invalid option 3: set: - 2、于是换成chmod 777 install.sh改执行权限,并且默认使用#!/bin/bash bash: ./install.sh: /bin/bash^M: bad interpreter: No such file ......

noob_chr
7分钟前
0
0
phpstrom2018激活与汉化

phpstrom2018激活与汉化 方法一. 直接用浏览器打开 http://idea.lanyus.com/ (推荐) 点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串,...

万建宁
8分钟前
0
0
Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs

Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs NetHunter是一个基于Kali Linux为Nexus设备构建的Android渗透测试平台,其中包括一些特殊和独特的功能。NetHunter支持无线802.11注...

大学霸
17分钟前
1
0
端口可用性探测

在服务器上打开了一个端口,我们需要测试是否开启成功是否可用,可以在本机使用 traceroute (linux)工具 traceroute 是几乎所有 Linux 发行版本预装的网络测试工具,用于跟踪 Internet 协议(...

applepaihs
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部