Webpack 插件實現 CSS 樣式尺寸單位轉換

来源:https://www.cnblogs.com/yuzhihui/archive/2023/06/07/17463475.html
-Advertisement-
Play Games

# Webpack 插件實現 CSS 樣式尺寸單位轉換 ## 實現方式一 ### 插件代碼 以下是編寫的一個 Webpack 插件,用於將樣式文件中以 rpx 為單位的值轉換為以 px 為單位的值(換算比率為 1px=2rpx): ```javascript const pluginName = " ...


Webpack 插件實現 CSS 樣式尺寸單位轉換

實現方式一

插件代碼

以下是編寫的一個 Webpack 插件,用於將樣式文件中以 rpx 為單位的值轉換為以 px 為單位的值(換算比率為 1px=2rpx):

const pluginName = "CssSzieConvertPlugin";

class CssSzieConvertPlugin {
  apply(compiler) {
    compiler.hooks.emit.tap(pluginName, (compilation) => {
      for (const chunk of compilation.chunks) {
        for (const file of chunk.files) {
          if (file.endsWith(".css")) {
            const originalSource = compilation.assets[file].source();
            const newSource = originalSource.replace(
              /\b(\d+(\.\d+)?)(rpx)\b/g,
              (match, number) => `${number / 2}px`
            );
            compilation.assets[file] = {
              source: () => newSource,
              size: () => newSource.length,
            };
          }
        }
      }
    });
  }
}

module.exports = CssSzieConvertPlugin;

上面的代碼創建了一個名為 CssSzieConvertPlugin 的插件類。該插件通過註冊到 Webpack 的 emit 鉤子上來處理樣式文件。

在鉤子回調函數中,首先遍歷所有的 chunk 和文件,並檢查哪些文件是 CSS 文件。通過檢查文件擴展名是否為 .css 來識別 CSS 文件。

然後,獲取原始文件的源代碼,並使用正則表達式 /\b(\d+(\.\d+)?)(rpx)\b/g 匹配所有以 rpx 為單位的數字。使用 replace 方法將每個匹配項替換為一個新的值。使用一個回調函數,將匹配項中的數字除以 2,並將單位從 "rpx" 更改為 "px"。

最後,更新 compilation.assets 對象中的文件源代碼和大小,以便 Webpack 可以使用更新後的文件替換原始文件。

使用代碼

在 Webpack 配置文件中使用這個插件,例如:

const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");

module.exports = {
  // ...
  plugins: [
    new CssSzieConvertPlugin(),
    // ...
  ],
};

這將在 Webpack 構建過程中自動應用編寫的插件,並將樣式文件中的 rpx 值轉換為 px 值。

實現方式二

插件代碼

以下是編寫的另一個 Webpack 插件,用於將樣式文件中以 rpx 為單位的值轉換為以 px 為單位的值(換算比率為 1px=2rpx):

const pluginName = "CssSzieConvertPlugin";

class CssSzieConvertPlugin {
  constructor(options) {
    this.options = options || {};
  }

  apply(compiler) {
    compiler.hooks.emit.tapAsync(pluginName, (compilation, callback) => {
      const { test = /\.css$/, exclude = /node_modules/ } = this.options;
      const files = Object.keys(compilation.assets).filter(
        (filename) => test.test(filename) && !exclude.test(filename)
      );

      files.forEach((file) => {
        let source = compilation.assets[file].source();

        // 使用正則表達式匹配所有以 rpx 為單位的數字
        if (source.replace) {
          // 解決 TypeError: source.replace is not a function 問題

          source = source.replace(
            /\b(\d+(\.\d+)?)(rpx)\b/g,
            (match, p1) => `${p1 / 2}px`
          );
        }

        // 更新編譯後的代碼
        compilation.assets[file] = {
          source: () => source,
          size: () => source.length,
        };
      });

      callback();
    });
  }
}

module.exports = CssSzieConvertPlugin;

該插件類名為 CssSzieConvertPlugin,構造函數接受一個選項對象作為參數,該選項對象包含兩個屬性:testexclude,它們分別表示要處理的文件類型和要排除的文件。預設情況下,test 屬性為 /\css$/exclude 屬性為 /node_modules/

