大家好,我是奶綠茶
上一篇介紹了 webpack 的核心功能 loader
這篇再來補強各種常用的 loader
css-loader:解悉 css 檔
extract-loader:這個有點難翻,下面會介紹
file-loader:存成實體的檔案, 如圖片
html-loader:解悉 html 檔
sass-loader:解悉 scss 檔
url-loader:解悉圖片路徑
webpack.config.js
scss
在這要做多組合的應用
先將 .scss 透過 scss-loader 轉換, 並產生 sourceMap 檔
再過 css-loader
最後再過 style-loader
最終要產生實體的 html 檔
1. 直接用 file-loader 產生
會發現 html 變成了 js code
而且圖片也沒有處理
2. 過 extract-loader
再過 file-loader ,
產生的 html 才是我們要的
那圖片是怎麼處理的呢?
extract-loader 或是 css-loader ,遇到圖片路徑,
會再轉給 webpack 其他的 loader 處理
正規副檔名是 png,jpg,gif,svg,ico 就使用 url-loader
如果圖片小於 2048k 就轉成 base64 字串
否則就自動改用 file-loader 來處理
這部份就是 webpack 的強項
同檔名圖片,會因為使用者快取,看不到你更新的圖片
所以在 name 的參數,加入了一個 hash 參數
本來的 html img src="xxxxx.jpg"
經過 url-loader 轉換後, 就變成 "xxx.jpg?f5240920e4"
而且只有過 url-loader 的圖片,才會被處理
最終上線的圖片,就只會有用到的圖片檔
小技巧
在 html, css 要寫圖片路徑,以前都要寫完整的相對路徑
在 webpack 下,可以縮寫成 "~xxxx.jpg" ,前面加入小蚯蚓
記得在 resolve modules 加入圖片路徑
等一下!!!!!!!!!!!!!!!!! 怎麼沒有 css 檔 ??
因為目前的 scss 設定,預設會把 style 通通都寫在 js 檔裡
並在執行網頁時, 動態的注到 style tag 到你的 html
如果想產生實體的 css 檔,我們的 loader 規則就要換一下
回去看一下剛剛的 scss 設定
我們採用的組合是 style!css!scss
其中的 style-loader 就是產生 js 注入用的程式碼
改用
webpack 每個 loader 都只做一件事
有時要產生想要的結果,需要用多組 loader 組合
轉載請註明出處
Github Source Code
上一篇介紹了 webpack 的核心功能 loader
這篇再來補強各種常用的 loader
css-loader:解悉 css 檔
extract-loader:這個有點難翻,下面會介紹
file-loader:存成實體的檔案, 如圖片
html-loader:解悉 html 檔
sass-loader:解悉 scss 檔
url-loader:解悉圖片路徑
webpack.config.js
module.exports = {
resolveLoader: {
// 所有用到的 loader, -loader 可以不用打
moduleExtensions: [ "-loader" ],
},
resolve: {
// 在 require 檔案, 如果不想寫完整的路徑
// 可以加入這些目錄, 讓 webpack 自動尋找對的檔案
// 請注意我們加入了 src/img 路徑,後面會再介紹到
modules: [
path.resolve( 'src/html' ),
path.resolve( 'src/img' ),
path.resolve( 'src/css' ),
path.resolve( 'src/js' ),
path.resolve( "node_modules"),
],
// 在 require 時可以不用打副檔名
extensions: [ ".js", ".scss" ]
},
}
再來就是 loader 的介紹scss
在這要做多組合的應用
先將 .scss 透過 scss-loader 轉換, 並產生 sourceMap 檔
再過 css-loader
最後再過 style-loader
{
test: /\.scss$/,
// 多個 loader 組合, 可寫成一行,或是使用 use,
// 處理順序是由後往前
// loader: 'style!css?sourceMap!sass?sourceMap',
use: [
"style",
"css?sourceMap",
'sass?sourceMap'
],
include: path.resolve( __dirname, "src/css" ),
exclude: /(node_modules|bower_components)/,
},
html最終要產生實體的 html 檔
1. 直接用 file-loader 產生
會發現 html 變成了 js code
而且圖片也沒有處理
2. 過 extract-loader
再過 file-loader ,
產生的 html 才是我們要的
那圖片是怎麼處理的呢?
{
// https://github.com/webpack-contrib/html-loader
test: /\.html$/,
// 只用 html-loader , 會把 html 的 code 包在 js 裡,不是我們要的
// loader: 'html',
// 只用 file-loader , 只會單純的 copy 過去, 不會處理 img src 的圖片
// loader: 'file?name=[name].html',
loader: 'file?name=[name].[ext]!extract!html',
include: [ path.resolve( __dirname, "src/html" ) ],
exclude: /(node_modules|bower_components)/,
},
jpg,png圖片extract-loader 或是 css-loader ,遇到圖片路徑,
會再轉給 webpack 其他的 loader 處理
正規副檔名是 png,jpg,gif,svg,ico 就使用 url-loader
如果圖片小於 2048k 就轉成 base64 字串
否則就自動改用 file-loader 來處理
這部份就是 webpack 的強項
同檔名圖片,會因為使用者快取,看不到你更新的圖片
所以在 name 的參數,加入了一個 hash 參數
本來的 html img src="xxxxx.jpg"
經過 url-loader 轉換後, 就變成 "xxx.jpg?f5240920e4"
而且只有過 url-loader 的圖片,才會被處理
最終上線的圖片,就只會有用到的圖片檔
小技巧
在 html, css 要寫圖片路徑,以前都要寫完整的相對路徑
在 webpack 下,可以縮寫成 "~xxxx.jpg" ,前面加入小蚯蚓
記得在 resolve modules 加入圖片路徑
{
test: /\.(png|jpg|gif|svg|ico)$/,
use: [
{
loader: 'url',
options: {
// 小於 2048k 的圖檔, 自動變成 base64 字串
limit: 2048,
// 檔名: asset/[字資料夾][檔名].[副檔名]?[檔案的hash]
name: "asset/[path][name].[ext]?[hash:10]",
},
},
],
include: path.resolve( 'src/img' ),
exclude: /(node_modules|bower_components)/,
},
webpack 打包後, 就可以看到最終產生的所有檔案等一下!!!!!!!!!!!!!!!!! 怎麼沒有 css 檔 ??
因為目前的 scss 設定,預設會把 style 通通都寫在 js 檔裡
並在執行網頁時, 動態的注到 style tag 到你的 html
如果想產生實體的 css 檔,我們的 loader 規則就要換一下
回去看一下剛剛的 scss 設定
我們採用的組合是 style!css!scss
其中的 style-loader 就是產生 js 注入用的程式碼
改用
{
test: /\.scss$/,
use: [
// "style", // 如果要用 extract-loader , 就不要加 style-loader
"file?name=asset/[path][name].css",
"extract?publicPath=../../",
"css?sourceMap",
'sass?sourceMap'
],
include: path.resolve( __dirname, "src/css" ),
exclude: /(node_modules|bower_components)/,
},
小結一下webpack 每個 loader 都只做一件事
有時要產生想要的結果,需要用多組 loader 組合
轉載請註明出處
Github Source Code
留言
而且官方也不推薦 resolveLoader.moduleExtensions,你有仔細讀官方的 document 嗎?寫不好就認真讀 document 吧。