摘要:特性比較熱門的兩大特性,零配置和速度快號稱提速上限一般情況下,相比于低版本,場景下第三方依賴打包速度和場景下本地服務首次啟動速度都得到顯著提升零配置通過指定當前場景為開發模式還是生產模式,自動設置好當前場景的默認配置,用戶即可馬上使用,不需
webpack4特性
webpack4比較熱門的兩大特性,零配置和速度快(號稱提速上限98%)
一般情況下,webpack4相比于低版本,production場景下第三方依賴打包速度 和 development場景下本地服務首次啟動速度 都得到顯著提升
零配置
通過mode指定當前場景為開發模式還是生產模式,自動設置好當前場景的默認配置,用戶即可馬上使用,不需要多余的配置
打包速度快
打包速度之所以能得到顯著提升,多虧了Optimization這個新增的選項,下文會說到
1.入口(entry)
是應用程序,或者說一個頁面的起點入口,如果傳遞一個數組,那么數組的每一項都會執行
每個html頁面都有一個入口起點
單頁面應用(SPA):一個入口
多頁面應用(MPA :多個入口
entry: { home: "./home.js", about: "./about.js", contact: "./contact.js" }
如果entry的值是一個字符串,那么打包之后的chunk名即為默認的main
如果entry的值是一個對象,則每個key都會是chunk的名字,每個key對應的值都是入口起點
2.輸出(output)
output的值必須為一個對象,至少包含下面兩個屬性
filename: webpack打包之后輸出文件的路徑
path: 決定了每個輸出的bundle的名稱(即打包后的文件名字),這些bundle將寫入到output.path指定的目錄下
例如:
單入口
output: { path: "/dist", filename: "bundle.js" }
這個配置將會在根目錄的dist文件夾下輸出打包后的bundle.js,這是單頁面應用的配置
多入口
output: { path: "/dist", filename: "js/[name].js" }
即在dist目錄下的js文件夾中輸出一系列的bundle
一個比較難理解的配置:ouput.publicPath
配置html中引用的靜態資源的目錄,在多數情況下,此選項的值為"/"
publicPath并不會對webpack打包文件后存放的目錄有所影響,是對生成的html中應用的靜態資源,比如圖片,css和js文件的引用路徑做對應的補足
對于按需加載或者加載外部資源來說,這個選項的值尤為重要,如果設置錯誤,加載資源的時候會返回404
3.模塊加載器(loader)
loaders可以說是各種模塊的轉換器,可以用來預處理文件,解析和打包除javascript之外的任何靜態資源
loader要下載才能配置使用,比如:
npm install --save-dev css-loader
npm install --save-dev ts-loader
然后在webpack的配置文件中,聲明,css后綴的文件使用css-loader解析,ts后綴的文件使用ts-loader解析
module.exports = { module: { rules: [ { test: /.css$/, use: "css-loader" }, { test: /.ts$/, use: "ts-loader" } ] } };
更多loader的配置:webpack loaders
4.插件(plugins)
plugins用于自定義webpack的構建過程, 比如自定義打包之后的html模板,自定義js和樣式文件是否打包等等
plugins的值,是一個個new出來的插件實例
webpack4取消了四個常用的用于性能優化的pluginUglifyjsWebpackPlugin,CommonsChunkPlugin,ModuleConcatenationPlugin,NoEmitOnErrorsPlugin
轉而提供了一個名為optimization的配置項,用于替代以上四個插件(并不是說以上插件不能使用了,只是webpack4本身有替代的方案,可以不用插件)
html-webpack-plugin
通過new 該插件的實例,可以讓webpack幫我們編譯出一個html文件
需要注意的是,多頁面的配置下,有多少個頁面,就要new多少個實例,傳入到plugins中,后面有代碼示例。
html-webpack-inline-source-plugin
這個插件用于生產模式下,讓webpack在打包的時候,將js和css直接插入到html中,從而減少請求的消耗
要注意的是,并不是所有情況下都適合用,文件較大時,還是推薦通過標簽去引入資源(運行時文件一般比較小,下面會通過另一個插件將runtime的代碼直接插入html中)
更多插件及其配置:webpack plugins
5.模式(mode)
mode是webpack4新增的參數選項,它有三個值,development、production、none,
由于開發模式和生產模式所需要的webpack的配置稍微有單不同(但是大部分是相同的)
所以可以建立兩個webpack的配置文件,分別用于開發模式和生產模式,除此之外,指明當前處于哪個模式下,有利于webpack內部做優化
比如,有一些插件是在生產模式下才啟用的。
通過指定mode的值為development和production中的一個,來表示webpack處于何種模式下,默認值是production
mode為 development 時,注重提升代碼的構建速度和開發體驗
module.exports = { mode: "development", cache: true, devtools: "eval", plugins: [ new webpack.NamedModulesPlugin(), new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }) ] };
mode為 production 時,提供代碼優化,如壓縮、作用域提升等
module.exports = { mode: "production", plugins: [ new UglifyJsPlugin(/* ... */), new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }), new webpack.optimize.ModuleConcatenationPlugin(), new webpack.NoEmitOnErrorsPlugin() ] }
也可以通過命令行運行下面的命令來指定模式
webpack --mode=production
6.優化(optimization)
這個選項也是wepack4新增的,主要用來自定義一些優化打包的策略
minimizer
在production模式下,該配置會默認為我們壓縮混淆代碼,但配置項過于少導致無法滿足我們對于優化代碼的訴求,下面是一套比較靈活的優化配置
var UglifyJsPlugin = require("uglifyjs-webpack-plugin") var OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin") module.exports = { optimization: { minimizer: [ // 自定義js優化配置,將會覆蓋默認配置 new UglifyJsPlugin({ exclude: /.min.js$/, // 過濾掉以".min.js"結尾的文件,我們認為這個后綴本身就是已經壓縮好的代碼,沒必要進行二次壓縮 cache: true, parallel: true, // 開啟并行壓縮,充分利用cpu sourceMap: false, extractComments: false, // 移除注釋 uglifyOptions: { compress: { unused: true, warnings: false, drop_debugger: true }, output: { comments: false } } }), // 用于優化css文件 new OptimizeCssAssetsPlugin({ assetNameRegExp: /.css$/g, cssProcessorOptions: { safe: true, autoprefixer: { disable: true }, //這里注意下!!!!! mergeLonghand: false, discardComments: { removeAll: true // 移除注釋 } }, canPrint: true }) ] } }
UglifyJsPlugin是大家經常使用的插件,這里比較亮的地方是可以過濾本身已經壓縮的js,可以提升打包速度,并且避免二次混淆壓縮造成的未知bug
OptimizeCssAssetsPlugin用來優化css文件的輸出,優化策略包括:擯棄重復的樣式定義、砍掉樣式規則中多余的參數、移除不需要的瀏覽器前綴等
這里注意插件的參數autoprefixer: { disable: true },一定要指定為true。否則的話該插件會把我們用autoprefix加好的前綴都移除掉(因為該插件覺得多余)
runtimeChunk
分離出webpack編譯出來的運行時代碼,也就是我們之前成為manifest的代碼塊,方便我們做文件的之就好緩存
這個參數項(runtimeChunk)有多種類型的值,其中,single即將所有的chunk的運行時代碼打包到一個文件中,multiple即針對每個chunk的運行時代碼分別打包出一個runtime文件
我們可以配合上面說到的 InlineManifestWebpackPlugin插件,將運行時代碼直接插入html文件中,因為這段代碼非常少,這樣做可以避免一次請求的開銷
InlineManifestWebpackPlugin插件的順序一定要在HtmlWebpackPlugin之后,否則會導致編譯失敗
var HtmlWebpackPlugin = require("html-webpack-plugin") var InlineManifestWebpackPlugin = require("inline-manifest-webpack-plugin") module.exports = { optimization: { runtimeChunk: "single" // 等價于 // runtimeChunk: { // name: "runtime" // } }, plugins: [ new HtmlWebpackPlugin({ template: "../src/index.html", filename: "article.html", chunks: ["article", "vendors", "runtime"] }), new InlineManifestWebpackPlugin(), //放在htmlWebpackPlugin的后面才能生效 ] }
splitChunks
這是比較難理解的一個配置項
webpack4移除了CommonsChunkPlugin插件,取而代之的是splitChunks
比較優雅的分離打包配置如下
splitChunks: { cacheGroups: { vendors: { test: /[/]node_modules[/]/, name: "vendors", minSize: 30000, minChunks: 1, chunks: "initial", priority: 1 // 該配置項是設置處理的優先級,數值越大越優先處理 }, commons: { test: /[/]src[/]common[/]/, name: "commons", minSize: 30000, minChunks: 3, chunks: "initial", priority: -1, reuseExistingChunk: true // 這個配置允許我們使用已經存在的代碼塊 } } }
這段配置,首先是將node_modules中的模塊統一打包成vendors.js
它限制了分離文件的最小體積為30k(壓縮之前的),因為webpack認為,小于30k的代碼分離出來,還要額外小號一次請求去加載它,成本太高,這個值是通過大量的時間總結出來的
其次,還分離除了共享模塊,比如src目錄下有幾個全局公用的js文件如utils等,可以多帶帶抽出來打包成一個commons.js
由于這部分文件不經常改變,有利于持久緩存
完:demo地址
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108116.html
摘要:剛剛發布,官網自稱最大的特點就是零配置。本文就詳細介紹一下實戰那些事兒。自動刷新監聽本地源代碼的變化,自動重新構建刷新瀏覽器。自動發布更新完代碼后,自動構建出線上發布代碼并傳輸給發布系統。代碼塊,一個由多個模塊組合而成,用于代碼合并與分割。 webpack4.0剛剛發布,官網自稱4.0最大的特點就是零配置。本文就詳細介紹一下webpack4.0實戰那些事兒。 1 什么是WebPack ...
摘要:前言本文基于,主要涉及基本概念基本配置和實際項目打包優化。關于概念方面參考官網,常用配置來自于網絡資源,在文末有相關參考鏈接,實踐部分基于自己的項目進行優化配置。同一文件中,修改某個影響其他。 前言:本文基于weboack4.x,主要涉及webpack4 基本概念、基本配置和實際項目打包優化。關于概念方面參考官網,常用配置來自于網絡資源,在文末有相關參考鏈接,實踐部分基于自己的項目進行...
摘要:安裝配置加載器配置配置文件配置支持自定義的預設或插件只有配置了這兩個才能讓生效,單獨的安裝是無意義的。 showImg(https://segmentfault.com/img/bVbjGNY?w=2847&h=1931); 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 最新React全家桶實戰使用配置指南 這篇文檔 是呂小明老師結合以往的項目經驗 加上自己本身...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 3510·2021-11-25 09:43
閱讀 1266·2021-09-08 09:45
閱讀 2643·2021-09-07 09:59
閱讀 1502·2021-08-09 13:45
閱讀 3339·2019-08-30 15:54
閱讀 696·2019-08-29 18:35
閱讀 513·2019-08-29 17:18
閱讀 992·2019-08-29 14:10