webpack 之(16) 优化配置 之 缓存

开发环境和生产环境皆可

缓存的原理是什么?

在之前我们讲到HMR(hot module replacement) 热模块替换很像,若有一个js改动,其他的js文件不需要重新加载,但是HMR只能在devServer环境下,但是生产环境不需要devServer

在第一次的时候,会将之前编译(打包)的文件进行缓存,那么第二次构建的时候,没有更改的js就会直接从缓存中读取

缓存后会出现什么情况?

当我们webpack打包后,使用babel缓存(cacheDirectory:true),那么服务器去读取时,属于第一次加载,那么浏览器已经进行了强缓存,且默认是一小时

此时我们修改了js(修改了输出值)内容,重新打包,但是内容并没有发生变化,因为

缓存有两种方式

第一种 babel缓存

     cacheDirectory:true

 第二种:文件资源缓存(建立在第一种之上的,只是添加了contenthash而已)

     hash: 每次webpack时会生成一个唯一的hash值

        问题:因为js和css同时使用的同一个hash值

                如果重新打包,会导致所有换缓存失效.(可能只是改动一个文件)

     chunkhash: 根据chunk生成的hash值,如果打包来源于同一个chunk,那么hash值就一样

        问题:js和css的hash值还是一样的

               因为css是在js中被引入的,所以同属于同一个chunk

               (解析原因:css.js,html这些依赖都会根据index入口文件形成一个文件,这一个文件被称为chunk块,

               所有根据入口文件引入的文件都会生成一个chunk,因为css是在index.js中被引入的,所以同属一个chunk)

     contenthash: 根据文件内容生成hash值.不同文件hash值一定不一样

{
  test:/.js$/,
  exclude:/node_modules/,
  loader:'babel-loader',
  options: {
    presets: [

    ],
    //开启babel缓存
   //第二次构建时,会读取之前的缓存
   cacheDirectory:true
  }
}

 使用hash和 chunkhash的地方

output: {
   //filename:'js/built.[hash:10].js',
   //filename:'js/built.[chunkhash:10].js',
filename:'js/built.[contenthash].js' path: resolve(__dirname,
'build') }, plugins:[ new MiniCssExtractPlugin({ //filename:'css/built.[hash:10].css' //filename:'css/built.[chunkhash:10].css'
filename:'css/built.[contenthash:10].css'
}) ]

实际案例操作讲解

第一步:写css文件

 第二步:写html文件

 第三步:写js文件

 第四步:添加一个server.js文件

第六步:访问 localhost:3000服务器   

原文地址:https://www.cnblogs.com/zmztya/p/14713908.html