Vue2中項(xiàng)目打包優(yōu)化的方法詳解
前言
之前的開(kāi)發(fā)工作中對(duì)vue2項(xiàng)目也有做過(guò)不同的優(yōu)化,但是都比較零散且沒(méi)有系統(tǒng)化的記錄下來(lái)。
正好最近接手了一個(gè)老項(xiàng)目,雖然項(xiàng)目不大性能也還過(guò)得去,但是我覺(jué)得可優(yōu)化的空間還是比較多的。
所以也趁此機(jī)會(huì)能把vue打包,編譯,啟動(dòng)時(shí)間的一些優(yōu)化方法記錄下。在閱讀之前你需要確保以下幾點(diǎn):
- 本項(xiàng)目是基于vue2.x + vue-cli4.x的,不適用于vue3.x+vite項(xiàng)目
- 本文一些配置的寫(xiě)法可能因插件或者loader版本差異不同而報(bào)錯(cuò),如出現(xiàn)錯(cuò)誤,請(qǐng)查閱官方文檔最新配置信息
- 文章不會(huì)一次性把全部配置代碼貼出來(lái),目的是為了讓讀者們能夠真正熟悉每一項(xiàng)優(yōu)化配置
- 文章介紹了多種優(yōu)化方式,希望讀者不要全部照抄,而是應(yīng)該根據(jù)自己項(xiàng)目和實(shí)際情況進(jìn)行選擇配置。沒(méi)有最完美的配置,只有最適合自己的配置~
好了,閑話不多說(shuō)了。在開(kāi)始之前我們先看下打包體積大小和時(shí)間,這樣有利于我們優(yōu)化后進(jìn)行對(duì)比。
優(yōu)化前
1. 打包體積:6.38M

2. 冷啟動(dòng)耗費(fèi)時(shí)間:61.39秒

3. 編譯耗費(fèi)時(shí)間:50.13秒

準(zhǔn)備工作
1. 安裝speed-measure-webpack-plugin
npm i speed-measure-webpack-plugin
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
module.exports = {
configureWebpack: {
plugins: [
new BundleAnalyzerPlugin(),
new SpeedMeasurePlugin(),
]
}
};2. 安裝webpack-bundle-analyzer
npm i webpack-bundle-analyzer
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
configureWebpack: {
plugins: [
+ new BundleAnalyzerPlugin(),
new SpeedMeasurePlugin(),
]
}
};
一、減少打包代碼體積
1. 使用externals和CDN
externals允許我們?cè)诰幾g過(guò)程中排除那些已經(jīng)在運(yùn)行時(shí)環(huán)境存在的全局變量或CDN加載的庫(kù),而不是將它們包含在最終的bundle文件內(nèi)。
當(dāng)配置了externals字段后,Webpack會(huì)在生成的bundle中引用這些全局變量,而不是把它們實(shí)際打包進(jìn)去。這樣做的好處有:
(1)減小bundle體積:如果你的應(yīng)用依賴了一些大型第三方庫(kù)(如jQuery、Vue自身、React、大型UI框架等),并且你確定用戶在訪問(wèn)你的應(yīng)用時(shí)已經(jīng)通過(guò)其他方式(比如在HTML頭部引入CDN鏈接)加載了這些庫(kù),那么就沒(méi)有必要在每個(gè)用戶的請(qǐng)求中重復(fù)加載這些庫(kù)。
(2)加快頁(yè)面加載速度:由于第三方庫(kù)直接從CDN加載,通常情況下CDN會(huì)提供更快的加載速度和更好的緩存機(jī)制。
externals缺點(diǎn):直接在html內(nèi)引入的,失去了按需引入的功能,只能引入組件庫(kù)完整的js和css
// vue.config.js
configureWebpack: {
// provide the app's title in webpack's name field, so that
// it can be accessed in index.html to inject the correct title.
name,
resolve: {
alias: {
'@': resolve('src'),
},
},
externals: {
axios: 'axios',
'vue-router': 'VueRouter',
'vue': 'Vue',
'Vuex': 'Vuex',
'element-ui': 'ELEMENT',
}
}// index.html
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.18.1/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script src="https://unpkg.com/vuex@3.1.0/dist/vuex.global.js"></script>
<script src="https://unpkg.com/vue-router@3.0.6/dist/vue-router.js"></script>
<script src="https://unpkg.com/element-ui@2.15.12/lib/index.js"></script>2. 圖片壓縮
使用image-webpack-loader
npm i image-webpack-loader
chainWebpack: config => {
config.module
.rule('images')
.test(/.(png|jpe?g|gif|svg)(?.*)?$/)
.use('image-webpack-loader')
.loader('image-webpack-loader')
.options({
bypassOnDebug: true })
.end()
},
在安裝image-webpack-loader會(huì)遇到一個(gè)大坑就是安裝失敗,如果安裝或者使用過(guò)程中遇到錯(cuò)誤請(qǐng)嘗試以下步驟解決
1.刪除: npm uninstall image-webpack-loader
2.使用cnpm重新安裝:cnpm install image-webpack-loader
兩種方式對(duì)比
壓縮網(wǎng)站:一個(gè)從600KB壓縮到了144KB,一個(gè)從98KB壓縮到了18KB

