文档章节

webpack的hash问题

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

本文是在windows系统下使用webpack,其他系统只有命令行工具使用方式有区别,您可放心食用。 1 什么是webpack webpack是一个前端开发打包工具。 它打包的是什么 通下面这张图片可以看出,web...

倪亚晨
2017/11/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
24分钟前
1
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
36分钟前
4
0
toString();

package com.atguigu.java1; import java.util.Date; /** * toString()的使用: * * 1.java.lang.Object类中toString()定义如下: * public String toString() { return getClass().getName......

architect刘源源
今天
1
3
不可不说的Java“锁”事

前言 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点...

Java干货分享
今天
1
0
Java GoEasy 实现服务端推送和Web端推送

项目中需要消息推送,又想降低开发成本。Java服务器端推送,Web端接收推送信息。 具体需求: 需求一:系统框架实现全局异常捕获并录入日志表,实现实时推送消息到客户端页面展示。 需求二:系...

Gibbons
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部