Webpack基本用法學習總結

Webpack

  • 基本使用
  • 核心概念
  • 處理樣式資源
    • 步驟:
  • 處理圖片資源
    • 修改圖片輸出文件目錄
  • 自動清空上次打包的內容
  • Eslint
  • Babel
  • 處理HTML資源
  • 搭建開發服務器
  • 生產模式
    • 提取css文件為單獨文件
      • 問題:
    • Css壓縮
    • HTML壓縮
  • 小結1
  • 高級
    • SourceMap
      • 開發模式
      • 生產模式
    • HMR
    • OneOf
    • Include/Exclude
    • Cache
    • Thead
    • Tree Shaking
    • Babel
    • 壓縮圖片
    • Code Split
      • 多入口
      • 按需加載
    • Preload / Prefetch
    • Core-js
    • PWA
    • 總結

基本使用

  • webpack是一個靜態資源打包工具
  • 他會以一個或者多個文件作為打包的入口,將我們整個項目所有文件編譯組合成一個或者多個文件輸出出去
  • 輸出的文件就是編譯好的文件,就可以在瀏覽器中運行了
  • 我們將webpack輸出的文件叫做bundle

核心概念

  • entry(入口):指示Webpack從哪個文件開始打包
  • output(輸出):指示Webpack打包完的文件輸出到哪里去,如何命名等
  • loader(加載器):webpack本身只能處理js、json等資源,其他資源需要借助loader、webpack才能解析
  • plugins(插件):擴展webpack的功能
  • mode(模式):
    • 開發模式:development
    • 生產模式:production
  • 開發服務器:devServer

處理樣式資源

  • webpack本身是不能識別樣式資源的,所以我們需要借助Loader來幫助Webpack解析樣式資源

步驟:

  1. 安裝相應的loader
  2. 在webpack.config.js中進行配置
  3. npx webpack進行打包即可

處理圖片資源

  • 將小于10kb的圖片轉為base64編碼格式
 //處理圖片資源{test: /\.(png|jpg|gif|jpeg|webp)$/,type: "asset",parser: {dataUrlCondition: {maxSize: 10 * 1024, //小于10kb的圖片,會被base64處理},},},

修改圖片輸出文件目錄

  • 添加generator屬性
 //處理圖片資源{test: /\.(png|jpg|gif|jpeg|webp)$/,type: "asset",parser: {dataUrlCondition: {maxSize: 10 * 1024, //小于10kb的圖片,會被base64處理},},generator: {//輸出圖片名稱filename: "static/images/[hash][ext][query]",},},

自動清空上次打包的內容

  • 在output中的clean屬性設置為true

Eslint

  • 可組裝的Javascript和JSX檢查工具
  • 它是用來檢測js和jsx語法的工具,可以配置各項功能

Babel

  • JavaScript編譯器
  • 主要用于將ES6編寫的代碼轉換為向后兼容的JavaScript語法,以便能夠運行在當前和舊版本的瀏覽器或者其他環境中

處理HTML資源

  • Defer的作用:在 HTML 中,

搭建開發服務器

  • 自動化:devServer
  • 在webpack.config.js中進行配置
  //開發服務器devServer:{host:"localhost", //啟動服務器域名port:"3000", //啟動服務器端口open:true // 是否自動打開瀏覽器},

生產模式

  • 生產模式是開發完成代碼后,我們需要得到代碼將來部署上線
  • 這個模式下我們主要對代碼進行優化,讓其運行性能更好,優化主要從兩個角度出發:
    • 優化代碼運行性能
    • 優化代碼打包速度

提取css文件為單獨文件

  • css文件目前被打包到js文件中,當js文件加載時,會創建一個style標簽來生成樣式
  • 這樣對于網站來說會出現閃屏現象,用戶體驗不好
  • 我們應該是單獨的css文件,通過link標簽加載性能更好
  • 使用下面的插件
    mini-css-extract-plugin

問題:

  1. 為什么通過style標簽加載css會出現閃屏現象,但是通過link標簽則不會呢
  2. 當您通過

Css壓縮

npm install css-minimizer-webpack-plugin --save-dev

HTML壓縮

  • 默認生產模式已經開啟了:HTML壓縮和js壓縮

小結1

在這里插入圖片描述

高級

  • 所謂高級配置其實就是進行Webpack優化,讓我們代碼在編譯/運行時性能更好