image-webpack-loader插件: 一個(gè)從600KB壓縮到了148KB,一個(gè)從98KB壓縮到了10KB

3.啟用gzip壓縮
在Vue.js項(xiàng)目中開(kāi)啟Gzip壓縮是一種常見(jiàn)的性能優(yōu)化手段,它能夠顯著減小靜態(tài)資源(如JavaScript、CSS和HTML文件)在網(wǎng)絡(luò)傳輸過(guò)程中的大小,從而提高頁(yè)面加載速度。
線上的項(xiàng)目,一般都會(huì)結(jié)合構(gòu)建工具 webpack 插件或服務(wù)端配置 nginx,來(lái)實(shí)現(xiàn) http 傳輸?shù)?gzip 壓縮,目的就是把服務(wù)端響應(yīng)文件的體積盡量減小,優(yōu)化返回速度。html、js、css資源,使用 gzip 后通??梢詫Ⅲw積壓縮70%以上
const CompressionWebpackPlugin = require("compression-webpack-plugin");
chainWebpack: config => {
// 生產(chǎn)環(huán)境,開(kāi)啟js\css壓縮
if (process.env.NODE_ENV === "production") {
config.plugin("compressionPlugin").use(
new CompressionWebpackPlugin({
test: /.(js|css|less)$/, // 匹配文件名
threshold: 10240, // 對(duì)超過(guò)10k的數(shù)據(jù)壓縮
minRatio: 0.8,
deleteOriginalAssets: true // 刪除源文件
})
);
}
}
服務(wù)器配置: Gzip壓縮后的文件需要服務(wù)器支持并正確返回給客戶端。對(duì)于Nginx服務(wù)器,你需要在Nginx的配置文件中添加如下內(nèi)容以啟用Gzip:
//nginx.conf
http {
gzip on;
gzip_vary on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}4.uglyifyjs
打包后的 JavaScript 代碼進(jìn)行混淆壓縮,從而減少文件大小以優(yōu)化網(wǎng)頁(yè)加載速度。這個(gè)插件基于 UglifyJS 庫(kù),可以執(zhí)行多種優(yōu)化操作,包括但不限于刪除無(wú)用代碼、簡(jiǎn)化變量名、內(nèi)聯(lián)函數(shù)調(diào)用等。
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
config.plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
compress: {
drop_debugger: true,//生產(chǎn)環(huán)境自動(dòng)刪除debugger
drop_console: true, //生產(chǎn)環(huán)境自動(dòng)刪除console
},
warnings: false,
},
sourceMap: false, //關(guān)掉sourcemap 會(huì)生成對(duì)于調(diào)試的完整的.map文件,但同時(shí)也會(huì)減慢打包速度
parallel: true, //使用多進(jìn)程并行運(yùn)行來(lái)提高構(gòu)建速度。默認(rèn)并發(fā)運(yùn)行數(shù):os.cpus().length - 1。
}),
5.路由懶加載
Vue.js 中的路由懶加載是一種優(yōu)化技術(shù),它允許我們?cè)谟脩魧?dǎo)航到特定路由時(shí)異步加載對(duì)應(yīng)的組件,而不是在應(yīng)用程序啟動(dòng)時(shí)一次性加載所有組件。這樣可以顯著減少初始加載時(shí)間、減小打包后的文件體積,并提升用戶體驗(yàn)。
// 使用 `import()` 動(dòng)態(tài)導(dǎo)入
// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [
{ path: '/about', component: () => import('@/views/About.vue'), // 懶加載 About 組件 },
{ path: '/contact', component: () => import(/* webpackChunkName: "contact" */ '@/views/Contact.vue'), // 命名代碼塊
},
],
})// 使用異步組件聲明
// router/index.js
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router({
routes: [ {
path: '/example',
component: {
// 使用異步組件定義
async component() {
const { default: ExampleComponent } = await import('@/views/Example.vue');
return ExampleComponent;
},
},
},
// 其他路由...
],
})這兩種方式都可以確保當(dāng)用戶首次訪問(wèn)相應(yīng)路由時(shí),Vue Router 才會(huì)去加載對(duì)應(yīng)的組件資源。這樣不僅提高了應(yīng)用的響應(yīng)速度,也降低了初次加載時(shí)對(duì)網(wǎng)絡(luò)帶寬的需求。
6. preload預(yù)加載
瀏覽器自己提供的一種機(jī)制,在頁(yè)面加載的時(shí)候,預(yù)先請(qǐng)求資源,一邊在需要的時(shí)候可以更快的獲取這些資源。
也就是設(shè)置文件中的黑名單,配置文件,添加一個(gè)數(shù)組,用來(lái)儲(chǔ)存黑名
npm install --save-dev script-ext-html-webpack-plugin
const blackList = ['script1.js', 'script2.js'];
plugins: [
new ScriptExtHtmlWebpackPlugin({
preload: {
test: /.js$/,
excludeChunks: blackList
}
})
]
// 刪除文件中各個(gè)腳本都在使用的腳本命令,然后統(tǒng)一在html頁(yè)面中進(jìn)行封裝,需要用到的時(shí)候,去html頁(yè)面中進(jìn)行獲取,這樣就可以減少http的請(qǐng)求
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [{ // `runtime` must same as runtimeChunk name. default is `runtime` inline: /runtime\..*\.js$/, }, ])
.end();7. DllPlugin 動(dòng)態(tài)鏈接庫(kù)
DllPlugin 與 externals 的作用相似,都是將依賴抽離出去,節(jié)約打包時(shí)間。區(qū)別是 DllPlugin 是將依賴單獨(dú)打包,這樣以后每次只構(gòu)建業(yè)務(wù)代碼,而 externals 是將依賴轉(zhuǎn)化為 CDN 的方式引入
當(dāng)公司沒(méi)有很好的 CDN 資源或不支持 CDN 時(shí),就可以考慮使用 DllPlugin ,替換掉 externals
//1. 創(chuàng)建 dll.config.js 配置文件
import { DllPlugin } from "webpack";
export default {
// 需要抽離的依賴
entry: {
vendor: ["vue", "vue-router", "axios", "echarts"]
},
mode: "production",
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
chunks: "all",
name: "vendor",
test: /node_modules/
}
}
}
},
output: {
filename: "[name].dll.js", // 輸出路徑和文件名稱(chēng)
library: "[name]", // 全局變量名稱(chēng):其他模塊會(huì)從此變量上獲取里面模塊
path: AbsPath("dist/static") // 輸出目錄路徑
},
plugins: [
new DllPlugin({
name: "[name]", // 全局變量名稱(chēng):減小搜索范圍,與output.library結(jié)合使用
path: AbsPath("dist/static/[name]-manifest.json") // 輸出目錄路徑
})
]
};
// package.json 配置腳本 "build:dll": "webpack --config ./dll.config.js",
// 使用 `DllReferencePlugin` 將打包生成的dll文件,引用到需要的預(yù)編譯的依賴上來(lái),并通過(guò) `html-webpack-tags-plugin` 在打包時(shí)自動(dòng)插入dll文件
// vue.config.js 配置如下
import { DllReferencePlugin } from "webpack";
import HtmlTagsPlugin from "html-webpack-tags-plugin";
export default {
configureWebpack: {
plugins: [
new DllReferencePlugin({
manifest: AbsPath("dist/static/vendor-manifest.json") // manifest文件路徑
}),
new HtmlTagsPlugin({
append: false, // 在生成資源后插入
publicPath: "/", // 使用公共路徑
tags: ["static/vendor.dll.js"] // 資源路徑
})
]
}
};先運(yùn)行 npm run build:dll 打包生成依賴文件,以后只用運(yùn)行 npm run build 構(gòu)建業(yè)務(wù)代碼即可
8. 處理Moment中語(yǔ)言包
一般如果項(xiàng)目引入了moment.js或者引入的某個(gè)第三方插件包使用了moment.js, 通常情況下,會(huì)全部引入了所有語(yǔ)言包,體積過(guò)大,我們需要對(duì)其進(jìn)行處理。
configureWebpack: config => {
config.plugins.push(new webpack.ContextReplacementPlugin(/moment[/\]locale$/, /zh-cn/))
}
9. 使用dayjs代替momentjs
Day.js 和 Moment.js 是 JavaScript 中兩個(gè)非常流行的時(shí)間日期處理庫(kù),它們具有相似的API設(shè)計(jì)和功能特性,但又存在一些關(guān)鍵的區(qū)別:
Moment.js:
- 功能全面:Moment.js 提供了豐富的日期時(shí)間操作功能,包括解析、格式化、比較、計(jì)算(加減日期)、時(shí)區(qū)轉(zhuǎn)換等。
- 體積較大:Moment.js 的大小相對(duì)較大,尤其是包含所有功能的情況下。在資源優(yōu)化方面可能存在劣勢(shì),特別是在移動(dòng)應(yīng)用或?qū)虞d速度有嚴(yán)格要求的項(xiàng)目中。
- 國(guó)際化支持:Moment.js 提供強(qiáng)大的國(guó)際化支持,可以方便地處理不同語(yǔ)言環(huán)境下的日期格式和顯示問(wèn)題。
Day.js:
- 輕量級(jí):Day.js 設(shè)計(jì)初衷是為了提供一個(gè)與 Moment.js API 兼容但更輕量的替代方案,其體積比 Moment.js 小得多,有助于減少打包后的文件大小,提高頁(yè)面加載速度。
- 性能優(yōu)化:由于其輕量化的設(shè)計(jì),Day.js 在性能上通常會(huì)優(yōu)于 Moment.js,尤其是在內(nèi)存占用和執(zhí)行效率方面。
- 同樣全面的功能:盡管 Day.js 更輕巧,但它仍然提供了大部分 Moment.js 的核心功能,如解析、格式化、比較等操作,并且也支持插件擴(kuò)展以實(shí)現(xiàn)更多功能。
- 國(guó)際化支持:同樣,Day.js 也具備良好的國(guó)際化支持,通過(guò)引入相應(yīng)的語(yǔ)言包即可實(shí)現(xiàn)多種語(yǔ)言環(huán)境下的日期處理。
總結(jié)起來(lái),如果你需要一個(gè)功能強(qiáng)大、歷史悠久且廣泛使用的日期庫(kù),Moment.js 是一個(gè)很好的選擇。然而,如果對(duì)代碼大小和性能有較高要求,或者只是進(jìn)行基礎(chǔ)的日期時(shí)間操作,Day.js 可能更適合你的項(xiàng)目需求。隨著技術(shù)的發(fā)展,越來(lái)越多的新項(xiàng)目可能會(huì)傾向于使用 Day.js 這種更為現(xiàn)代和輕量的解決方案。
10. splitChunks單獨(dú)打包第三方包
項(xiàng)目中的第三方庫(kù)默認(rèn)會(huì)被打包到一個(gè)文件名含vendors的bundle中,如果你的項(xiàng)目里面引用的第三方庫(kù)過(guò)多,那么你的vendors就會(huì)很臃腫,文件也會(huì)變大,網(wǎng)站加載該文件的時(shí)候就越耗時(shí),從而影響網(wǎng)站性能。
這個(gè)時(shí)候我們可以考慮把一些比較大的第一方庫(kù)從vendors中分離出來(lái),或者直接配置cdn。這里我們主要來(lái)講如何在vue-cli4中單獨(dú)打包第三方庫(kù)文件從而實(shí)現(xiàn)bundle分割,減小vendors文件體積的目的。
常用參數(shù):
- - minSize(默認(rèn)是30000):形成一個(gè)新代碼塊最小的體積
- - minChunks(默認(rèn)是1):在分割之前,這個(gè)代碼塊最小應(yīng)該被引用的次數(shù)(譯注:保證代碼塊復(fù)用性,默認(rèn)配置的策略是不需要多次引用也可以被分割)
- - maxInitialRequests(默認(rèn)是3):一個(gè)入口最大的并行請(qǐng)求數(shù)
- - maxAsyncRequests(默認(rèn)是5):按需加載時(shí)候最大的并行請(qǐng)求數(shù)。
- - chunks (默認(rèn)是async) :initial、async和all
- - test: 用于控制哪些模塊被這個(gè)緩存組匹配到。原封不動(dòng)傳遞出去的話,它默認(rèn)會(huì)選擇所有的模塊??梢詡鬟f的值類(lèi)型:RegExp、String和Function
- - name(打包的chunks的名字):字符串或者函數(shù)(函數(shù)可以根據(jù)條件自定義名字)
- - priority :緩存組打包的先后優(yōu)先級(jí)。
module.exports = {
configureWebpack: config => {
if (progress.env.NODE_ENV === 'production') {
config.optimization = {
splitChunks: {
cacheGroups: {
common: {
name: "chunk-common",
chunks: "initial",
minChunks: 2,
maxInitialRequests: 5,
minSize: 0,
priority: 1,
reuseExistingChunk: true,
enforce: true
},
vendors: {
name: "chunk-vendors",
test: /[\\/]node_modules[\\/]/,
chunks: "initial",
priority: 2,
reuseExistingChunk: true,
enforce: true
},
elementUI: {
name: "chunk-hui",
test: /[\\/]node_modules[\\/]hui[\\/]/,
chunks: "all",
priority: 3,
reuseExistingChunk: true,
enforce: true
},
echarts: {
name: "chunk-echarts",
test: /[\\/]node_modules[\\/](vue-)?echarts[\\/]/,
chunks: "all",
priority: 4,
reuseExistingChunk: true,
enforce: true
}
}
}
};
}
},
chainWebpack: config => {
if (progress.env.NODE_ENV === 'production') {
config.optimization.delete("splitChunks");
}
return config;
}
};
11.production環(huán)境不生成SourceMap
module.exports = {
lintOnSave: false,
productionSourceMap: process.env.NODE_ENV !== "production", //打包不生成map文件
}
12. 添加別名 alias
通常項(xiàng)目較大的時(shí)候我們會(huì)引入別名來(lái)方便引入,添加別名方法如下:
module.exports = {
chainWebpack: config => { // 添加別名
config.resolve.alias
.set("vue$", "vue/dist/vue.esm.js")
.set("@", resolve("src"))
.set("@assets", resolve("src/assets"))
.set("@scss", resolve("src/assets/scss"))
.set("@components", resolve("src/components"))
.set("@plugins", resolve("src/plugins"))
.set("@views", resolve("src/views"))
.set("@router", resolve("src/router"))
.set("@store", resolve("src/store"))
.set("@layouts", resolve("src/layouts"))
.set("@static", resolve("src/static"));
}
};二、編譯時(shí)間提升
1. 緩存 hard-source-webpack-plugin
npm i hard-source-webpack-plugin
const HardSourceWebpackPlugin = require("hard-source-webpack-plugin")
plugins: [
new BundleAnalyzerPlugin(),
new SpeedMeasurePlugin(),
new HardSourceWebpackPlugin()
],
//提升第二次運(yùn)行時(shí)間
2. Happywebpack
由于運(yùn)行在 Node.js 之上的 webpack 是單線程模型的,我們需要 webpack 能同一時(shí)間處理多個(gè)任務(wù),發(fā)揮多核 CPU 電腦的威力
HappyPack 就能實(shí)現(xiàn)多線程打包,它把任務(wù)分解給多個(gè)子進(jìn)程去并發(fā)的執(zhí)行,子進(jìn)程處理完后再把結(jié)果發(fā)送給主進(jìn)程,來(lái)提升打包速度
npm install HappyPack -D
const HappyPack = require('happypack');
const os = require('os');
// 開(kāi)辟一個(gè)線程池,拿到系統(tǒng)CPU的核數(shù),happypack 將編譯工作利用所有線程
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
module.exports = {
configureWebpack: {
plugins: [
new HappyPack({
id: 'happybabel',
loaders: ['babel-loader'],
threadPool: happyThreadPool
})
]
}
}
注意:
1.由于測(cè)試項(xiàng)目較小,打包時(shí)間縮短的不算太多。實(shí)測(cè)發(fā)現(xiàn)越是復(fù)雜的項(xiàng)目,HappyPack 對(duì)打包速度的提升越明顯.
2.由于HappyPack作者已經(jīng)停止了更新維護(hù),現(xiàn)在更多的是推薦使用 thread-loader

