webpack loader實現

来源:https://www.cnblogs.com/hashtang/archive/2019/10/13/11666815.html
-Advertisement-
Play Games

正值前端組件化開發時代,那麼必然離不開目前最火的構建工具——webpack(grunt,gulp等暫且不談)。說到這裡,剛好有幾個問題: 為什麼運行打包命令之後, 文件可以轉成 文件 為什麼運行打包命令之後, 文件可以轉成 文件 為什麼運行打包命令之後, 語法可以轉成 語法 "[外鏈圖片轉存失敗,源 ...


正值前端組件化開發時代,那麼必然離不開目前最火的構建工具——webpack(grunt,gulp等暫且不談)。說到這裡,剛好有幾個問題:
  • 為什麼運行打包命令之後,.vue 文件可以轉成 .js 文件
  • 為什麼運行打包命令之後,.less 文件可以轉成 .css 文件
  • 為什麼運行打包命令之後,ES6+ 語法可以轉成 ES5 語法
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mr86zPPH-1570953160209)(https://img.shields.io/npm/v/vue-hash-calendar.svg)]

    上面這幾個問題,就引出了我們的主角——【loader】。
    loaderwebpack 的一塊很重要的組成部分。我們都知道 webpack 是用於資源打包的,裡面的所有資源都是“模塊”,內部實現了對模塊資源進行載入的機制。但是 Webpack 本身只能處理 js 模塊,如果要處理其他類型的文件,就需要使用 loader 進行轉換。 Loader 可以理解為是模塊和資源的轉換器,它本身是一個函數,接收文件源碼作為參數,返迴轉換的結果,例如可以使用 loader 載入器可以快速編譯預處理器 (less,sass,coffeeScript)Loader 可以在 require() 引用模塊的時候添加,也可以在 webpack 全局配置中進行綁定,還可以通過命令行的方式使用。(本篇中的參數配置及使用方式均基於 webpack4.0 版本)

一、loader的特點

1、loader 的執行順序和代碼書寫的順序是相反的,即:從下至上,從右至左。
2、第一個執行的 loader 會接收源文件做為參數,下一次執行的 loader 會接收前一個 loader 執行的返回值做為參數
3、需要嚴格遵循“單一職責”原則,即每個 loader 只負責自己需要負責的事情

二、loader API

methods 含義
this.request 被解析出來的 request 字元串。例子:"/abc/loader1.js?xyz!/abc/node_modules/loader2/index.js!/abc/resource.js?rrr"
this.loaders 所有 loader 組成的數組。它在 pitch 階段的時候是可以寫入的。
this.loaderIndex 當前 loader 在 loader 數組中的索引。
this.async 告訴 loader-runner 這個 loader 將會非同步地回調
this.callback 一個可以同步或者非同步調用的可以返回多個結果的函數
this.data 在 pitch 階段和正常階段之間共用的 data 對象。
this.cacheable 設置是否可緩存標誌的函數
this.resource request 中的資源部分,包括 query 參數
this.resourcePath 資源文件的路徑。
this.resourceQuery 資源的 query 參數
this.target 編譯的目標。從配置選項中傳遞過來的。
this.webpack 如果是由 webpack 編譯的,這個布爾值會被設置為真
this.sourceMap 應該生成一個 source map。因為生成 source map 可能會非常耗時,你應該確認 source map 確實有必要請求。
this.emitWarning 發出一個警告。
this.emitError 發出一個錯誤。
this.loadModule 解析給定的 request 到一個模塊,應用所有配置的 loader ,並且在回調函數中傳入生成的 source 、sourceMap 和 模塊實例(通常是 NormalModule 的一個實例)。如果你需要獲取其他模塊的源代碼來生成結果的話,你可以使用這個函數。
this.resolve 像 require 表達式一樣解析一個 request 。
this.emitFile 產生一個文件。這是 webpack 特有的。
this.fs 用於訪問 compilation 的 inputFileSystem 屬性。
this.value 向下一個 loader 傳值。如果你知道了作為模塊執行後的結果,請在這裡賦值(以單元素數組的形式)。
this.inputValue 從上一個 loader 那裡傳遞過來的值。如果你會以模塊的方式處理輸入參數,建議預先讀入這個變數(為了性能因素)。
更多詳細API,以及各API的用法示例,可以訪問官網查看。地址:https://www.webpackjs.com/api/loaders

三、寫loader之前的需求整理

現在有這樣一個需求,使用 hxkj-loader 載入並處理名稱為 *.hxkj.vip 的文件,將裡面的哈希空間全部替換為 www.hxkj.vip。需要實現的轉換如下:

轉換前的內容:

<div>
    <h1>歡迎訪問哈希空間</h1>
    <p>哎喲,終於等到你。這裡就是讓人流連忘返的哈希空間呀!</p>
</div>

轉換後的內容:

<div>
    <h1>歡迎訪問www.hxkj.vip</h1>
    <p>哎喲,終於等到你。這裡就是讓人流連忘返的www.hxkj.vip呀!</p>
</div>

四、編寫loader

在與 webpack.config.js 同級目錄下新建 hxkj-loader.js,文件的內容如下:

module.exports = function(source){
    var content="";
    content = source.replace("/哈希空間/g","www.hxkj.vip");
    return content; 
}

接下來,需要在 webpack.config.js 文件中增加以下的配置:

const path = require("path"); // 引入 node 的 path 模塊
...
module:{
    rules:[{
        test: /\.hxkj\.vip$/, // 正則匹配以 hxkj.vip 結尾的文件
        use:[{
            loader:path.resolve(__dirname, "hxkj-loader") // 使用 path 模塊找到 hxkj-loader 的路徑
        }]
    }]
}
好,到此,一個簡易版的 loader 就已經寫完了。目前 loader 是直接寫在本地的,可以考慮將自己寫好的 loader 發佈到 npm,這樣就更加完善了。

At last,看完之後有什麼不懂的,可以留言反饋。

轉載請註明出處:https://www.jianshu.com/p/51b793f6fa0e
作者:TSY
個人空間:https://hxkj.vip


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS介紹 CSS( C ascading S tyle S heet,層疊樣式表)定義 如何顯示 HTML元素。 當瀏覽器讀到一個樣式表,它就會按照這個樣式表來對文檔進行格式化(渲染)。 CSS語法 CSS實例 每個CSS樣式由兩個組成部分:選擇器和聲明。聲明又包括屬性和屬性值。每個聲明之後用分號 ...
  • 塊級元素:獨占一行,對寬高的屬性值生效;如果不給寬度,塊級元素就預設為瀏覽器的寬度,即就是100%寬; 行內元素:可以多個標簽存在一行,對寬高屬性值不生效,完全靠內容撐開寬高! 其中還有一種結合兩種模式有點的顯示模式: 行內塊元素:結合的行內和塊級的有點,不僅可以對寬高屬性值生效,還可以多個標簽存在 ...
  • 筆者最近在學習Element UI,覺得它提供的日期選擇器既簡單又美觀,於是仿照著寫了一個日期插件。筆者使用到的技術有ES5、CSS和HTML,控制項相容IE10+和谷歌瀏覽器。有一點需要註意,筆者使用到iframe包裹彈出層,由於瀏覽器的同源安全策略,代碼必須得放到tomcat的webapps文件夾 ...
  • 響應式開發 (就是利用媒體查詢針對不同寬度的設備進行佈局和樣式的設置,從而設配不同設備的目的) 響應式佈局容器響應式需要一個父級作為佈局容器,來配合子級元素來實現變化效果 原理:不同屏幕下,通過媒體查詢來改變這個佈局容器的大小,再改變裡面子元素的排列方式和大小,從而實現不同屏幕下,看到不同的頁面佈局 ...
  • rem即是以html文件中font-size的大小的倍數rem佈局的原理:通過媒體查詢設置不同屏幕寬度下的html的font-size大小,然後在css佈局時用rem單位取代px,從而實現頁面元素大小的動態適配,做出更漂亮整潔的頁面rem佈局的好處:1.頁面整潔2.動態適配缺點:1.需要計算rem, ...
  • element.offsetLeft/Top 獲取元素相對於最近的有定位的父元素的坐標,如果沒有有定位的父元素,則是文檔坐標 element.scrollTop/Left 獲取元素滾動捲去的距離 element.offsetWidth/Height 獲取元素的寬度高度(包含邊框) element.c ...
  • 後臺開發人員不擅長前端UI界面,而小型軟體公司沒有專職美工崗位,開發人員只能藉助開源UI框架,復用已有組件,完成用戶操作界面。EasyUI是基於jQuery的UI插件集合體,可幫助開發者輕鬆構建網頁。 官方地址:http://www.jeasyui.com/ 一、引用EasyUI 官網下載EasyU ...
  • 前言 vue.js是一套構建用戶界面的漸進式框架,vue.js的目標是通過儘可能簡單的API實現響應的數據綁定和組合的視圖組件。 vue通過DOM事件操作和指令來進行視圖層和模型層的相互通訊,會為每一處需要動態更新的DOM節點創建一個指令對象。每當一個指令對象觀測的數據變化時,它便會對所綁定的目標節 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...