iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 10
0
Modern Web

使用 webpack 模組化你的程式碼,讓人生更美好。系列 第 10

<10 - Loaders 再進化系列 02> file-loader - 將圖片也載入模組吧!

  • 分享至 

  • xImage
  •  

目前進行到這邊,整個模組化的過程式,我們已經載入了 js 以及 css(以及 SCSS 語法),那圖片的部份呢?或者是其它檔案類型呢?

這時就要派出 file-loader 來將檔案類型(此文章以 svg 圖片為例),載入模組內啦。

又到了動手作的時間/images/emoticon/emoticon31.gif

安裝 file-loader

$ npm install file-loader --save-dev

將圖片載入模組內

先建立一張圖片於:./app/webpack.svg

修改 webpack.config.js

…
options: {
  modules: true
}
…

改成

…
options: {
  modules: false
}
…

這個部份若有需要用到 css modules 的話,才需要設定成 true,這裡先不用喔。

修改 ./app/index.js 檔,僅列出新增的部份:

var img_url = require("file-loader!./webpack.svg");

…

function appendImg(){
  var img = document.createElement('img');
  img.src = img_url;
  img.className = "tune_svg_width";
  return img;
}

…
document.body.appendChild(appendImg());

看一下,應該很容易看得懂,將圖片透過 file-loader 來載入,傳回一個網址到 img_urlappendImg() 函式僅僅是建立 <img src="img_url網址" class="tune_svg_width">,最後放到 <body> 尾端。

修改 ./app/file.css 成如下( img.tune_svg_width 的寬度設定成 300px):

body{
  color:red;
}
img.tune_svg_width{
  width:300px;
}

執行指令:

$ webpack

執行完後,原來的 ./app/webpack.svg 會被複製一份,放到 ./dist/[md5].svg,這裡的 [md5] 指的是說 file-loader 會將檔案複製過去之後,也會改掉主檔名,並且是用 MD5 的方式來加密。

執行指令來看畫面:

$ webpack-dev-server --open

最後的結果畫面如圖(http://localhost:8080/webpack-dev-server/):
http://ithelp.ithome.com.tw/upload/images/20161209/20069901upM0IzwKH9.png

執行成功,也就表示 svg 圖片已經載入到 ./dist/app.js 模組內了。

改用 webpack.config.js

來進一步將 file-loader 寫入 webpack.config.js 設定檔中吧,一樣在 module.rules 新增一個規則:遇到 svgpng 檔時,就使用 file-loader 來處理(僅顯示新增的部份):

…

module.exports = {
  …
  module: {
    rules: [
      …
      {
        test: /\.(svg|png)$/,
        use: [
          { loader: 'file-loader' }
        ]
      }
    ]
  },
  …
}

這時在 ./app/index.js 中,原來這行:

var img_url = require("file-loader!./webpack.svg");

就可以改寫成這行即可:

var img_url = require("./webpack.svg");

file-loader 的檔名規則

來看一下目前的檔案:
http://ithelp.ithome.com.tw/upload/images/20161210/20069901HhPkrd047Z.png

剛才說到檔案的主檔名會被改掉,也就是目前的 ./app/webpack.svg 被複製一份到 ./dist/cd0bb358c45b584743d8ce4991777c42.svg 了,但有時你可能會有其它需求,想要改掉這樣的規則,以下舉兩個狀況:

狀況一:假設因為後端需求的關係,不想要複製檔案

修改 webpack.config.js 內容,增加 options 如下:

…
{
  test: /\.(svg|png)$/,
  use: [
    {
      loader: 'file-loader',
      options: {
        emitFile: false
      }
    }
  ]
}
…

這樣檔案就不會被複製到 ./dist 資料夾下了,但要留意 ./app/index.js 裡的 img_url 的路徑,因為這樣就會找不到圖片,需改用其它路徑,或是直接用 ./app/ 資料夾裡的圖檔。

狀況二:在主檔名後面加上一串 hash 碼
修改 webpack.config.js

…
{
  test: /\.(svg|png)$/,
  use: [
    {
      loader: 'file-loader',
      options: {
        name: '[name]-[hash].[ext]'
      }
    }
  ]
}
…

應該很容易理解,只有這行 name: '[name]-[hash].[ext]'[name]代表圖片的主檔名;[hash] 代表用 md5 之後產生的字串;[ext] 代表原檔案的副檔名。

執行 webpack 指令後,./app/webpack.svg 就會被複製一份到 ./dist/ 資料夾,而檔名會變成 webpack-cd0bb358c45b584743d8ce4991777c42.svg

若還想看更多的檔名規則,可看這裡 喔。

太棒了,又學會了 file-loader ,讓我們的模組化更上一層樓。/images/emoticon/emoticon12.gif


明天,將來繼續介紹下一個 html-loader,敬請期待!!/images/emoticon/emoticon41.gif


上一篇
<09 - Loaders 再進化系列 01> sass-loader - 開始撰寫 SCSS 語法吧!
下一篇
<11 - Loaders 再進化系列 03> html-loader - 將 html 從 js 抽離出來吧!
系列文
使用 webpack 模組化你的程式碼,讓人生更美好。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言