從loader和plugin開始了解webpack

目錄

  • 一、webpack中loader和plugin的區別
    • 1. Loader(每個 Loader 是一個函數或對象)
    • 2.plugin(每個 Plugin 是一個實例)
    • 3.自定義loader和plugin
  • 二、Babel的功能
  • 三、Plugin中的compiler和compilation對象
    • 1. compiler對象
    • 2. compilation對象

一、webpack中loader和plugin的區別

1. Loader(每個 Loader 是一個函數或對象)

  • 功能:文件轉換 --> 將源文件轉換為webpack可以處理的模塊
  • 處理單位:單個文件(.js,.css,.png)
  • 執行順序:鏈式調用,按配置順序依次執行(源文件 -> Loader1 -> Loader2 -> … -> Webpack可用模塊)
// webpack.config.js
module: {rules: [{test: /\.css$/,use: [ // 執行順序從后到前'style-loader',  // 將CSS注入DOM'css-loader',    // 解析CSS中的@import和url(),支持css modules'postcss-loader' // 添加瀏覽器前綴]}]
}
  • 常用Loader
    代碼轉換:Babel(.js),TypeScript(.ts)
    樣式處理:css-loader,sass-loader,postcss-loader
    文件處理:file-loader,url-loader(小圖轉為Base64),svg-loader
    模版編譯:pug-loader,handlebard-loader

2.plugin(每個 Plugin 是一個實例)

  • 功能:擴展功能 --> 在Webpack構建流程的特定階段執行自定義邏輯
  • 處理單位:整個構建過程(如打包完成后生成HTML文件)
  • 執行順序:基于事件鉤子,可在特定階段多次觸發(Webpack啟動 -> 觸發各種事件鉤子 -> Plugin監聽特定鉤子并執行邏輯)
// webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');plugins: [new HtmlWebpackPlugin({template: './src/index.html' // 基于模板生成HTML})
]
  • 常用Plugins
    CleanWebpackPlugin(),// 每次構建前清空dist目錄
    MiniCssExtractPlugin(), // 提取CSS到單獨文件,通常生產環境中,替代style-loader
    TerserPlugin(), // 壓縮JS
    HtmlWebpackPlugin(), // 生成 HTML

3.自定義loader和plugin

  1. 極簡的loader
module.exports = function(source) {// source: 輸入的文件內容(字符串或Buffer)// 獲取loader配置參數,this.getOptions 是 Webpack 提供的標準化參數獲取方式const options = this.getOptions() || {};// 處理邏輯...return source; // 返回處理后的內容
};
  1. 極簡的plugin
class MyPlugin {constructor(options) {this.options = options; // 接收配置參數}apply(compiler) { // compiler見下// 注冊鉤子監聽編譯過程compiler.hooks.someHook.tap('MyPlugin', (compilation) => { // compilation見下// 處理邏輯...});}
}module.exports = MyPlugin;

二、Babel的功能

一句話概括:Babel的功能是JavaScript代碼轉換

  • 可處理:ES6+語法轉為ES5兼容形式、API補全(Promise,Array.includes)、適配不同瀏覽器|node版本等
  • Babel 的核心是插件系統,每個轉換功能由獨立插件實現
// babel.config.js
module.exports = {plugins: ["@babel/plugin-transform-arrow-functions", // 轉換箭頭函數"@babel/plugin-transform-classes", // 轉換 class 語法"@babel/plugin-proposal-object-rest-spread" // 轉換展開運算符]
};
  • Presets(預設):預設是一組插件的集合,避免手動配置大量插件
// babel.config.js
module.exports = {presets: ["@babel/preset-env", // 智能轉換 ES6+ 代碼"@babel/preset-react", // 轉換 JSX"@babel/preset-typescript" // 轉換 TypeScript]
};
  • Babel 的工作流程:解析代碼 → 轉換 AST → 生成新代碼。
  • Babel常和webpack協作,通過babel-loader作為橋梁
// webpack.config.js
module.exports = {module: {rules: [{test: /\.js$/,use: {loader: 'babel-loader', // 調用Babel編譯JS文件options: {presets: ['@babel/preset-env']}}}]}
};

三、Plugin中的compiler和compilation對象

1. compiler對象

全局單例,代表整個webpack編譯過程,包含所有配置信息,監聽編譯全過程(compile、emit、done)

  • compile:當 Webpack 開始新的一輪編譯時觸發(在讀取配置后,真正編譯前) —> 獲取編譯配置、修改默認行為
  • emit:在文件輸出到磁盤前觸發(所有模塊已編譯,資源已生成)。 —> 修改輸出資源(如重命名文件、添加額外內容)。
  • done:整個編譯過程完成時觸發(文件已寫入磁盤)。 —> 執行編譯后的操作(如通知構建完成、生成報告)。

2. compilation對象

每次構建創建,代表一次具體的編譯過程,包含當前構建的所有模塊、資源和依賴關系,可修改、添加或刪除構建產物

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

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

相關文章

36-Oracle Statistics Gathering(統計信息收集)

小伙伴們,有沒有因為統計信息不準,導致了業務卡頓,各種狀況頻出,這幾天在實踐和實操的過程中,時不時就需要進行統計信息的收集。同時統計信息收集的動作也是OCM必考內容。 數據庫中的數據是地圖,統計信息是…

Linux驅動程序(PWM接口)與超聲波測距

一、利用阿里云服務器實現樹莓派外網訪問(SSH 反向代理) 1. 樹莓派端配置 步驟 1:安裝 SSH 服務(若未安裝) sudo apt-get install openssh-server 步驟 2:創建反向代理連接 -p 22:指定阿里…

Web攻防-XSS跨站文件類型功能邏輯SVGPDFSWFHTMLXMLPMessageLocalStorage

知識點: 1、Web攻防-XSS跨站-文件類型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能邏輯-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件類型觸發XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

強大模型通過自我和解進步——Unsupervised Elicitation of Language Models——論文閱讀筆記

本周關注的工作是:Unsupervised Elicitation of Language Models 這篇文章通篇體現了這樣一件事——香蕉皮大需要香蕉大! 一句話總結 首先注意:這個工作不是面向對齊的,而是寫【如何準備】對齊任務的Reward Model需要的數據集的…

Qt—(Qt初識,槽,信號,事件)

一 Qt初識 暫時不寫了 我的理解是類似于c#,是一個組件庫,不局限是一個組件框架。 二 Qt Core Qt Core 是 Qt 框架的基礎模塊,提供非 GUI 的核心功能: 核心類:QObject(信號槽機制)、QEvent&…

深度學習——基于卷積神經網絡實現食物圖像分類【2】(數據增強)

文章目錄 引言一、項目概述二、環境準備三、數據預處理3.1 數據增強與標準化3.2 數據集準備 四、自定義數據集類五、構建CNN模型六、訓練與評估6.1 訓練函數6.2 評估函數6.3 訓練流程 七、關鍵技術與優化八、常見問題與解決九、完整代碼十、總結 引言 本文將詳細介紹如何使用P…

詳細說說分布式Session的幾種實現方式

1. 基于客戶端存儲(Cookie-Based) 原理:將會話數據直接存儲在客戶端 Cookie 中 實現: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama訪問模型,為什么會出現模型胡亂輸出,然后過一會兒再訪問,就又變成正常的

例子:大模型推理遇到內存不足 1. 場景還原 你在Mac上用Ollama運行如下代碼(以Python為例,假設Ollama有API接口): import requestsprompt "請寫一首關于夏天的詩。" response requests.post("http:…

簡說 Linux 用戶組

Linux 用戶組 的核心概念、用途和管理方法,盡量簡明易懂。 🌟 什么是 Linux 用戶組? 在 Linux 系統中: 👉 用戶組(group) 是一組用戶的集合,用來方便地管理權限。 👉 用…

S32DS上進行S32K328的時鐘配置,LPUART時鐘配置步驟詳解

1:S32K328的基礎信息 S32K328官網介紹 由下圖可知,S32K328的最大主頻為 240MHz 2:S32K328時鐘樹配置 2.1 system clock node 節點說明 根據《S32K3xx Reference Manual》資料說明 Table 143 各個 系統時鐘節點 的最大頻率如下所示&#…

wordpress小語種網站模板

wordpress朝鮮語模板 紫色風格的韓語wordpress主題,適合做韓國、朝鮮的外貿公司官方網站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 綠色的日語wordpress外貿主題,用來搭建日文外貿網站很實用。 https://www.jianzhanpress.co…

網絡:Wireshark解析https協議,firefox

文章目錄 問題瀏覽器訪問的解決方法python requests問題 現在大部分的網站已經切到https,很多站點即使開了80的端口,最終還是會返回301消息,讓客戶端轉向到https的一個地址。 所以在使用wireshark進行問題分析的時候,解析tls上層的功能,是必不可少的,但是這個安全交換的…

ollama部署開源大模型

1. 技術概述 Spring AI:Spring 官方推出的 AI 框架,簡化大模型集成(如文本生成、問答系統),支持多種 LLM 提供商。Olama:開源的本地 LLM 推理引擎,支持量化模型部署,提供 REST API …

Kafka 可靠性保障:消息確認與事務機制(二)

Kafka 事務機制 1. 冪等性與事務的關系 在深入探討 Kafka 的事務機制之前,先來了解一下冪等性的概念。冪等性,簡單來說,就是對接口的多次調用所產生的結果和調用一次是一致的。在 Kafka 中,冪等性主要體現在生產者端&#xff0c…

使用 React.Children.map遍歷或修改 children

使用場景: 需要對子組件進行統一處理(如添加 key、包裹額外元素、過濾特定類型等)。 動態修改 children 的 props 或結構。 示例代碼:遍歷并修改 children import React from react;// 一個組件,給每個子項添加邊框…

智能體三階:LLM→Function Call→MCP

哈嘍,我是老劉 老劉是個客戶端開發者,目前主要是用Flutter進行開發,從Flutter 1.0開始到現在已經6年多了。 那為啥最近我對MCP和AI這么感興趣的呢? 一方面是因為作為一個在客戶端領域實戰多年的程序員,我覺得客戶端開發…

flutter的常規特征

前言 Flutter 是由 Google 開發的開源 UI 軟件開發工具包,用于構建跨平臺的高性能、美觀且一致的應用程序。 一、跨平臺開發能力 1.多平臺支持:Flutter 支持構建 iOS、Android、Web、Windows、macOS 和 Linux 應用,開發者可以使用一套代碼庫在…

【Git】代碼托管服務

博主:👍不許代碼碼上紅 歡迎:🐋點贊、收藏、關注、評論。 格言: 大鵬一日同風起,扶搖直上九萬里。 文章目錄 Git代碼托管服務概述Git核心概念主流Git托管平臺Git基礎配置倉庫創建方式Git文件狀態管理常用…

Android 網絡請求的選擇邏輯(Connectivity Modules)

代碼分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立與數據庫連接(版本問題的解決方案)踩坑總結

1.如何優雅的建立數據庫連接 今天使用這個deepseek寫代碼,主要就是建立數據庫的鏈接,包括這個建庫建表啥的都是他整得,我就是負責執行,然后解決這個里面遇到的一些問題; 其實我學習這個C#不過是短短的4天的時間&…