文档章节

webpack的hash问题

sunshinewyf
 sunshinewyf
发布于 2017/04/26 18:26
字数 1022
阅读 43
收藏 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

© 著作权归作者所有

共有 人打赏支持
sunshinewyf
粉丝 15
博文 97
码字总数 64205
作品 0
武汉
程序员
使用 Webpack 打包单页应用的正确姿势

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

ElemeFe
2017/12/26
0
0
Webpack实现持久缓存

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

dev双皮奶
01/20
0
0
基于webpack4[.3+]构建可预测的持久化缓存方案

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

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

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

sunshinewyf
2016/07/20
20
0
妈妈再也不用担心我不会webpack了

前言 webpack前端工程中扮演的角色越来越重要,它也是前端工程化很重要的一环。本文将和大家一起按照项目流程学习使用wbepack,妈妈再也不用担心我不会使用webpack,哪里不会看哪里。这是一个...

尼古拉斯李三
2017/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
32分钟前
0
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
5
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部