• 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()

     

  • 相关阅读:
    SmartBusinessDevFramework架构设计-1:结构简介
    C# 注销掉事件,解决多播委托链表的问题
    #import 无法打开源文件msado.tlh
    【MFC】OnInitDialog
    m_pRecordset->Open
    加L“”
    error C2065: “m_Pic”: 未声明的标识符
    存储过程不返回记录集导致ADO程序出错
    关于BSTR数据类型
    定义的函数在main中调用时提示找不到标识符
  • 原文地址:https://www.cnblogs.com/wmydb/p/13743888.html
Copyright © 2020-2023  润新知