webpack 性能优化

HtmlWebpackPlugin:

该插件将为你生成一个 HTML5 文件, 其中包括使用 script 标签的 body 中的所有 webpack 包。在打包上线的时候需要对html也进行压缩,所以要进行如下配置

    new HtmlWebpackPlugin({  // Also generate a test.html
      filename: 'test.html',
      template: 'src/assets/test.html',
      minify :{
      collapseWhitespace: true,//移除空格
      removeComments: true,//移除注释
      removeRedundantAttributes: true,//删除多余的属性
      removeScriptTypeAttributes: true,/删除script的类型属性,在h5下面script的type默认值
        removeStyleLinkTypeAttributes: true, //删除style的类型属性, type="text/css"
         useShortDoctype: true//使用短的文档类型,将文档转化成html5,默认false
      }
    })

 devServer:

  开发 的时候为了缩短编译的时间通常,我们会开启热替换,配置如下

  devServer: {
    contentBase: path.join(__dirname, "dist"),
    compress: true,
    port: 9000,
    host: "0.0.0.0",
    //自动打开浏览器
    open: false,
    //HMR模块热替换
    hot: true
  },
 plugins: [
   new webpack.HotModuleReplacementPlugin(),//开启热替换需要的插件
]

这里要注意一点,热替换css样式是基于style-loader实现的,所以开发环境下为了快速编译,处理css文件用style-loader,而生产环境是提升性能,所以用

mini-css-extract-plugin(将CSS提取为独立的文件,对每个包含css的js文件都会创建一个CSS文件,支持按需加载css和sourceMap)插件来代替style-loader

html:因为只有一个文件,没有模块之说,所以不做处理(修改入口文件,将html文件引入)

  entry: [
    path.resolve(__dirname, "./src/js/index.js"),
    path.resolve(__dirname, "./src/index.html")
  ]

js:

if (module.hot) { 
    module.hot.accept('./xx', () => {  // 当 xx.js 更新,自动执行此函数
        //把xx.js文件中的需要执行的函数再次执行
      fn() //xx.js里的方法
    })

 在每次加载网页,如果每次都请求服务器,可能会导致页面加载过慢,也会造成服务器资源的紧张,所以都会给网站加上缓存,所以webpack中对缓存的处理也是必不可少的

1.给js加上缓存

让你每次修改某个单独文件时,只编译修改的js文件,其他没有修改的则不变

      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            //开启缓存
            cacheDirectory: true
          }
        }
      },

2.资源文件缓存,webpack需要给你打包资源文件加上hash名,类似于版本号,用于强缓存期间,使修改过的文件可以生效.而hash又分三种:

1. hash

如果都使用hash的话,因为这是工程级别的,即每次修改任何一个文件,所有文件名的hash至都将改变。所以一旦修改了任何一个文件,整个项目的文件缓存都将失效

2. chunkhash

chunkhash根据不同的入口文件(Entry)进行依赖文件解析、构建对应的chunk,生成对应的哈希值。在生产环境里把一些公共库和程序入口文件区分开,单独打包构建,接着我们采用chunkhash的方式生成哈希值,那么只要我们不改动公共库的代码,就可以保证其哈希值不会受影响.

缺点:因为我们是将样式作为模块import到JavaScript文件中的,所以它们的chunkhash是一致的(css与js文件的hash值相同),只要对应css或则js改变,与其关联的文件hash值也会改变,但其内容并没有改变呢,所以没有达到缓存意义。

  3. contenthash

 contenthash是针对文件内容级别的,只有你自己模块的内容变了,那么hash值才改变

 配置:

  output: {
    filename: "js/[name][contenthash].js",
    path: path.resolve(__dirname, "./dist"),
    publicPath: "/" // /代表url跟路径  打包时改为‘./’
  }
 plugins: [
    new MiniCssExtractPlugin({
      filename: "css/[name][contenthash].css"
    })
  ] 

 注:在开发环境中hotModuleReplacementPlugin()会影响contenthash,所以在生产环境下使用contenthash,且确认没有hotModuleReplacementPlugin()

 

posted @ 2020-09-28 11:33  吴小样  阅读(153)  评论(0编辑  收藏  举报