vue.config.js中配置configureWebpack和chainWebpack以及一些常用的配置
configureWebpack
介紹
configureWebpack 允許你在 Vue CLI 項(xiàng)目中直接修改 Webpack 的配置。
它可以通過一個(gè)對(duì)象或一個(gè)函數(shù)來實(shí)現(xiàn)。
如果你使用的是一個(gè)函數(shù),那么它會(huì)接收默認(rèn)的 Webpack 配置作為參數(shù),并且你應(yīng)該返回一個(gè)修改過的配置對(duì)象。
用法
configureWebpack 可以是一個(gè)對(duì)象或一個(gè)函數(shù):
作為對(duì)象:
- 如果 configureWebpack 是一個(gè)對(duì)象,那么這個(gè)對(duì)象將會(huì)通過 webpack-merge 合并到最終的 Webpack 配置中。
- 這種方式適合簡(jiǎn)單的配置修改。
作為函數(shù):
- 如果 configureWebpack 是一個(gè)函數(shù),那么它會(huì)接收默認(rèn)的 Webpack 配置作為參數(shù)。
- 函數(shù)可以修改配置并不返回任何東西,也可以返回一個(gè)被克隆或修改過的配置版本。
- 這種方式適合更復(fù)雜的配置修改,特別是當(dāng)你需要基于環(huán)境變量或其他條件動(dòng)態(tài)修改配置時(shí)。
常見配置示例
添加別名
const path = require("path");
module.exports = {
configureWebpack: {
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
}
}
};修改輸出文件名
module.exports = {
configureWebpack: {
output: {
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].chunk.js'
}
}
};添加 Webpack 插件
module.exports = {
configureWebpack: (config) => {
config.plugins.push(
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html',
})
);
},
};添加額外的 Loader
module.exports = {
configureWebpack: {
module: {
rules: [
{
test: /\.md$/,
use: [
'vue-loader',
{
loader: 'markdown-loader',
options: {
// markdown-loader 的選項(xiàng)
}
}
]
}
]
}
}
};修改性能提示
module.exports = {
configureWebpack: (config) => {
config.performance = {
hints: false, // 關(guān)閉性能提示
maxEntrypointSize: 500000,
maxAssetSize: 300000,
};
},
};修改優(yōu)化選項(xiàng)
module.exports = {
configureWebpack: (config) => {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 去除 console
drop_debugger: true, // 去除 debugger
},
},
}),
],
},
},
};示例
對(duì)象形式:
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
const WebpackObfuscator = require('webpack-obfuscator');
function resolve(dir) {
return path.join(__dirname, dir);
}
const name = '瀏覽器網(wǎng)頁標(biāo)題';
module.exports = {
configureWebpack: (process.env.NODE_ENV === 'production') ? {
name: name,
plugins: [
new WebpackObfuscator({ // js 混淆配置
controlFlowFlattening: false,
deadCodeInjection: false,
ignoreImports: true, // 這里設(shè)置為true
stringArrayThreshold: 0.3,
// 壓縮代碼
compact: true,
// 是否啟用控制流扁平化(降低1.5倍的運(yùn)行速度)
controlFlowFlattening: false,
// 隨機(jī)的死代碼塊(增加了混淆代碼的大小)
deadCodeInjection: false,
// 此選項(xiàng)幾乎不可能使用開發(fā)者工具的控制臺(tái)選項(xiàng)卡
debugProtection: false,
// 如果選中,則會(huì)在“控制臺(tái)”選項(xiàng)卡上使用間隔強(qiáng)制調(diào)試模式,從而更難使用“開發(fā)人員工具”的其他功能。
debugProtectionInterval: false,
// 通過用空函數(shù)替換它們來禁用console.log,console.info,console.error和console.warn。這使得調(diào)試器的使用更加困難。
disableConsoleOutput: true,
// 標(biāo)識(shí)符的混淆方式 hexadecimal(十六進(jìn)制) mangled(短標(biāo)識(shí)符)
identifierNamesGenerator: 'hexadecimal',
log: false,
// 是否啟用全局變量和函數(shù)名稱的混淆
renameGlobals: false,
// 通過固定和隨機(jī)(在代碼混淆時(shí)生成)的位置移動(dòng)數(shù)組。這使得將刪除的字符串的順序與其原始位置相匹配變得更加困難。如果原始源代碼不小,建議使用此選項(xiàng),因?yàn)檩o助函數(shù)可以引起注意。
rotateStringArray: true,
// 混淆后的代碼,不能使用代碼美化,同時(shí)需要配置 cpmpat:true;
selfDefending: true,
// 刪除字符串文字并將它們放在一個(gè)特殊的數(shù)組中
stringArray: true,
rotateUnicodeArray: true,
// stringArrayEncoding: 'base64',
stringArrayEncoding: ['base64'],
stringArrayThreshold: 0.75,
// 允許啟用/禁用字符串轉(zhuǎn)換為unicode轉(zhuǎn)義序列。Unicode轉(zhuǎn)義序列大大增加了代碼大小,并且可以輕松地將字符串恢復(fù)為原始視圖。建議僅對(duì)小型源代碼啟用此選項(xiàng)。
unicodeEscapeSequence: false,
// 允許啟用/禁用字符串轉(zhuǎn)換為unicode轉(zhuǎn)義序列。Unicode轉(zhuǎn)義序列大大增加了代碼大小,并且可以輕松地將字符串恢復(fù)為原始視圖。建議僅對(duì)小型源代碼啟用此選項(xiàng)。
transformObjectKeys: true,
}, []),
],
devtool: process.env.NODE_ENV === "production" ? "false" : "source-map",
resolve: {
alias: {
"@": resolve("src"), // 添加別名 @
'vue': path.resolve(__dirname, './', 'node_modules', 'vue') // 去重vue包,多個(gè)vue包會(huì)導(dǎo)致element-ui 里的 table 組件不生效
},
},
// 打包生產(chǎn)環(huán)境時(shí)過濾console.log打印日志
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 去除 console
drop_debugger: true, // 去除 debugger
},
},
}),
],
},
} : {},
}函數(shù)形式:
const path = require("path");
const TerserPlugin = require("terser-webpack-plugin");
const WebpackObfuscator = require('webpack-obfuscator');
function resolve(dir) {
return path.join(__dirname, dir);
}
const name = '瀏覽器網(wǎng)頁標(biāo)題';
module.exports = {
configureWebpack: (config) => {
config.name = name,
config.resolve = {
...config.resolve,
alias: {
"@": resolve("src"), // 配置別名 @
'vue': path.resolve(__dirname, './', 'node_modules', 'vue') // 去重vue包,多個(gè)vue包會(huì)導(dǎo)致element-ui 里的 table 組件不生效
}
},
config.optimization = {
...config.minimizer,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 去除 console.log
drop_debugger: true, // 去除 debugger
},
},
}),
]
}
if (process.env.NODE_ENV === 'production') {
config.plugins.push(
new WebpackObfuscator({
// 壓縮代碼
compact: true,
// 是否啟用控制流扁平化(降低1.5倍的運(yùn)行速度)
controlFlowFlattening: false,
// 隨機(jī)的死代碼塊(增加了混淆代碼的大小)
deadCodeInjection: false,
// 此選項(xiàng)幾乎不可能使用開發(fā)者工具的控制臺(tái)選項(xiàng)卡
debugProtection: false,
// 如果選中,則會(huì)在“控制臺(tái)”選項(xiàng)卡上使用間隔強(qiáng)制調(diào)試模式,從而更難使用“開發(fā)人員工具”的其他功能。
debugProtectionInterval: false,
// 通過用空函數(shù)替換它們來禁用console.log,console.info,console.error和console.warn。這使得調(diào)試器的使用更加困難。
disableConsoleOutput: true,
// 標(biāo)識(shí)符的混淆方式 hexadecimal(十六進(jìn)制) mangled(短標(biāo)識(shí)符)
identifierNamesGenerator: 'hexadecimal',
log: false,
// 是否啟用全局變量和函數(shù)名稱的混淆
renameGlobals: false,
// 通過固定和隨機(jī)(在代碼混淆時(shí)生成)的位置移動(dòng)數(shù)組。這使得將刪除的字符串的順序與其原始位置相匹配變得更加困難。如果原始源代碼不小,建議使用此選項(xiàng),因?yàn)檩o助函數(shù)可以引起注意。
rotateStringArray: true,
// 混淆后的代碼,不能使用代碼美化,同時(shí)需要配置 cpmpat:true;
selfDefending: true,
// 刪除字符串文字并將它們放在一個(gè)特殊的數(shù)組中
stringArray: true,
rotateUnicodeArray: true,
// stringArrayEncoding: 'base64',
stringArrayEncoding: ['base64'],
stringArrayThreshold: 0.75,
// 允許啟用/禁用字符串轉(zhuǎn)換為unicode轉(zhuǎn)義序列。Unicode轉(zhuǎn)義序列大大增加了代碼大小,并且可以輕松地將字符串恢復(fù)為原始視圖。建議僅對(duì)小型源代碼啟用此選項(xiàng)。
unicodeEscapeSequence: false,
// 允許啟用/禁用字符串轉(zhuǎn)換為unicode轉(zhuǎn)義序列。Unicode轉(zhuǎn)義序列大大增加了代碼大小,并且可以輕松地將字符串恢復(fù)為原始視圖。建議僅對(duì)小型源代碼啟用此選項(xiàng)。
transformObjectKeys: true,
})
)
}
},
}
js 混淆參考文檔: 使用 webpack-obfuscator 進(jìn)行代碼混淆及報(bào)錯(cuò)解決方案
chainWebpack
介紹
chainWebpack 是 Vue CLI 提供的一種更強(qiáng)大的方式來修改 Webpack 的配置。
與 configureWebpack 不同,chainWebpack 使用 Webpack Chain API,它允許你以一種聲明式的方式來修改 Webpack 配置
用法
chainWebpack 接收一個(gè)函數(shù),該函數(shù)接收一個(gè)基于 Webpack Chain API 的鏈對(duì)象作為參數(shù)。
你可以使用這個(gè)鏈對(duì)象來修改 Webpack 的配置
常用配置示例
修改 HTML 插件的選項(xiàng)
config.plugin('html').tap(args => {
args[0].title = 'My App';
return args;
});** 修改模塊規(guī)則**
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
.use('url-loader')
.loader('url-loader')
.options({
limit: 10000,
name: 'img/[name].[hash:7].[ext]'
});去除 debugger 語句
config.when(process.env.NODE_ENV === 'production', config => {
config.optimization.minimize(true);
config.optimization.minimizer('terser').tap(args => {
args[0].terserOptions.compress.drop_debugger = true;
return args;
});
});注意事項(xiàng)
- 使用 chainWebpack 時(shí),請(qǐng)確保你了解 Webpack Chain API 的使用方法。
- chainWebpack 和 configureWebpack 可以同時(shí)使用,它們會(huì)按照順序依次應(yīng)用。
- 如果你需要對(duì) Webpack 的配置進(jìn)行更復(fù)雜的操作,chainWebpack 提供了更強(qiáng)大的 API 來修改配置。
詳細(xì)示例
const path = require("path");
module.exports = {
chainWebpack: (config) => {
// 修改 HTML 插件的選項(xiàng)
config.plugin('html').tap(args => {
args[0].title = 'My App';
return args;
});
// 修改模塊規(guī)則
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
.use('url-loader')
.loader('url-loader')
.options({
limit: 10000,
name: 'img/[name].[hash:7].[ext]'
});
// 去除 debugger
config.when(process.env.NODE_ENV === 'production', config => {
config.optimization.minimize(true);
config.optimization.minimizer('terser').tap(args => {
args[0].terserOptions.compress.drop_debugger = true;
return args;
});
});
// 添加別名
config.resolve.alias
.set('@components', resolve('src/components'))
.set('@assets', resolve('src/assets'));
// 添加額外的插件
config.plugin('define').tap(args => {
args[0]['process.env'].VUE_APP_VERSION = JSON.stringify(process.env.VUE_APP_VERSION || '');
return args;
});
// 修改輸出選項(xiàng)
config.output.filename('[name].[contenthash].js');
},
};
function resolve(dir) {
return path.join(__dirname, dir);
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue.js頁面驗(yàn)證跳轉(zhuǎn)功能實(shí)現(xiàn)
這篇文章主要介紹了Vue.js頁面驗(yàn)證跳轉(zhuǎn)功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-04-04
利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的詳細(xì)過程
在做電商項(xiàng)目的時(shí)候需要添加修改收貨地址,如何實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)選取省市區(qū)地址困擾了我不少時(shí)間,這篇文章主要給大家介紹了關(guān)于利用vue+elementUI設(shè)置省市縣三級(jí)聯(lián)動(dòng)下拉列表框的相關(guān)資料,需要的朋友可以參考下2022-08-08
Vue項(xiàng)目中Api的組織和返回?cái)?shù)據(jù)處理的操作
這篇文章主要介紹了Vue項(xiàng)目中Api的組織和返回?cái)?shù)據(jù)處理的操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
使用Vue實(shí)現(xiàn)簡(jiǎn)易的車牌輸入鍵盤
這篇文章主要為大家詳細(xì)介紹了如何使用Vue實(shí)現(xiàn)簡(jiǎn)易的車牌輸入鍵盤效果,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11
vue分類篩選filter方法簡(jiǎn)單實(shí)例
這篇文章主要介紹了vue分類篩選filter方法的簡(jiǎn)單實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Vue編譯報(bào)錯(cuò)內(nèi)存溢出問題解決方式
這篇文章主要為大家介紹了Vue編譯報(bào)錯(cuò)內(nèi)存溢出問題解決方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
vee-validate vue 2.0自定義表單驗(yàn)證的實(shí)例
今天小編就為大家分享一篇vee-validate vue 2.0自定義表單驗(yàn)證的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
element中el-autocomplete的常見用法示例
這篇文章主要給大家介紹了關(guān)于element中el-autocomplete的常見用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用element具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
Vue路由組件通過props配置傳參的實(shí)現(xiàn)
本文主要介紹了Vue路由組件通過props配置傳參的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