SourceMap

  • SourceMap(源代碼映射)是一個用來生成源代碼與構建后代碼一一映射的文件的方案。
  • 作用:它會生成一個xxx.map文件,里面包含源代碼和構建后代碼每一行、每一列的映射關系。當構建后代碼出錯了,會通過xxx.map文件,從構建后代碼出錯位置找到映射后源代碼出錯位置,從而讓瀏覽器提示源代碼文件出錯位置,幫助我們更快的找到錯誤根源

開發模式

  • cheap-module-source-map
  • 優點:打包編譯速度快,只包含行映射
  • 缺點:沒有列映射
module.exports = {mode:"development",devtool:"cheap-module-source-map"
}

生產模式

  • source-map
  • 優點:包含行/列映射
  • 缺點:打包編譯速度更慢
module.exports = {mode:"production",devtool:"source-map"

HMR

  • 全稱:HotModuleReplacement(HMR/熱模塊替換):在程序運行中,替換、添加或者刪除模塊,而無需重新加載整個頁面

OneOf

  • 為什么:打包時每個文件都會經過所有loader處理,雖然因為test正則原因實際沒有處理上,但是都要過一遍,比較慢
  • 是什么:顧名思義就是只能匹配上一個loader,剩下的就不匹配了

Include/Exclude

  • 為什么:開發時我們需要使用第三方庫和插件,所有文件都下載到node-modules中了,而這些文件是不需要編譯可以直接使用的,所以我們在對js文件處理時,要排除node-modules下面的文件
  • 是什么:
    • include:包含,只處理xxx文件
    • exclude:排除,除了xxx文件以外其他文件都處理

Cache

  • 為什么:每次打包時js文件都要經過Eslint檢查和Babel編譯,速度比較慢。我們可以緩存之前的Eslint檢查和Babel編譯結果,這樣第二次打包時速度就會更快了。
  • 是什么:對Eslint檢查和Babel編譯結果進行緩存

Thead

  • 為什么:當項目越來越大時,打包速度越來越慢。我們想要繼續提升打包速度,其實就是要提升js的打包速度,因為其他文件都比較少。而對js文件處理主要就是eslint、babel、Terser三個工具,所以我們要提升他們的運行速度,我們可以開啟多進程同時處理js文件,這樣速度就比之前的單進程打包更快了
  • 是什么:多進程打包:開啟電腦的多個進程同時干一件事,速度更快。
    需要注意:請僅在特別耗時的操作中使用,因為每個進程啟動就有大約為600ms左右的開銷。

Tree Shaking

  • 用來減少代碼體積
  • 為什么:開發時我們定義了一些工具函數庫,或者引用第三方工具函數庫或者組件庫。如果沒有特殊處理的話我們打包時會引入整個庫,但是實際上可能我們可能只用上極小部分的功能。這樣將整個庫都打包進來,體積就太大了。
  • 是什么:Tree Shaking是一個術語,通常用于描述移除Javascript中的沒有使用上的代碼。
    注意:它依賴ES Module
    生產模式下自動開啟了這個功能

Babel

  • Babel-runtime

壓縮圖片

  • 開發如果項目中引用了較多圖片,那么圖片體積會比較大,將來請求速度比較慢。我們可以對圖片進行壓縮,減少圖片體積。
    注意:如果項目中圖片都是在線鏈接,那么就不需要了,本地項目靜態圖片才需要進行壓縮。
  • 插件:image-minimizer-webpack-plugin

Code Split

  • 作用:優化代碼運行性能
  • 為什么:打包代碼時會將所有js文件打包到一個文件中,體積太大了。我們如果只要渲染首頁,就應該只加載首頁的js文件,其他文件不應該加載
    • 所以我們需要將打包生成的文件進行代碼分割,生成多個js文件,渲染哪個頁面就只加載某個js文件,這樣加載的資源越少,速度就更快。
  • 是什么:代碼分割,主要做了兩件事
    • 分割文件:將打包生成的文件進行分割,生成多個js文件。
    • 按需加載:需要哪個文件就加載哪個文件

多入口

  • 有多個入口文件就是多入口
  • 打包后會生成多個文件
 entry: {//有多個入口文件:多入口main: "./src/main.js",app: "./src/app.js",},

按需加載

  1. 可以使用import的動態導入,會將動態導入的文件代碼分割(拆分成單獨模塊),在需要使用的時候自動加載。
  2. 返回值是一個promise對象
//動態import
const btn = document.getElementsByClassName("btm");
btn[0].addEventListener("click", () => {import("./count.js").then((res) => {console.log(res.default(1, 6));}).catch((err) => {console.log(err);});
});

Preload / Prefetch

  • 為什么:前面已經做了代碼分割,同時會使用import動態導入語法來進行代碼按需加載(也叫懶加載,比如路由懶加載就是這樣實現的)。但是加載速度還不夠好,比如:是用戶點擊按鈕時才加載這個資源的,如果資源體積很大,那么用戶會感覺到明顯卡頓效果。我們想在瀏覽器空閑時間,加載后續需要使用的資源,我們就需要用上preload和prefetch技術。
  • 是什么:
    • Preload:告訴瀏覽器立即加載資源
    • Prefetch:告訴瀏覽器在空閑時才開始加載資源
  • 共同點:
    • 都只會加載資源,并不執行。
    • 都有緩存
  • 區別:
    • Preload加載優先級高,Prefetch加載優先級低
    • Preload只能加載當前頁面需要使用的資源,Prefetch可以加載當前頁面資源,也可以加載下一個頁面需要使用的資源
  • 總結:
    • 當前頁面優先級高的資源用Preload加載。
    • 下一個頁面需要使用的資源用Prefetch加載。

Core-js

  • 為什么:babel對js代碼的兼容性處理不能做到面面俱到,一旦遇到低版本瀏覽器會直接報錯,所以我們想要將js兼容性問題徹底解決
  • 是什么:core-js是專門用來做ES6以及以上API的polyfillpolyfill翻譯過來叫做墊片/補丁。就是用社區上提供的一段代碼,讓我們在不兼容某些新特性的瀏覽器上,使用該新特性。
  • 完整引入:import 'core-js'
  • 按需加載:import "core-js/es/promise"

PWA

  • 為什么:開發Web App項目,項目一旦處于網絡離線情況,就沒法訪問了。
  • 是什么:漸進式網絡應用程序(progressive web application),是一種可以提供類似于native app(原生應用程序)體驗的Web App的技術。其中最重要的是,在離線時應用程序能夠繼續運行功能。內部通過Service Workers技術實現

總結

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80104.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字IC前端學習筆記:鎖存器的綜合

相關閱讀 數字IC前端專欄https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 鎖存器是一種時序邏輯,與寄存器相比面積更小,但它的存在會使靜態時序分析(STA)變得更加復雜,因此懂得什么樣的設計會綜合出…

LVGL源碼學習之渲染、更新過程(2)---無效區域的處理

LVGL版本:8.1 往期回顧: LVGL源碼學習之渲染、更新過程(1)---標記和激活 區域合并 在前面的代碼分析中,發現標記無效區域的工作其實很繁瑣,雖然大部分區域因為包含關系被剔除,但仍可能存在相互交叉的區域&#xff0c…

01 dnsmasq 中 dns服務

前言 這里我們主要是 來看一下 dns 服務器這邊的相關業務處理 通常來說 在我們日常生活中 還是經常會需要使用 dns 的情況, 主要是更加友好的去給一個主機命名一個別名 比如 現在我的應用在服務器 192.168.220.133 但是我不想記這個生硬的 ip, 我可能更期望記錄一個域名, …

最優化方法Python計算:有約束優化應用——線性Lasso回歸分類器

利用線性Lasso模型類LineLassoModel類(見博文《最優化方法Python計算:有約束優化應用——線性Lasso回歸預測器》)及分類器類Classification(見博文《最優化方法Python計算:無約束優化應用——線性回歸分類器》&#xf…

Python基礎學習-Day20

目錄 奇異值分解(SVD)的輸入和輸出奇異值的應用實際案例1. 問題分析2. 解決方案:對測試集應用相同的變換3. 為什么不能對測試集單獨做 SVD?4. 代碼示例:訓練集和測試集的 SVD 降維6. 實際操作中的注意事項 奇異值分解&…

2025年 全新 AI 編程工具 Cursor 安裝使用教程

一、Cursor 軟件下載 首選,登錄Cursor官網,進行軟件下載,官網下載地址如下: Cursor AI IDE 下載 二、Cursor軟件安裝配置 此處以Windows10系統安裝為例,下載完成之后,右鍵安裝包,以管理員身份…

[vue]error:0308010C:digital envelope routines::unsupported

npm run dev 報錯: \node_modules\webpack\hot\dev-server.jsnode:internal/crypto/hash:71 this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital env…

開放的力量:新零售生態的共贏密碼

當某頭部生鮮平臺向供應商開放銷售預測系統后,合作伙伴的庫存周轉率竟提升12%——這個反常識的案例,正在重塑商業競爭的底層邏輯。 生態共建三板斧 ▌模塊化設計:像搭積木一樣開放 ? 樂高式API架構:30%接口支持自由組合&#xff…

深入理解Spring緩存注解:@Cacheable與@CacheEvict

在現代應用程序開發中,緩存是提升系統性能的重要手段。Spring框架提供了一套簡潔而強大的緩存抽象,其中Cacheable和CacheEvict是兩個最常用的注解。本文將深入探討這兩個注解的工作原理、使用場景以及最佳實踐。 1. Cacheable注解 基本概念 Cacheable…

[python] 函數3-python內置函數

一 內置函數 導入:import builtins 1.1 查看內置函數 大寫字母開頭的一般是內置變量小寫的一般是內置函數 import builtins print(dir(builtins)) 1.2 abs() 求絕對值 print(abs(-10)) 1.3 sum()求和 不能直接用純數字,因為不是可迭代對象 運算時只要一個是浮點數,結果就…

QT異步線程通信

在使用 QThreadPool 提交任務后,如果你需要知道任務何時完成,并且需要使用任務的執行結果,可以通過以下幾種方式來實現: 1. 使用信號和槽 QRunnable 提供了一個 finished() 信號,當任務執行完成后會發出。你可以在任…

利用并行處理提高LabVIEW程序執行速度

在 LabVIEW 編程中,提升程序執行速度是優化系統性能的關鍵,而并行處理技術則是實現這一目標的有力武器。通過合理運用并行處理,不僅能加快程序運行,還能增強系統的穩定性和響應能力。下面將結合實際案例,深入探討如何利…

機器學習第三講:監督學習 → 帶答案的學習冊,如預測房價時需要歷史價格數據

機器學習第三講:監督學習 → 帶答案的學習冊,如預測房價時需要歷史價格數據 資料取自《零基礎學機器學習》。 查看總目錄:學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章:DeepSeek R1本地與線上滿血版部署&#xff1…

Open CASCADE學習|實現裁剪操作

1. 引言 Open CASCADE (簡稱OCC) 是一個功能強大的開源幾何建模內核,廣泛應用于CAD/CAM/CAE領域。裁剪操作作為幾何建模中的基礎功能,在模型編輯、布爾運算、幾何分析等方面有著重要作用。本文將全面探討Open CASCADE中的裁剪操作實現原理、應用場景及具…

【redis】分片方案

Redis分片(Sharding)是解決單機性能瓶頸的核心技術,其本質是將數據分散存儲到多個Redis節點(實例)中,每個實例將只是所有鍵的一個子集,通過水平擴展提升系統容量和性能。 分片的核心價值 性能提…

RGB矩陣照明系統詳解及WS2812配置指南

RGB矩陣照明系統詳解及WS2812配置指南 一、RGB矩陣照明簡介 RGB矩陣照明是一種強大的功能,允許使用外部驅動器驅動的RGB LED矩陣為鍵盤增添絢麗的燈光效果。該系統與RGBLIGHT功能無縫集成,因此您可以使用與RGBLIGHT相同的鍵碼來控制它,操作…

[250509] x-cmd 發布 v0.5.11 beta:x ping 優化、AI 模型新增支持和語言變量調整

目錄 X-CMD 發布 v0.5.11 beta📃Changelog🧩 ping🧩 openai🧩 gemini🧩 asdf🧩 mac? 升級指南 X-CMD 發布 v0.5.11 beta 📃Changelog 🧩 ping 調整 x ping 默認參數為 bing.com&a…

嵌入式開發學習日志Day17

第十一章 結構體與共用體 一、結構體 1、結構體 一般形式 【struct 標識符】 結構體中的標識符一般首字母大寫; 【.】結構體成員運算符; 優先級 1 級 結合方向:從左至右; 【->】:指向結構體成員運算符&#x…

發那科機器人5(異常事件和程序備份加載+ROBOGUIDE離線仿真)

發那科機器人5(異常事件和程序備份加載+ROBOGUIDE離線仿真) 一,異常事件和程序備份加載1,常見異常事件2,零點復歸介紹3,程序備份-加載(未整理)二,`ROBOGUIDE`離線仿真1,仿真軟件簡介及安裝步驟(未整理)2,機器人==導入與工具==與==工件添加==2.1,機器人導入(未整…

青少年編程與數學 02-019 Rust 編程基礎 01課題、環境準備

青少年編程與數學 02-019 Rust 編程基礎 01課題、環境準備 一、Rust核心特性應用場景開發工具社區與生態 二、Rust 和 Python 比較1. **內存安全與并發編程**2. **性能**3. **零成本抽象**4. **跨平臺支持**5. **社區與生態系統**6. **錯誤處理**7. **安全性**適用場景總結 三、…