本文首發於 Array_Huang的技術博客——實用至上
,非經做者贊成,請勿轉載。
原文地址:https://segmentfault.com/a/1190000006907701
若是您對本系列文章感興趣,歡迎關注訂閱這裏:https://segmentfault.com/blog/array_huang
上一篇《據說webpack連less/css也能打包?》說到使用loader來加載CSS,這一篇來說講如何籠統地加載其它類型的資源。爲何強調是「籠統」呢?這是由於本文介紹的方法並不針對任何類型的資源,這意味着,什麼類型的資源都能用,但效果也都只是有限的。javascript
本文介紹倆loader:file-loader和url-loader。css
file-loader
file-loader的主要功能是:把源文件遷移到指定的目錄(能夠簡單理解爲從源文件目錄遷移到build
目錄),並返回新文件的路徑(簡單拼接而成)。html
file-loader須要傳入name
參數,該參數接受如下變量(如下討論的前提是:源文件src/public-resource/imgs/login-bg.jpg
;在根目錄內執行webpack
命令,也就是當前的上下文環境與src
目錄同級):前端
個人作法是,require('!file-loader?name=static/images/[name].[ext]!../imgs/login-bg.jpg')
,這樣login-bg.jpg
的路徑就變成static/images/login-bg.jpg
了,注意這還不是完整的路徑,最終仍是要拼上webpack配置中的output.publicPath
參數的;好比說個人output.publicPath
參數是../../../../build/
,那麼最終從require()
裏得到的完整路徑就會是../../../../build/static/images/login-bg.jpg
了。html5
url-loader
url-loader的主要功能是:將源文件轉換成DataUrl(聲明文件mimetype的base64編碼)。據我所知,在前端範疇裏,圖片和字體文件的DataUrl都是能夠被瀏覽器所識別的,所以能夠把圖片和字體都轉化成DataUrl收納在HTML/CSS/JS文件裏,以減小HTTP鏈接數。java
url-loader主要接受如下參數:webpack
require("url?limit=10000!./file.png");
,表示若是目標文件大於10000字節,就交給file-loader處理了。require("url?mimetype=image/png!./file.jpg");
,強行把jpg當png使哈。接下來仍是用個人腳手架項目webpack-seed來介紹如何利用url-loader和file-loader來加載各種資源。git
這一塊我是直接在webpack配置文件裏設置的:github
{ // 圖片加載器,雷同file-loader,更適合圖片,能夠將較小的圖片轉成base64,減小http請求 // 以下配置,將小於8192byte的圖片轉成base64碼 test: /\.(png|jpg|gif)$/, loader: 'url-loader?limit=8192&name=./static/img/[hash].[ext]', },
因爲使用了[hash],所以即使是不一樣頁面引用了相同名字但實際內容不一樣的圖片,也不會形成「覆蓋」的狀況出現;進一步講,若是不一樣頁面引用了在不一樣位置但實際內容相同的圖片,這還能夠歸併成一張圖片,方便瀏覽器緩存呢。web
這一塊我也仍是直接在webpack配置裏配置的:
{ // 專供iconfont方案使用的,後面會帶一串時間戳,須要特別匹配到 test: /\.(woff|woff2|svg|eot|ttf)\??.*$/, loader: 'file?name=./static/fonts/[name].[ext]', },
須要聲明的是,因爲我使用的是阿里媽媽的iconfont方案,此方案加載字體文件的方式有一點點特殊,因此正則匹配的時候要注意一點,iconfont的CSS是這樣的,大家看看就明白了:
@font-face {font-family: "iconfont"; src: url('iconfont.eot?t=1473142795'); /* IE9*/ src: url('iconfont.eot?t=1473142795#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('iconfont.woff?t=1473142795') format('woff'), /* chrome, firefox */ url('iconfont.ttf?t=1473142795') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('iconfont.svg?t=1473142795#iconfont') format('svg'); /* iOS 4.1- */ }
也許你會問,咱們爲何還須要轉移其它資源呢?直接引用不就能夠了嗎?
我以前也是這麼作的,直接引用源文件目錄src
裏的資源,好比說webuploader
用到的swf文件,好比說用來兼容IE而又不須要打包的js文件。可是後來我發現,這樣作的話,就致使部署上線的時候要把build
目錄和src
目錄同時放上去了;並且因爲build
目錄和src
目錄同級,我就只能用build
目錄和src
目錄的上一級目錄做爲網站的根目錄了(由於若是把build
目錄設爲網站,用戶就讀取不到src
目錄了),反正就是各類的不方便。
那麼,我是怎麼作的呢?
我建了一個config文件,名爲build-file.config.js
,內容以下:
module.exports = { js: { xdomain: require('!file-loader?name=static/js/[name].[ext]!../../../vendor/ie-fix/xdomain.all.js'), html5shiv: require('!file-loader?name=static/js/[name].[ext]!../../../vendor/ie-fix/html5shiv.min.js'), respond: require('!file-loader?name=static/js/[name].[ext]!../../../vendor/ie-fix/respond.min.js'), }, images: { 'login-bg': require('!file-loader?name=static/images/[name].[ext]!../imgs/login-bg.jpg'), }, };
這個config文件起到兩個做用:
require()
語句,對目標文件進行轉移(從src
目錄到build
目錄)。src/public-resource/components/header/html.ejs
裏是這麼用的:<!DOCTYPE html> <html lang="zh-cmn-Hans"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><% if (pageTitle) { %> <%= pageTitle %> - <% } %> XXXX後臺</title> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" /> <meta name="renderer" content="webkit" /> <!--[if lt IE 10]> <script src="<%= BUILD_FILE.js.xdomain %>" slave="<%= SERVER_API_URL %>cors-proxy.html"></script> <script src="<%= BUILD_FILE.js.html5shiv %>"></script> <![endif]--> </head> <body> <!--[if lt IE 9]> <script src="<%= BUILD_FILE.js.respond %>"></script> <![endif]-->
恩,你可能會好奇這HTML裏怎麼能直接引用js的值,哈哈哈,超綱了超綱了,這是我後面要講到的內容了。
諸位看本系列文章,搭配我在Github上的腳手架項目食用更佳哦(笑):Array-Huang/webpack-seed(https://github.com/Array-Huang/webpack-seed
)。
https://segmentfault.com/a/1190000006843916
https://segmentfault.com/a/1190000006863968
https://segmentfault.com/a/1190000006871991
https://segmentfault.com/a/1190000006887523
https://segmentfault.com/a/1190000006897458
https://segmentfault.com/a/1190000006907701
https://segmentfault.com/a/1190000006952432
https://segmentfault.com/a/1190000006992218
https://segmentfault.com/a/1190000007030775
https://segmentfault.com/a/1190000007043716
https://segmentfault.com/a/1190000007104372
https://segmentfault.com/a/1190000007126268
https://segmentfault.com/a/1190000007159115
本文首發於 Array_Huang的技術博客——實用至上
,非經做者贊成,請勿轉載。
原文地址:https://segmentfault.com/a/1190000006907701
若是您對本系列文章感興趣,歡迎關注訂閱這裏:https://segmentfault.com/blog/array_huang