3. thread-loader —— 開(kāi)啟多線程優(yōu)化
thread-loader是官方維護(hù)的多進(jìn)程loader,功能類(lèi)似于happypack,也是通過(guò)開(kāi)啟子任務(wù)來(lái)并行解析文件,從而提高構(gòu)建速度。
把這個(gè)loader放在其他loader前面。不過(guò)該loader是有限制的。示例:
- loader無(wú)法發(fā)出文件。
- loader不能使用自定義加載器API。
- loader無(wú)法訪問(wèn)網(wǎng)頁(yè)包選項(xiàng)。
每個(gè)worker都是一個(gè)單獨(dú)的node.js進(jìn)程,其開(kāi)銷(xiāo)約為600毫秒。還有進(jìn)程間通信的開(kāi)銷(xiāo)。在小型項(xiàng)目中使用thread-loader可能并不能優(yōu)化項(xiàng)目的構(gòu)建速度,反而會(huì)拖慢構(gòu)建速度,所以使用該loader時(shí)需要明確項(xiàng)目構(gòu)建構(gòu)成中真正耗時(shí)的過(guò)程。
使用 thread-loader 時(shí),通常會(huì)將其配置在需要進(jìn)行大量計(jì)算或者時(shí)間消耗較大的Loader之前,如Babel這樣的轉(zhuǎn)譯Loader。通過(guò)創(chuàng)建額外的子進(jìn)程處理這些耗時(shí)任務(wù),主線程能夠更好地并發(fā)執(zhí)行其他構(gòu)建步驟,從而提升整體性能。
// vue.config.js
module.exports = {
chainWebpack: config => {
config.module.rule('vue')
.use('thread-loader')
.loader('thread-loader')
.end()
// 在目標(biāo) loader 前插入 thread-loader
.use('vue-loader')
.loader('vue-loader')
.end()
}
}優(yōu)化后
1. 打包體積:1.41M

