一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

webpack系列學習

 流水1314 2022-08-12 發(fā)布于廣東

前言:筆者把學習的webpack知識從基礎到原理寫個系列,以便回顧。希望能幫助到更多正在學習webpack的小伙伴。

本篇文章講述下熱更新,文件指紋,壓縮知識。

webpack中的文件監(jiān)聽

  • 文件監(jiān)聽是在發(fā)現(xiàn)源碼發(fā)生變化時,自動重新構建新的輸出文件
  • webpack開啟監(jiān)聽模式,有兩種1.啟動webpack命令,帶上--watch參數(shù)。 缺點:需要每次手動刷新瀏覽器
  • "scripts": {     "build": "webpack",     "watch": "webpack --watch"},

    2.在配置webpack.config.js中配置watch:true。

  • 原理:輪訓判斷文件最后編輯時間是否變化
  • // webpack.config.jsmodule.exports = {    // 默認false,就是不開啟    watch: true,    // 只有開啟監(jiān)聽模式,watchOptions才有意義    watchOptions:{        // 默認為空,不監(jiān)聽的文件或者文件夾,支持正則匹配        ignored: /node_modules/,        // 監(jiān)聽到變化發(fā)生后會等300ms再去執(zhí)行,默認300ms        aggregateTimeout:300,        // 判斷文件是否發(fā)生變化是通過不停詢問系統(tǒng)指定文件有么有變化實現(xiàn),默認1000ms        poll:1000    }}

    webpack-dev-server熱更新

  • 1.安裝webpack-dev-server
  •  npm i webpack-dev-server -D

    2.在package.json中配置npm scripts

     "scripts": {      "dev": "webpack-dev-server --open" // --open是自動打開瀏覽器  },

    3.在webpack.config.js中配置webpack-dev-server的plugin

    const webpack = require('webpack');  module.exports = {      // 以上省略      plugins:[          new webpack.HotModuleReplacementPlugin()      ],      devServer:{          contentBase:'./dist',          hot: true      }  }

    4.運行:npm run dev。自動打開瀏覽器。

    5.修改代碼,保存,瀏覽器自動刷新。

    熱更新原理分析

    從右圖看,分兩步,一步是啟動階段,第二步是熱更新階段

  • 1.啟動階段 1 -> 2 -> A -> B 文件經webpack compile將js編譯打包bundle.js 利用Bundle server 可以直接提供在線訪問,就是localhost:8080/index.html
  • 2.熱更新階段 當修改文件后,也經過webpack complie將js編譯打包成bundle.js 利用HMR Server 將熱更新的文件輸出給HMR Runtime HMR Runtime 將bundle.js注入到瀏覽器,更新文件的變化。
  • 熱更新有最核心的是 HMR Server 和 HMR runtime。 HMR Server 是服務端,用來將變化的 js 模塊通過 websocket 的消息通知給瀏覽器端。 HMR Runtime是瀏覽器端,用于接受 HMR Server 傳遞的模塊數(shù)據,瀏覽器端可以看到 .hot-update.json 的文件過來。
  • HotModuleReplacementPlugin webpack 構建出來的 bundle.js 本身是不具備熱更新的能力的 HotModuleReplacementPlugin 的作用就是將 HMR runtime 注入到 bundle.js,使得bundle.js可以和HMR server建立websocket的通信連接
  • webpack-dev-server和hot-module-replacement-plugin之間的關系。 webpack-dev-server(WDS)的功能提供 bundle server的能力,就是生成的 bundle.js 文件可以通過 localhost://xxx 的方式去訪問,另外 WDS 也提供 livereload(瀏覽器的自動刷新)。 hot-module-replacement-plugin 的作用是提供 HMR 的 runtime,并且將 runtime 注入到 bundle.js 代碼里面去。一旦磁盤里面的文件修改,那么 HMR server 會將有修改的 js module 信息發(fā)送給 HMR runtime,然后 HMR runtime 去局部更新頁面的代碼。因此這種方式可以不用刷新瀏覽器。 簡單來說就是:hot-module-replacement-plugin 包給 webpack-dev-server 提供了熱更新的能力。
  • 另一種熱更新:webpack-dev-middleware 將webpack輸出的文件傳輸給服務器.
  • 文件指紋

  • Hash:和整個項目的構建相關,只要項目文件有修改,整個項目構建的hash值就會更改
  • Chunkhash:和webpack打包的chunk有關,不同的entry會生成不同的chunkhash值
  • Contenthash:根據文件內容來定義hash,文件內容不變,則contenthash不變
  • js的文件指紋設置

  • 設置output的filename.使用[chunkhash]
  • // webpack.config.js    module.exports = {        entry:{            app:'./src/app.js',            search:'./src/search.js',        },        output:{            path:__dirname+"/dist",            filename:'[name][chunkhash:8].js'        }    }


    css的文件指紋設置

  • 設置MiniCssExtractPlugin的filename,使用[contenthash]
  • MiniCssExtractPlugin將css從js中抽離出來單獨的css文件
  • 安裝MiniCssExtractPlugin
  • MiniCssExtractPlugin.loader 和style-loader是互斥的,不能共用
  • npm i mini-css-extract-plugin -D
     // webpack.config.js    module.exports = {        entry:{            app:'./src/app.js',           search:'./src/search.js',                    },        output:{            path:__dirname+"/dist",            filename:'[name][chunkhash:8].js'        },        module:{            rules:[{                test:/\.css/,                use:[                    MiniCssExtractPlugin.loader,                    'css-loader'                ]            }]        },        plugins:[            new MiniCssExtractPlugin({                filename:'[name][contenthash:8].css'            })        ]    }

    設置圖片的文件指紋設置

  • 設置file-loader的name,使用[hash]
  • // webpack.config.js    module.exports = {        entry:{            app:'./src/app.js',           search:'./src/search.js',                    },        output:{            path:__dirname+"/dist",            filename:'[name][chunkhash:8].js'        },        module:{            rules:[{                test:/\.(png|jpg|jpeg|gif)$/,                use:[{                    loader:'file-loader',                    options:{                        name:'img/[name][hash:8].[ext]'                    }                }]            }]        }    }

    bundle,chunk和module

  • bundle:打包最終生成的文件
  • chunk:每個chunk是由多個module組成,可以通過代碼分割成多個chunk。
  • module:webpack中的模塊(js、css、圖片等等)
  • 代碼壓縮

    js壓縮

  • webpack內置了uglifyjs-webpack-plugin
  • css文件壓縮

  • 使用optimize-css-assets-webpack-plugin,同時使用cssnano(預處理器)
  • 安裝
  • npm i optimize-css-assets-webpack-plugin cssnano -D

    使用

        // webpack.config.js    module.exports = {        entry:{            app:'./src/app.js',           search:'./src/search.js',                    },        output:{            path:__dirname+"/dist",            filename:'[name][chunkhash:8].js'        },       plugins:[           new OptimizeCSSAssetsPlugin({               assetNameRegExp:/\.css$/g,               cssProcessor:require('cssnano')           })       ]    }

    html文件壓縮

  • 設置html-webpack-plugin,設置壓縮參數(shù)
  • 安裝
  • npm i html-webpack-plugin -D

    使用

    // webpack.config.js    module.exports = {        entry:{            app:'./src/app.js',           search:'./src/search.js',                    },        output:{            path:__dirname+"/dist",            filename:'[name][chunkhash:8].js'        },       plugins:[           new HtmlWebpackPlugin({               template:path.join(__dirname,'src/search.html'),               filename:'search.html',               chunks:['search'],               inject:true,               minify:{                   html5:true,                   collapseWhitespace:true,                   preserveLineBreaks:false,                   minifyCss:true,                   minifyJs:true,                   removeComments:false               }           })       ]    }

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      国产内射在线激情一区| 成人国产一区二区三区精品麻豆| 人妻久久一区二区三区精品99| 色婷婷亚洲精品综合网| 男人和女人草逼免费视频| 国产一级内片内射免费看| 少妇福利视频一区二区| 国产毛片不卡视频在线| 亚洲欧美日韩网友自拍| 又色又爽又黄的三级视频| 国产爆操白丝美女在线观看| 91人妻人澡人人爽人人精品| 99少妇偷拍视频在线| 国产在线不卡中文字幕| 太香蕉久久国产精品视频| 成人午夜激情免费在线| 国产免费自拍黄片免费看| 欧美中文日韩一区久久| 九九热在线视频精品免费| 亚洲国产性生活高潮免费视频| 日韩一本不卡在线观看| 亚洲综合精品天堂夜夜| 中文字幕日韩精品人一妻| 老司机精品视频在线免费| 精品国模一区二区三区欧美| 国产美女精品人人做人人爽 | 亚洲男人的天堂久久a| 视频一区日韩经典中文字幕| 国内精品偷拍视频久久| 老司机精品视频在线免费看| 亚洲黄色在线观看免费高清| 亚洲日本加勒比在线播放| 午夜精品黄片在线播放| 日韩精品视频一二三区| 国产精欧美一区二区三区久久| 欧美大胆美女a级视频| 国产一区二区熟女精品免费| 国产成人综合亚洲欧美日韩| 欧美精品久久99九九| 99久久精品免费看国产高清| 少妇肥臀一区二区三区|