摘要:代碼如下所示按照正常使用習(xí)慣,操作來(lái)實(shí)現(xiàn)樣式的添加和卸載,是一貫技術(shù)手段。將幫助我們進(jìn)行操作。
繼 24 個(gè)實(shí)例入門(mén)并掌握「Webpack4」(一) 后續(xù):
JS Tree Shaking
CSS Tree Shaking
圖片處理匯總
字體文件處理
處理第三方 js 庫(kù)
開(kāi)發(fā)模式與 webpack-dev-server
開(kāi)發(fā)模式和生產(chǎn)模式?實(shí)戰(zhàn)
打包自定義函數(shù)庫(kù)
九、JS Tree Shakingdemo9 源碼地址
什么是 Tree Shaking?
字面意思是搖樹(shù),項(xiàng)目中沒(méi)有使用的代碼會(huì)在打包的時(shí)候丟掉。JS 的 Tree Shaking 依賴(lài)的是 ES6 的模塊系統(tǒng)(比如:import 和 export)
項(xiàng)目目錄如下:
在 util.js 文件中寫(xiě)入測(cè)試代碼
// util.js export function a() { return "this is function "a"" } export function b() { return "this is function "b"" } export function c() { return "this is function "c"" }
在 app.js 中引用 util.js 的 function a() 函數(shù),按需引入:
// app.js import { a } from "./vendor/util" console.log(a())
命令行運(yùn)行 webpack 打包后,打開(kāi)打包后生成的 /dist/app.bundle.js 文件。查找我們 a() 函數(shù)輸出的字符串,如下圖所示:
如果將查找內(nèi)容換成 this is function "c" 或者 this is function "b", 并沒(méi)有相關(guān)查找結(jié)果。說(shuō)明 JS Tree Shaking 成功。
1. 如何處理第三方 JS 庫(kù)?
對(duì)于經(jīng)常使用的第三方庫(kù)(例如 jQuery、lodash 等等),如何實(shí)現(xiàn) Tree Shaking ?
下面以 lodash.js 為例,進(jìn)行介紹。
安裝 lodash.js : npm install lodash --save
在 app.js 中引用 lodash.js 的一個(gè)函數(shù):
// app.js import { chunk } from "lodash" console.log(chunk([1, 2, 3], 2))
命令行打包。如下圖所示,打包后大小是 70kb。顯然,只引用了一個(gè)函數(shù),不應(yīng)該這么大。并沒(méi)有進(jìn)行 Tree Shaking。
開(kāi)頭講過(guò),js tree shaking 利用的是 ES 的模塊系統(tǒng)。而 lodash.js 使用的是 CommonJS 而不是ES6 的寫(xiě)法。所以,安裝對(duì)應(yīng)的模塊系統(tǒng)即可。
安裝 lodash.js 的 ES 寫(xiě)法的版本:npm install lodash-es --save
修改一下 app.js:
// app.js import { chunk } from "lodash-es" console.log(chunk([1, 2, 3], 2))
再次打包,打包結(jié)果只有 3.5KB(如下圖所示)。顯然,tree shaking 成功。
在一些對(duì)加載速度敏感的項(xiàng)目中使用第三方庫(kù),請(qǐng)注意庫(kù)的寫(xiě)法是否符合 ES 模板系統(tǒng)規(guī)范,以方便 webpack 進(jìn)行 tree shaking。十、CSS Tree Shaking
demo10 源碼地址
CSS Tree Shaking 并不像 JS Tree Shaking 那樣方便理解,首先要模擬一個(gè)真實(shí)的項(xiàng)目環(huán)境,來(lái)體現(xiàn) CSS 的 Tree Shaking 的配置和效果。
此章節(jié)源碼基于第八節(jié)處理 CSS 項(xiàng)目上做修改
我們首先編寫(xiě) /src/css/base.css 樣式文件,在文件中,我們編寫(xiě)了 3 個(gè)樣式類(lèi)。但在代碼中,我們只會(huì)使用 .box 和 .box--big 這兩個(gè)類(lèi)。代碼如下所示:
/* base.css */ html { background: red; } .box { height: 200px; width: 200px; border-radius: 3px; background: green; } .box--big { height: 300px; width: 300px; border-radius: 5px; background: red; } .box-small { height: 100px; width: 100px; border-radius: 2px; background: yellow; }
按照正常使用習(xí)慣,DOM 操作來(lái)實(shí)現(xiàn)樣式的添加和卸載,是一貫技術(shù)手段。所以,入口文件 /src/app.js 中創(chuàng)建了一個(gè) 最后,為了讓環(huán)境更接近實(shí)際環(huán)境,我們?cè)?index.html 的一個(gè)標(biāo)簽,也引用了定義好的 box-big 樣式類(lèi)。 PurifyCSS將幫助我們進(jìn)行 CSS Tree Shaking 操作。為了能準(zhǔn)確指明要進(jìn)行 Tree Shaking 的 CSS 文件,還有 glob-all (另一個(gè)第三方庫(kù))。 glob-all 的作用就是幫助 PurifyCSS 進(jìn)行路徑處理,定位要做 Tree Shaking 的路徑文件。 安裝依賴(lài): 更改配置文件: 打包完查看 dist/app.css 文件 在 index.html 和 src/app.js 中引用的樣式都被打包了,而沒(méi)有被使用的樣式類(lèi)–box-small,沒(méi)有被打包進(jìn)去 demo11 源碼地址 目錄結(jié)構(gòu): webpack4 中的圖片常用的基礎(chǔ)操作: 圖片處理和 Base64 編碼 圖片壓縮 合成雪碧圖 如項(xiàng)目代碼目錄展示的那樣,除了常見(jiàn)的 app.js 作為入口文件,我們將用到的 3 張圖片放在 /src/assets/imgs/ 目錄下,并在樣式文件 base.css 中引用這些圖片。 剩下的內(nèi)容交給 webpack 打包處理即可。樣式文件和入口 app.js 文件的代碼分別如下所示: 在 app.js 中 安裝依賴(lài): 在 webpack.config.js 中的 module.rules 選項(xiàng)中進(jìn)行配置,以實(shí)現(xiàn)讓 loader 識(shí)別圖片后綴名,并且進(jìn)行指定的處理操作。 完整的配置文件 打包項(xiàng)目,查看打包結(jié)果,并在瀏覽器中打開(kāi) index.html 文件 可以看到除了 1.jpg,另外兩張圖片已經(jīng)被打包成 base64 格式,在 app.css 文件中 1.jpg 這個(gè)文件超過(guò)我們?cè)?url-loader 選項(xiàng)中設(shè)置的 limit 值,所以被多帶帶打包 這就是利用了 file-loader 的能力,如果在 url-loader 中設(shè)置了 limit 的值,卻沒(méi)有安裝 file-loader 依賴(lài),會(huì)怎么樣?來(lái)試試看,首先卸載 file-loader 依賴(lài),npm uninstall file-loader,再運(yùn)行打包命令,npm run build url-loader 會(huì)將引入的圖片編碼,轉(zhuǎn)為 base64 字符串。再把這串字符打包到文件中,最終只需要引入這個(gè)文件就能訪(fǎng)問(wèn)圖片了,節(jié)省了圖片請(qǐng)求。 但是,如果圖片較大,編碼會(huì)消耗性能。因此 url-loader 提供了一個(gè) limit 參數(shù),小于 limit 字節(jié)的文件會(huì)被轉(zhuǎn)為 base64,大于 limit 的使用 file-loader 進(jìn)行處理,多帶帶打包。 url-loader 依賴(lài) file-loader,url-loader 可以看作是增強(qiáng)版的 file-loader 圖片壓縮需要使用 img-loader 插件,除此之外,針對(duì)不同的圖片類(lèi)型,還要引用不同的插件。比如,我們項(xiàng)目中使用的是 png 圖片,因此,需要引入 imagemin-pngquant,并且指定壓縮率。壓縮 jpg/jpeg 圖片為 imagemin-mozjpeg 插件 安裝依賴(lài) 在之前的配置上更改: 更改為: 打包結(jié)果: 原因在 png 圖片上,jpg 圖片可以壓縮,但是去 imagemin-pngquant github 上也沒(méi)發(fā)現(xiàn)有人提出類(lèi)似 issue ,百度、google 找了半天,還是沒(méi)發(fā)現(xiàn)怎么解決
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110208.html// app.js
import base from "./css/base.css"
// 給 app 標(biāo)簽再加一個(gè) div 并且類(lèi)名為 box
var app = document.getElementById("app")
var div = document.createElement("div")
div.className = "box"
app.appendChild(div)
npm i glob-all purify-css purifycss-webpack --save-dev
const path = require("path")
const CleanWebpackPlugin = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin") // 將 css 多帶帶打包成文件
const PurifyCSS = require("purifycss-webpack")
const glob = require("glob-all")
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: "./", // js 引用的路徑或者 CDN 地址
path: path.resolve(__dirname, "dist"), // 打包文件的輸出目錄
filename: "[name].bundle.js", // 代碼打包后的文件名
chunkFilename: "[name].js" // 代碼拆分后的文件名
},
module: {
rules: [
{
test: /.css$/, // 針對(duì) .scss 或者 .css 后綴的文件設(shè)置 loader
use: [
{
loader: MiniCssExtractPlugin.loader
},
"css-loader"
]
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
// 打包輸出HTML
title: "自動(dòng)生成 HTML",
minify: {
// 壓縮 HTML 文件
removeComments: true, // 移除 HTML 中的注釋
collapseWhitespace: true, // 刪除空白符與換行符
minifyCSS: true // 壓縮內(nèi)聯(lián) css
},
filename: "index.html", // 生成后的文件名
template: "index.html", // 根據(jù)此模版生成 HTML 文件
chunks: ["app"] // entry中的 app 入口才會(huì)被打包
}),
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[id].css"
}),
// 清除無(wú)用 css
new PurifyCSS({
paths: glob.sync([
// 要做 CSS Tree Shaking 的路徑文件
path.resolve(__dirname, "./*.html"), // 請(qǐng)注意,我們同樣需要對(duì) html 文件進(jìn)行 tree shaking
path.resolve(__dirname, "./src/*.js")
])
})
]
}
/* base.css */
*,
body {
margin: 0;
padding: 0;
}
.box {
height: 400px;
width: 400px;
border: 5px solid #000;
color: #000;
}
.box div {
width: 100px;
height: 100px;
float: left;
}
.box .ani1 {
background: url("./../assets/imgs/1.jpg") no-repeat;
}
.box .ani2 {
background: url("./../assets/imgs/2.png") no-repeat;
}
.box .ani3 {
background: url("./../assets/imgs/3.png") no-repeat;
}
import "./css/base.css"
npm install url-loader file-loader --save-dev
(二) 圖片處理和 base64 編碼
module.exports = {
module: {
rules: [
{
test: /.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
outputPath: "images/", //輸出到 images 文件夾
limit: 20000 //把小于 20kb 的文件轉(zhuǎn)成 Base64 的格式
}
}
]
}
]
}
}
const path = require("path")
const CleanWebpackPlugin = require("clean-webpack-plugin")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin") // 將 css 多帶帶打包成文件
module.exports = {
entry: {
app: "./src/app.js"
},
output: {
publicPath: "./", // js 引用的路徑或者 CDN 地址
path: path.resolve(__dirname, "dist"), // 打包文件的輸出目錄
filename: "[name].bundle.js", // 代碼打包后的文件名
chunkFilename: "[name].js" // 代碼拆分后的文件名
},
module: {
rules: [
{
test: /.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader
},
"css-loader"
]
},
{
test: /.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
outputPath: "images/", //輸出到 images 文件夾
limit: 20000 //把小于 20kb 的文件轉(zhuǎn)成 Base64 的格式
}
}
]
}
]
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
// 打包輸出HTML
title: "自動(dòng)生成 HTML",
minify: {
// 壓縮 HTML 文件
removeComments: true, // 移除 HTML 中的注釋
collapseWhitespace: true, // 刪除空白符與換行符
minifyCSS: true // 壓縮內(nèi)聯(lián) css
},
filename: "index.html", // 生成后的文件名
template: "index.html", // 根據(jù)此模版生成 HTML 文件
chunks: ["app"] // entry中的 app 入口才會(huì)被打包
}),
new MiniCssExtractPlugin({
filename: "[name].css",
chunkFilename: "[id].css"
})
]
}
如果圖片較多,會(huì)發(fā)很多 http 請(qǐng)求,會(huì)降低頁(yè)面性能。
這里有個(gè) bug,可以先不急著操作,先把這一小節(jié)看完,再?zèng)Q定??!
npm i img-loader imagemin imagemin-pngquant imagemin-mozjpeg --save-dev
{
test: /.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
outputPath: "images/", // 輸出到 images 文件夾
limit: 20000 //把小于 20kb 的文件轉(zhuǎn)成 Base64 的格式
}
}
]
}
{
test: /.(png|jpg|jpeg|gif)$/,
use: [
{
loader: "url-loader",
options: {
name: "[name]-[hash:5].min.[ext]",
limit: 1000, // size <= 1KB
outputPath: "images/"
}
},
// img-loader for zip img
{
loader: "img-loader",
options: {
plugins: [
require("imagemin-pngquant")({
quality: "80" // the quality of zip
}),
require("imagemin-mozjpeg")({
quality: "80"
})
]
}
}
]
}
摘要:前言此項(xiàng)目總共小節(jié),目錄搭建項(xiàng)目并打包文件生產(chǎn)和開(kāi)發(fā)模式覆蓋默認(rèn)用轉(zhuǎn)譯自動(dòng)生成文件處理文件圖片處理匯總處理第三方庫(kù)開(kāi)發(fā)模式與開(kāi)發(fā)模式和生產(chǎn)模式實(shí)戰(zhàn)打包自定義函數(shù)庫(kù)配置配置配置使用加快打包速度多頁(yè)面打包配置編寫(xiě)編寫(xiě)編寫(xiě)前節(jié)基于漸進(jìn)式教程為 前言 此項(xiàng)目總共 24 小節(jié),目錄: 搭建項(xiàng)目并打包 JS 文件 生產(chǎn)和開(kāi)發(fā)模式 覆蓋默認(rèn) entry/output 用 Babel 7 轉(zhuǎn)譯 ES...
摘要:繼個(gè)實(shí)例入門(mén)并掌握二后續(xù)配置配置配置使用加快打包速度多頁(yè)面打包配置編寫(xiě)編寫(xiě)編寫(xiě)十七配置源碼地址本節(jié)使用的代碼為基礎(chǔ)我們來(lái)模擬平時(shí)開(kāi)發(fā)中,將打包完的代碼防止到服務(wù)器上的操作,首先打包代碼然后安裝一個(gè)插件在中配置一個(gè)命令運(yùn) 繼 24 個(gè)實(shí)例入門(mén)并掌握「Webpack4」(二) 后續(xù): PWA 配置 TypeScript 配置 Eslint 配置 使用 DLLPlugin 加快打包速度 多...
摘要:介紹背景最近和部門(mén)老大,一起在研究團(tuán)隊(duì)前端新手村的建設(shè),目的在于幫助新人快速了解和融入公司團(tuán)隊(duì),幫助零基礎(chǔ)新人學(xué)習(xí)和入門(mén)前端開(kāi)發(fā)并且達(dá)到公司業(yè)務(wù)開(kāi)發(fā)水平。 showImg(https://segmentfault.com/img/remote/1460000020063710?w=1300&h=646); 介紹 1. 背景 最近和部門(mén)老大,一起在研究團(tuán)隊(duì)【EFT - 前端新手村】的建設(shè)...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
閱讀 3028·2023-04-25 18:00
閱讀 2237·2021-11-23 10:07
閱讀 4081·2021-11-22 09:34
閱讀 1256·2021-10-08 10:05
閱讀 1578·2019-08-30 15:55
閱讀 3449·2019-08-30 11:21
閱讀 3352·2019-08-29 13:01
閱讀 1391·2019-08-26 18:26