2. 添加HardSourceWebpackPlugin后,第二次啟動(dòng)耗費(fèi)時(shí)間:3.8秒

3. 編譯耗費(fèi)時(shí)間: 13.38s

以上就是Vue2中項(xiàng)目打包優(yōu)化的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue2打包優(yōu)化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue.js 單頁(yè)面多路由區(qū)域操作的實(shí)例詳解
這篇文章主要介紹了 Vue.js 單頁(yè)面多路由區(qū)域操作的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)(defineProperty表示不背這個(gè)鍋)
這篇文章主要介紹了為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)?defineProperty表示不背這個(gè)鍋,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue項(xiàng)目中如何使用Axios封裝http請(qǐng)求詳解
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中如何使用Axios封裝http請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue3 響應(yīng)式偵聽(tīng)與計(jì)算的實(shí)現(xiàn)
這篇文章主要介紹了Vue3 響應(yīng)式偵聽(tīng)與計(jì)算的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Vue路由配置項(xiàng)和參數(shù)使用及說(shuō)明
文章介紹了Vue路由中query和params參數(shù)的傳遞與接收、命名路由簡(jiǎn)化跳轉(zhuǎn)、props配置參數(shù)、router-link的replace屬性、編程式導(dǎo)航、路由組件緩存及activated和deactivated兩個(gè)生命周期鉤子的用法2025-10-10
vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載(pdf.js)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)在線預(yù)覽pdf文件和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11

