# webpack4 前端環境建置 part7
# Images webpack loader
npm i -D images-webpack-loader
直接在 asset 下面加個 use,會先判斷是否要壓縮再進行 base64 轉換
module.exports = {
module: {
rules: [
{
test: /\.(jpe?g|png|gif)$/,
type: 'asset',
// 與可以自定義大小
parser: {
dataUrlCondition: {
maxSize: 4 * 1024 // 4kb
}
},
generator: {
// 自定義名稱,加入 hash 紀錄路徑來做快取,只要 hash 不一樣就會重新載入圖片 hash
filename: '[path][name].[ext]?[hash:8]',
},
use: {
loader: 'image-webpack-loader',
options: {
mozjpeg: {
progressive: true,
options: 65
},
// optipng.enabled: false will disable optipng
optipng: {
enabled: false,
},
pngquant: {
quality: [0.65, 0.90],
speed: 4
},
gifsicle: {
interlaced: false,
},
// the webp option will enable WEBP
webp: {
quality: 75
}
}
},
}
]
}
}
又報錯 QAQ 到 webpack 官網看好像要用另外一個
ImageMinimizerWebpackPlugin (opens new window)
npm install image-minimizer-webpack-plugin imagemin --save-dev
# imagemin plugin 用到就需要安裝
npm install image-minimizer-webpack-plugin @squoosh/lib --save-dev
npm install image-minimizer-webpack-plugin sharp --save-dev
npm install image-minimizer-webpack-plugin svgo --save-dev
# 優化 imagemin
npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng
imagemin-svgo --save-dev
npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-dev
# 反正官網有什麼就裝上去
npm install @squoosh/lib --save-dev
npm install sharp --save-dev
npm install svgo --save-dev
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
一直引入失敗QAQ,下次再弄ㄅ
# copy-webpack-plugin
當檔案不需用到 loader 編譯時,只需要從起始資料夾搬到 dist 資料夾內
npm i copy-webpack-plugin -D
webpack.config.js
const CopyPlugin = require("copy-webpack-plugin");
module.exports = {
plugins: [
new MiniCssExtractPlugin({filename: "css/[name].css"}),
new CopyPlugin({
patterns: [
{ from: "assets", to: "assets" },
],
}),
],
}
新增 assets folder 新增一個 1.txt (內容隨便打)
npm run deploy
部署完畢後可以發現 1.txt 被搬到 assets 裡面
裡面可以放:zip, mp3, 字型檔...等等
但如果在 assets 放入字型檔,在 scss 引入的話會報錯,需在 webpack 內加入規則,放在 scss, css 上面
module.exports = {
resolve: {
modules: [
// resolve 加入 assets 資料夾
path.resolve('src/assets'),
]
},
module: {
rules: [
{
test: /\ (woff|woff2|ttf|eot)$/,
loader: 'file-loader',
options: {
name: '[path][name].[ext]?[hash:8]'
}
},
// ...css
]
}
}
# html-webpack-plugin
用 webpack 管理 html, js
npm i html-webpack-plugin -D
新增一個 html folder 把 index.html 放到資料夾內,把裡面的東西全部刪除
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
webpack.config.js
var HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
plugins: [
new HtmlWebpackPlugin({
title: 'Html 的 title',
// 輸出後的名字
filename: 'index.html',
template: './src/html/index.html',
viewport: 'width=device-width, initial-scale=1.0',
// entry 的 js
chunks: ['index'],
// 在 body 注入,不使用這個會注入在 head
inject: 'body',
})
]
}
在 index.js 把 import index.html 刪除
在 webpack.config.js rules 將 html 拿掉
{
test: /\.html$/i,
use:[
{
loader: "file-loader",
options: {
name: '[path][name].[ext]'
}
}
]
},
npm run dev
打開環境後將開發者工具打開,會發現會自動引入 index.js 檔案,但沒有 meta 設定檔,感覺像是 devServer 在邊的 error 先暫停下QAQ