問題
- 打包白屏
- IE白屏
- 打包后清除控制臺所有console信息
- js\css壓縮問題
解決
問題1. 打包白屏
描述
npm run build打包后,生成dist文件夾。從該文件夾打開dist/index.html頁面,發(fā)現(xiàn)頁面空白,且控制臺報錯。原因是路徑配置有問題。
方案
根目錄打開/新建vue.config.js,配置路徑:
module.exports = {
// 基本路徑配置
publicPath: './'
}
重新打包驗證,問題得以解決。
問題2. IE白屏
描述
在打包完成之后,如果是pc項目,或者移動端低版本兼容項目,則會有許多問題,其中白屏問題困擾著很多開發(fā)者,在安卓4.0、IE多個版本環(huán)境中體現(xiàn)的尤為別致。
方案
- 下載相關插件
npm install @babel/core @babel/plugin-transform-runtime @babel/preset-env es6-promise babel-polyfill --save-dev-dev
- 根目錄新建文件
.babelrc:
{
"presets": ["@babel/preset-env"],
"plugins": [
"@babel/plugin-transform-runtime"
]
}
*[注: 基于vue-cli 3.x]*
- 修改根目錄下的文件
babel.config.js:
// ... some other codes
// 打包時刪除console
const plugins = [];
if (['production', 'prod'].includes(process.env.NODE_ENV)) {
plugins.push("transform-remove-console")
}
module.exports = {
presets: [
[
'@vue/app',
{
"useBuiltIns": "entry",
polyfills: [
'es6.promise',
'es6.symbol'
]
}
]
],
plugins: plugins
}
- 創(chuàng)建/修改根目錄下的文件
vue.config.js:
module.exports = {
// 顯式轉義依賴
transpileDependencies: ['webpack-dev-server/client'],
chainWebpack: config => {
// 指定入口 es6轉es5
config.entry.app = ['babel-polyfill', './src/main.js'];
}
}
- 入口引入相關插件
src/main.js
// 解決ie白屏問題
import '@babel/polyfill'
import Es6Promise from 'es6-promise'
Es6Promise.polyfill()
- 重啟服務/重新打包
頁面正常顯示,控制臺無報錯信息。問題解決。
問題3. 打包后清除控制臺所有console信息
描述
在開發(fā)環(huán)境中,我們調試過程中會添加些許的console.log或者debugger相關代碼,來幫助我們完成開發(fā)。但是有時候此類代碼太多或者馬虎了,上線前沒有刪除干凈,那么打包后生產環(huán)境中就會在控制臺留下相關信息。那么為了避免這一不友好行為,我們采取插件來在打包時,清除所有打印信息。
方案
- 安裝插件
npm install uglifyjs-webpack-plugin --save-dev
- 配置
vue.config.js
// 去除console
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const env = process.env.NODE_ENV;
module.exports = {
// ... other codes
// 去除console
configureWebpack: (config) => {
if (env !== 'development' || env !== 'test') {
config.plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true, // 注釋console
drop_console: true,
pure_funcs:['console.log'] // 移除console
},
},
sourceMap: false,
parallel: true,
}),
);
}
},
}
- 重新打包
配置完成后,重新打包npm run build,打開dist/index.html驗證,console全部清除。
問題4. js\css壓縮問題
描述
在打包成功后,為了縮小包體積,提高頁面響應速度,一般會對包進行壓縮,此處主要針對js\css來處理。
方案
- 安裝插件
npm install compression-webpack-plugin --save-dev
- 配置
vue.config.js中的configureWebpack
// 壓縮css、js
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 要壓縮的文件
const productionGzipExtensions = ['js', 'css'];
configureWebpack: (config) => {
if (env !== 'development' || env !== 'test') {
config.plugins.push(new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),
threshold: 10240,
minRatio: 0.8,
}));
}
}
- 重啟服務
完成陪之后重啟服務/重新打包,處理完成,搞定收工!
附贈
這里附上基于vue-cli3的一些簡單配置文件
vue.config.js
const path = require('path');
const resolve = dir => path.resolve(__dirname, dir);
// const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
// 去除console
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
// 壓縮css、js
const CompressionWebpackPlugin = require('compression-webpack-plugin');
// 要壓縮的文件
const productionGzipExtensions = ['js', 'css'];
// const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
const env = process.env.NODE_ENV;
module.exports = {
// 基本路徑配置
publicPath: './',
// 顯式轉義依賴
transpileDependencies: ['webpack-dev-server/client'],
// 配置less
css: {
loaderOptions: {
less: {
javascriptEnabled: true,
}
}
},
configureWebpack: (config) => {
if (env !== 'development' || env !== 'test') {
config.plugins.push(new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),
threshold: 10240,
minRatio: 0.8,
}));
config.plugins.push(
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false,
drop_debugger: true, // 注釋console
drop_console: true,
pure_funcs:['console.log'] // 移除console
},
},
sourceMap: false,
parallel: true,
}),
);
}
},
chainWebpack: config => {
// 指定入口 es6轉es5
config.entry.app = ['babel-polyfill', './src/main.js'];
// 修復HMR
config.resolve.symlinks(true);
// //修復 Lazy loading routes Error
// config.plugin('html').tap(args => {
// args[0].chunksSortMode = 'none';
// return args;
// });
// 添加別名
config.resolve.alias
.set('@', resolve('src'))
.set('assets', resolve('src/assets'))
.set('static', resolve('src/static'));
// //壓縮圖片
// config.module
// .rule("images")
// .use("image-webpack-loader")
// .loader("image-webpack-loader")
// .options({
// mozjpeg: {progressive: true, quality: 65},
// optipng: {enabled: false},
// pngquant: {quality: "65-90", speed: 4},
// gifsicle: {interlaced: false},
// webp: {quality: 75}
// });
// // 打包分析
// if (process.env.IS_ANALYZ) {
// config.plugin('webpack-report')
// .use(BundleAnalyzerPlugin, [{
// analyzerMode: 'static',
// }]);
// }
},
// 是否使用包含運行時編譯器的 Vue 構建版本
// runtimeCompiler: true,
// 去除打包.map后綴文件
// productionSourceMap: false,
// devServer: {//跨域
// port: 8080,// 端口號
// open: true, //配置自動啟動瀏覽器
// proxy: {// 配置跨域處理 可以設置多個
// '/api': {
// target: '',
// ws: true,
// changeOrigin: true
// },
// }
// }
}
babel.config.js
// 打包時刪除console
const plugins = [];
if (['production', 'prod'].includes(process.env.NODE_ENV)) {
plugins.push("transform-remove-console")
}
module.exports = {
presets: [
[
'@vue/app',
{
"useBuiltIns": "entry",
polyfills: [
'es6.promise',
'es6.symbol'
]
}
]
],
// 配置babel-plugin-import, 用于按需加載組件代碼和樣式
plugins: [
[
"import",
{ libraryName: "ant-design-vue", libraryDirectory: "es", style: true }
]
],
}
.babelrc
{
"presets": ["@babel/preset-env"],
"plugins": [
"@babel/plugin-transform-runtime"
]
}
main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 解決ie白屏問題
import '@babel/polyfill'
import Es6Promise from 'es6-promise'
Es6Promise.polyfill()
// 使用antd-vue Button組件
import { Button } from 'ant-design-vue'
// Button組件
Vue.component(Button.name, Button);
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')