webpack4.0各個擊破(3)—— Assets篇

来源:https://www.cnblogs.com/dashnowords/archive/2018/08/29/9545476.html
-Advertisement-
Play Games

作為前端最火的構建工具,是前端自動化工具鏈 最重要的部分 ,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過 問題 + 解決方式 的模式,以前端構建中遇到的具體需求為出發點,學習 工具中相應的處理辦法。(本篇中的參數配置及使用方式均基於 ) [TOC] 一. Assets資源的基本處理需 ...


目錄

webpack作為前端最火的構建工具,是前端自動化工具鏈最重要的部分,使用門檻較高。本系列是筆者自己的學習記錄,比較基礎,希望通過問題 + 解決方式的模式,以前端構建中遇到的具體需求為出發點,學習webpack工具中相應的處理辦法。(本篇中的參數配置及使用方式均基於webpack4.0版本

一. Assets資源的基本處理需求

Assets,指項目中被引用的資源,通常為各種格式的圖片和字體文件,當然也可能包含各式各樣其他擴展名的文件(.json,.xml等),常見的圖片和文字資源的處理包括:

  • 體積壓縮
  • 雪碧圖合併及引用修正
  • 資源的引用路徑自動替換

二. webpack處理引用資源

2.1 資源打標

webpack通過file-loader處理資源文件,它會將rules規則命中的資源文件按照配置的信息(路徑,名稱等)輸出到指定目錄,並返回其資源定位地址(輸出路徑,用於生產環境的publicPath路徑),預設的輸出名是以原文件內容計算的MD5 Hash命名的。

webpack.config.js中添加對圖片文件的處理規則:

 {
    test:/\.(jpg|png|svg|gif)/,
    use:[{
      loader:'file-loader',
      options:{
        outputPath:'imgs/'
      }
    }]
  }

執行打包命令可以看到png圖片資源的名稱被替換為hash並輸出至構建文件夾。

CSS文件中對圖片的引用也被替換為修改後的hash名稱:

html文件中靜態資源引用替換需要通過html-loader

2.2 引用優化

構建工具通過url-loader來優化項目中對於資源的引用路徑,並設定大小限制,當資源的體積小於limit時將其直接進行Base64轉換後嵌入引用文件,體積大於limit時可通過fallback參數指定的loader進行處理。

webpack.config.js中添加url-loader相關配置:

  {
    test:/\.(jpg|png|svg|gif)/,
    use:[{
      loader:'url-loader',
      options:{
        limit:8129,//小於limit限制的圖片將轉為base64嵌入引用位置
        fallback:'file-loader',//大於limit限制的將轉交給指定的loader處理
        outputPath:'imgs/'//options會直接傳給fallback指定的loader
      }
    }]
  }

原始CSS文件中對資源的引用:

.with-img{
    background-image: url('../imgs/pic1.png');
}
.with-small-img{
    background-image: url('../imgs/6k.gif');
}

打包後變為如下形式,可以看到小於8k的資源被直接內嵌進了CSS文件而沒有生成獨立的資源文件:

也可以根據實際需求選擇svg-url-loader,image-webpack-loader等其他插件。

2.3 sprites雪碧圖合成

雪碧圖合成,聽起來是一個顯得略高端的知識點,但它並不是必須進行的,任何一種技術都有其使用場景。有的場景下需要將圖片資源合併為獨立的雪碧圖而減少http請求的次數,有的時候或許通過url-loader直接將其嵌入文檔就可以。矢量圖在不同場景下的處理方式也不相同。

webpack官方倉庫並沒有推薦圖片的處理工具,而是採用url-loader + file-loader作為資源處理的一般通用方案。

1.點陣圖處理

點陣圖資源,可以使用webpack-spritesmith插件進行處理,在webpack.config.jsplugins配置項中實例化插件並傳入配置信息:

  new SpritesmithPlugin({
    //設置源icons,即icon的路徑,必選項
    src: {
      cwd: __dirname + '/imgs/pngs',
      glob: '*.png' //正則匹配,照著填即可
    },
    //設置導出的sprite圖及對應的樣式文件,必選項
    target: {
      image: __dirname + '/build/imgs/sprite.png',
      css: __dirname + '/build/imgs/sprite.css' 
    },
    //設置sprite.png的引用格式,會自己加入sprite.css的頭部
    apiOptions: {
      cssImageRef: './sprite.png' //cssImageRef為必選項
    },
    //配置spritesmith選項,非必選
    spritesmithOptions: {
      algorithm: 'top-down',//設置圖標的排列方式
      padding: 4 //每張小圖的補白,避免雪碧圖中邊界部分的bug
    }
  })

運行webpack後可以得到sprites.css和合成的雪碧圖:

Sprite.png:

Sprite.css:

2. 矢量圖處理

開發中常用的矢量圖為svg格式,既可以使用inline-svg-loader進行資源嵌入,也可以使用svg-sprite-loader將矢量圖資源合併為雪碧圖,具體採用哪種方案,需要由項目的實際情況來判斷。矢量圖的合併原理與點陣圖稍有不同,感興趣的讀者可以自行搜索。

源代碼中的引用:

.class1{
    background-image: url('../imgs/svgs/001-home.svg') no-repeat 0 0;
}

使用inline-svg-loader載入器打包後的引用:

.class1{
    background-image: url("<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 16 16\"><path fill=\"#000000\" d=\"M16 9.226l-8-6.21-8 6.21v-2.532l8-6.21 8 6.21zM14 9v6h-4v-4h-4v4h-4v-6l6-4.5z\"></path></svg>") no-repeat 0 0;
}

2.4 圖片壓縮及其他

圖片資源是可以以清晰度為量化參考進行體積壓縮的,webpack的開發社區也有現成的插件,但不建議通過webpack在每次打包時進行針對圖像本身的處理,而是由UI人員處理好以後提供給開發人員。

筆者認為webpack對於靜態資源所需要解決的首要問題是資源定位,除此之外其他的工作應該從其中剝離,以縮短打包時間。


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

-Advertisement-
Play Games
更多相關文章
  • Preface Yesterday I've installed the 11g GI software on CentOS 7.2.But I still encounter some troubles when I continue to install the database softwar ...
  • 首先這是登陸postgre sql時提示的錯誤信息: psql: 無法聯接到伺服器: Connection refused (0x0000274D/10061) 伺服器是否在主機 "localhost"(::1) 上運行並且準備接受在埠5432 上的 TCP/IP 聯接?無法聯接到伺服器: Con ...
  • 轉載自:http://blog.csdn.net/u011001084/article/details/51318434 最近從圖書館借了本介紹SQL的書,打算複習一下基本語法,記錄一下筆記,整理一下思路,以備日後複習之用。 PS:本文適用SQL Server2008語法。 一、關係型資料庫和SQL ...
  • 1、MySql主從同步是基於二進位日誌實現的,二進位日誌記錄了主伺服器資料庫的所有變動,從伺服器通過讀取和執行該日誌文件保持和主資料庫的數據一致; 2、配置主伺服器 a、開啟二進位日誌,找到MySql配置文件 my.cnf 在[mysqld]模塊下加入如下代碼; b、登錄MySql,創建只能進行主從 ...
  • 1、ENGINE=InnoDB 資料庫存儲引擎,DEFAULT 預設,CHARSET=utf8 資料庫字元編碼 2、資料庫的存儲引擎, mysql中engine=innodb和engine=myisam的區別 myisam:讀取速度比較快,不占用大批量資源,但是又兩個缺點,1、不支持事物,2、容錯不 ...
  • 大數據具體是怎樣的存在,不同的人,不同的立場有不同的看法。也可以抽象為大數據不僅僅是一種概念那麼簡單,更是一種方法。最終的目的就是通過分析和挖掘全量的非抽樣的數據輔助服務決策。 很對人對於大數據沒有清晰的認識,大數據一方面是基於海量的數據,另一方面最為重要的最有就是能我們是生活變得更加方便,能夠依據 ...
  • 1、創建序列 2、序列初始化存儲過程 create procedure proDemo as begin alter sequence dbo.序列名 restart with 0; end 3、創建定時任務自動執行序列初始化存儲過程。 ...
  • 當我們在佈局文件中設置View為wrap_conten的時候,不可以直接使用 來獲取寬高,使用該方法獲取到的是0,應該使用最上面的方法。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...