apply 方法中,使用 Webpack 的 emit 鉤子來處理樣式文件。首先使用選項中的正則表達式來過濾要處理的文件,然後遍歷這些文件並對它們的源代碼進行處理。

對於每個文件,使用正則表達式 /\b(\d+(\.\d+)?)(rpx)\b/g 匹配所有以 rpx 為單位的數字,並將每個匹配項替換為該數字除以 2 的結果。最後,更新編譯後的代碼,並將更新後的源代碼和大小存儲在 compilation.assets 對象中。

使用代碼

  1. 在 Webpack 配置文件中使用這個插件,例如:

    const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    
    module.exports = {
      // ...
      plugins: [
        new CssSzieConvertPlugin({
          test: /\.wxss/,
          exclude: /node_modules/,
        }),
        // ...
      ],
    };
    

    這將在 Webpack 構建過程中自動應用編寫的插件,並將樣式文件中的 rpx 值轉換為 px 值。在上面的示例中,指定了要處理的文件類型為 .wxss 文件,併排除了 node_modules 目錄中的文件。

  2. 在基於 Webpack 構建工具的 Vue 項目中配置,例如:

    // vue.config.js
    const CssSzieConvertPlugin = require("./CssSzieConvertPlugin");
    
    module.exports = {
      configureWebpack: {
        plugins: [
          new CssSzieConvertPlugin({
            test: /\.(css|js|html)/,
            exclude: /node_modules/,
          }),
        ],
      },
    };
    

作者:飛仔FeiZai

出處:https://www.cnblogs.com/yuzhihui/p/17463475.html

聲明:歡迎任何形式的轉載,但請務必註明出處!!!


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

-Advertisement-
Play Games
更多相關文章
  • # zookeeper ZooKeeper是一個開源的分散式應用程式協調服務 簡單來說可以理解為zookeeper = 文件系統+監聽通知機制 應用場景: 1. 集群管理、伺服器狀態感知 2. 分散式應用配置管理 3. 統一命名服務 4. 分散式鎖 > 小總結: >1. 為客戶提供寫數據功能 數據不 ...
  • # 協程的取消 本文討論協程的取消, 以及實現時可能會碰到的幾個問題. ![coroutine cancellation](https://img2023.cnblogs.com/blog/325852/202306/325852-20230607235812812-279507376.png) 本 ...
  • 1. 背景 3月份針對線上重點H5項目秒開進行治理,本文將逐步介紹如何通過H5頁面的優化手段來提高 1.5 秒開率。 2. 為什麼要優化 從用戶角度看,優化能夠讓頁面載入得更快、對用戶操作響應更及時,用戶體驗更良好,提升用戶體驗和降低用戶流失率非常重要。其中 Global Web Performan ...
  • > 不知不覺又快要到了畢業季,很多同學即將畢業找工作。找工作就免不了去面試,作為一個前端提前準備面試題還是有必要的,一方面能鞏固自己學習的內容,另一方面則是幫助我們通過面試找到一份好的工作。因此在這裡,我將開設一個前端的專欄來以文章的形式專門講解前端的面試題,由淺入深,循序漸進,希望能幫助更多的小伙 ...
  • 夏天到了,用Three.js實現一個可以搖頭和調節檔位的電風扇。主要使用到Blender處理3D模型,用Vite+Typescript搭建項目框架。 ...
  • ## 背景 > base深圳,一年半經驗,找的初級前端崗位,1-3年,投簡歷兩個月只有兩個面試,這是第一個面試 ## 一面 ### 你對html元素是怎麼分類的? 一開始我愣了一下?搞這麼簡單的問題???後面又問面試官你是指的id選擇器這些嗎,,還是display:block,inline-bloc ...
  • 本文講解了VUE項目中路由之間的傳值方式,涉及到的方法都是開發時常用的,希望對大家有多幫助。 1. 方式一:使用router-link標簽 1.1 params 傳參 首先定義好路由 const routes = [ { path : ‘/home’ , component : () => impo ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 步驟條是一種用於引導用戶按照特定流程完成任務的導航條,在各種分步表單交互場景中廣泛應用。先來看一下幾個主流前端 UI 框架中步驟條組件的樣子: ElementPlus AntDesign OpenTiny iView 我們可以發現,步驟條 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...