目前進行到這邊,整個模組化的過程式,我們已經載入了 js 以及 css(以及 SCSS
語法),那圖片的部份呢?或者是其它檔案類型呢?
這時就要派出 file-loader
來將檔案類型(此文章以 svg 圖片為例),載入模組內啦。
又到了動手作的時間
$ 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_url
,appendImg()
函式僅僅是建立 <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/
):
執行成功,也就表示 svg 圖片已經載入到 ./dist/app.js
模組內了。
來進一步將 file-loader
寫入 webpack.config.js
設定檔中吧,一樣在 module.rules
新增一個規則:遇到 svg
或 png
檔時,就使用 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");
來看一下目前的檔案:
剛才說到檔案的主檔名會被改掉,也就是目前的 ./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
,讓我們的模組化更上一層樓。
明天,將來繼續介紹下一個 html-loader
,敬請期待!!