解析vue.config.js文件使用
一、用途
創(chuàng)建 Vue 項(xiàng)目時(shí),默認(rèn)情況下是沒(méi)有 vue.config.js 文件的。
Vue CLI 會(huì)提供一組默認(rèn)的配置,用于構(gòu)建和開發(fā)項(xiàng)目,這些配置在內(nèi)部被封裝好了,并不需要用戶手動(dòng)創(chuàng)建 vue.config.js 文件來(lái)進(jìn)行配置。
通過(guò)在項(xiàng)目根目錄下創(chuàng)建 vue.config.js 文件,你可以自定義 Vue CLI 的默認(rèn)配置,從而滿足項(xiàng)目特定的需求。
常見的用途包括
1、自定義 webpack 配置:
- 可以通過(guò) vue.config.js 文件來(lái)修改 Vue CLI 默認(rèn)的 webpack 配置,例如添加額外的 loader 或 plugin、調(diào)整 webpack 的 entry、output 等選項(xiàng)。
2、配置開發(fā)服務(wù)器:
- 在 vue.config.js 中配置開發(fā)服務(wù)器的選項(xiàng),例如端口號(hào)、代理設(shè)置、HTTPS 配置等。
3、配置公共資源路徑:
- 可以指定構(gòu)建后靜態(tài)資源的公共路徑,比如部署到子路徑或 CDN 上時(shí)的路徑設(shè)置。
4、配置環(huán)境變量:
- 可以在 vue.config.js 中設(shè)置環(huán)境變量,用于在項(xiàng)目中訪問(wèn)和區(qū)分不同的環(huán)境,比如開發(fā)環(huán)境、測(cè)試環(huán)境和生產(chǎn)環(huán)境。
5、配置插件:
- 可以配置 Vue CLI 插件,通過(guò)在 vue.config.js 文件中進(jìn)行相應(yīng)的設(shè)置和調(diào)整。
6、配置CSS:
- 可以配置 CSS 相關(guān)的選項(xiàng),例如啟用 CSS modules、使用 PostCSS 插件等。
7、配置Babel:
- 可以配置 Babel 相關(guān)的選項(xiàng),例如添加額外的 Babel 插件或預(yù)設(shè)。
二、常見的配置項(xiàng)及其功能說(shuō)明
module.exports = {
// 配置開發(fā)服務(wù)器
devServer: {
// 指定開發(fā)服務(wù)器的主機(jī)名,默認(rèn)為 localhost
host: 'localhost',
// 指定開發(fā)服務(wù)器的端口號(hào),默認(rèn)為 8080
port: 8080,
// 啟用 HTTPS,默認(rèn)為 false
https: false,
// 配置開發(fā)服務(wù)器的代理
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
},
// 配置公共路徑
publicPath: '/',
// 是否在構(gòu)建時(shí)生成 source map,默認(rèn)為 false
productionSourceMap: false,
// 配置 CSS
css: {
// 啟用 CSS modules
requireModuleExtension: true,
// 是否使用 CSS 預(yù)處理器 loader
loaderOptions: {
sass: {
prependData: `@import "@/styles/variables.scss";`
}
}
},
// 配置 Babel
transpileDependencies: [
/* string or regex */
],
// 配置插件
pluginOptions: {
// ...
},
// 配置 webpack
configureWebpack: {
// ...
},
// 配置 Webpack Dev Server 的選項(xiàng)
devServer: {
// ...
}
};
三、實(shí)踐案例
'use strict'
const path = require('path')
// 輔助函數(shù) resolve,它接受一個(gè)路徑參數(shù) dir,并返回該路徑相對(duì)于當(dāng)前文件所在目錄的絕對(duì)路徑
function resolve (dir) {
return path.join(__dirname, dir)
}
// 引入了用于壓縮文件的 webpack 插件 compression-webpack-plugin,它能夠在打包時(shí)對(duì)文件進(jìn)行 gzip 壓縮
const CompressionWebpackPlugin = require('compression-webpack-plugin')
// 定義了一個(gè)變量 IS_PROD,它根據(jù)當(dāng)前環(huán)境變量 NODE_ENV 的值來(lái)判斷是否為生產(chǎn)環(huán)境
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
// 正則表達(dá)式,用于匹配需要進(jìn)行 gzip 壓縮的文件類型
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i
// 導(dǎo)出了整個(gè)配置對(duì)象,使其可以被 webpack 使用
module.exports = {
publicPath: './',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
productionSourceMap: false,
css: {
loaderOptions: {
// 給 sass-loader 傳遞選項(xiàng)
sass: {
// 所以這里假設(shè)你有 `src/variables.scss` 這個(gè)文件
data: '@import "@/assets/css/variables.scss";'
}
}
},
configureWebpack: config => {
// 定義一個(gè)空數(shù)組,用于存放Webpack插件
const plugins = []
// 如果是生產(chǎn)環(huán)境,添加以下插件配置
if (IS_PROD) {
plugins.push(
new CompressionWebpackPlugin({ // 使用CompressionWebpackPlugin插件進(jìn)行g(shù)zip壓縮
filename: '[path].gz[query]', // 指定壓縮后文件的名稱格式
algorithm: 'gzip', // 指定壓縮算法為gzip
test: productionGzipExtensions, // 指定要壓縮的文件類型
threshold: 10240, // 只有文件大小大于10KB才會(huì)被壓縮
minRatio: 0.8 // 只有壓縮率達(dá)到0.8以上的文件才會(huì)被壓縮
})
)
// 開啟分離js,配置Webpack的優(yōu)化選項(xiàng)
config.optimization = {
runtimeChunk: 'single', // 將runtime代碼單獨(dú)提取為一個(gè)chunk
splitChunks: { // 配置分割代碼塊的規(guī)則
chunks: 'all', // 選擇所有類型的chunk進(jìn)行優(yōu)化
maxInitialRequests: Infinity, // 允許的最大初始請(qǐng)求數(shù),Infinity表示無(wú)限制
minSize: 20000, // 每個(gè)代碼塊的最小大小,小于該值的模塊不會(huì)被提取
cacheGroups: { // 定義緩存組
vendor: { // 緩存組的名稱為vendor
test: /[\\/]node_modules[\\/]/, // 匹配條件,node_modules目錄下的模塊
name (module) { // 模塊名稱的生成規(guī)則
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1] // 獲取模塊名稱
return `npm.${packageName.replace('@', '')}` // 返回以npm.開頭的模塊名稱,@符號(hào)替換為空字符串
}
}
}
}
};
}
// 將定義的插件數(shù)組合并到Webpack配置中的插件數(shù)組中
config.plugins = [...config.plugins, ...plugins];
},
chainWebpack (config) {
// 刪除 webpack 中的預(yù)加載和預(yù)獲取資源的插件
// 這些插件通常會(huì)在項(xiàng)目中引入一些未使用的資源,對(duì)于一些性能要求較高的項(xiàng)目,可能希望移除這些插件以減少無(wú)用資源的加載。
config.plugins.delete('preload') // TODO: need test
config.plugins.delete('prefetch') // TODO: need test
// 將入口文件配置為包含了 Babel polyfill 的 main.js 文件
config.entry.app = ['@babel/polyfill', './src/main.js']
// 設(shè)置了一個(gè)別名 @,指向項(xiàng)目中的 src 目錄
// 在代碼中引用文件時(shí)就可以使用 @ 代替 src
config.resolve.alias
.set('@', resolve('src'))
.end()
// 如果是開發(fā)環(huán)境,則調(diào)用 config.devtool('cheap-source-map') 方法來(lái)配置 devtool 選項(xiàng),以生成方便調(diào)試的源映射文件
config
.when(process.env.NODE_ENV === 'development',
config => config.devtool('cheap-source-map')
)
// 圖片處理規(guī)則
config.module
.rule('images')
.test(/\.(woff2?|eot|ttf|otf|png|jpe?g|gif|svg)(\?.*)?$/) // 匹配圖片文件的文件名后綴
.use('url-loader') // 使用 url-loader 加載器處理圖片文件
.loader('url-loader')
.options({
limit: 80000, // 小于 80000 字節(jié)的圖片轉(zhuǎn)換為 base64 編碼的 Data URL
esModule: false // 禁用 ES 模塊語(yǔ)法
})
if (IS_PROD) {
config.module
.rule('images')
.test(/\.(woff2?|eot|ttf|otf|png|jpe?g|gif|svg)(\?.*)?$/)
.use('image-webpack-loader') // 用于優(yōu)化圖片文件
.loader('image-webpack-loader')
.options({
mozjpeg: { progressive: true, quality: 65 },
optipng: { enabled: false },
pngquant: { quality: [0.65, 0.9], speed: 4 },
gifsicle: { interlaced: false }
})
}
}
}以上代碼的主要作用是根據(jù)環(huán)境判斷是否為生產(chǎn)環(huán)境,如果是則添加對(duì)應(yīng)的插件配置和優(yōu)化選項(xiàng)。
其中,主要的插件是 CompressionWebpackPlugin,用于對(duì)資源文件進(jìn)行 gzip壓縮,在生產(chǎn)環(huán)境中提高加載速度。
同時(shí),通過(guò)配置 splitChunks 選項(xiàng),將第三方庫(kù)和公共模塊分離到單獨(dú)的文件中,以優(yōu)化瀏覽器緩存機(jī)制,提高頁(yè)面加載速度。
附:
一些關(guān)鍵配置項(xiàng)解析
publicPath: 指定項(xiàng)目的基本 URL 路徑,通常用于將靜態(tài)資源部署到 CDN 上時(shí)使用。在這個(gè)配置中,‘./’ 表示相對(duì)路徑。outputDir: 指定打包后的文件輸出目錄。assetsDir: 指定放置生成的靜態(tài)資源 (js、css、img、fonts) 的 (相對(duì)于 outputDir 的) 目錄。productionSourceMap: 是否在生產(chǎn)環(huán)境下生成 source map 文件,方便調(diào)試,默認(rèn)為 false。css.loaderOptions: 用于向 CSS 相關(guān)的 loader 傳遞選項(xiàng)。在這里使用 sass-loader 加載器,引入了一個(gè)變量文件。configureWebpack: 用于修改 webpack 的配置,在這里添加了一些插件,比如壓縮插件 CompressionWebpackPlugin,根據(jù)環(huán)境變量決定是否啟用壓縮。chainWebpack: 通過(guò) webpack-chain 的 API 修改 webpack 配置,包括修改入口文件、配置別名、刪除預(yù)加載和預(yù)取等操作。url-loader和image-webpack-loader: 用于處理圖片資源,限制圖片大小,并進(jìn)行圖片優(yōu)化,例如壓縮、轉(zhuǎn)換格式等。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一次Vue中computed沒(méi)有觸發(fā)的原因以及排查經(jīng)歷
這篇文章主要介紹了一次Vue中computed沒(méi)有觸發(fā)的原因以及排查經(jīng)歷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue?調(diào)用瀏覽器攝像頭實(shí)現(xiàn)及原理解析
這篇文章主要為大家介紹了vue調(diào)用瀏覽器攝像頭實(shí)現(xiàn)及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
說(shuō)說(shuō)Vuex的getters屬性的具體用法
這篇文章主要介紹了說(shuō)說(shuō)Vuex的getters屬性的具體用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
elementui之el-tebs瀏覽器卡死的問(wèn)題和使用報(bào)錯(cuò)未注冊(cè)問(wèn)題
這篇文章主要介紹了elementui之el-tebs瀏覽器卡死的問(wèn)題和使用報(bào)錯(cuò)未注冊(cè)問(wèn)題2019-07-07
Vue使用localStorage存儲(chǔ)數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了Vue使用localStorage存儲(chǔ)數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
vue+echarts實(shí)現(xiàn)動(dòng)態(tài)折線圖的方法與注意
這篇文章主要給大家介紹了關(guān)于vue+echarts實(shí)現(xiàn)動(dòng)態(tài)折線圖的方法與注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
vuex中...mapstate和...mapgetters的區(qū)別及說(shuō)明
這篇文章主要介紹了vuex中...mapstate和...mapgetters的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
關(guān)于ElementPlus中的表單驗(yàn)證規(guī)則詳解
這篇文章主要介紹了關(guān)于ElementPlus中的表單驗(yàn)證,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06

