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