日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > vue >内容正文

vue

vue-cli3全面配置详解

發(fā)布時(shí)間:2023/12/10 vue 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue-cli3全面配置详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

vue-cli3全面配置詳解

vue-cli3-config
創(chuàng)建項(xiàng)目
配置環(huán)境變量
通過(guò)在package.json里的scripts配置項(xiàng)中添加–mode xxx來(lái)選擇不同環(huán)境

在項(xiàng)目根目錄中新建.env, .env.production, .env.analyz等文件

只有以 VUE_APP_ 開(kāi)頭的變量會(huì)被 webpack.DefinePlugin 靜態(tài)嵌入到客戶端側(cè)的包中,代碼中可以通過(guò)process.env.VUE_APP_BASE_API訪問(wèn)

NODE_ENV 和 BASE_URL 是兩個(gè)特殊變量,在代碼中始終可用

.env serve默認(rèn)的環(huán)境變量

NODE_ENV = 'development' VUE_APP_BASE_API = 'https://demo.cn/api' VUE_APP_SRC = 'https://wechat-timg.oss-cn-hangzhou.aliyuncs.com/demo'

.env.production build默認(rèn)的環(huán)境變量

NODE_ENV = 'production' VUE_APP_BASE_API = 'https://demo.com/api' VUE_APP_SRC = 'https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'

.env.analyz 用于webpack-bundle-analyzer打包分析

NODE_ENV = 'production' IS_ANALYZ = 'analyz' VUE_APP_BASE_API = 'https://demo.com/api' VUE_APP_SRC = 'https://img-wechat.oss-cn-hangzhou.aliyuncs.com/demo'

修改package.json

"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","analyz": "vue-cli-service build --mode analyz","lint": "vue-cli-service lint" }

配置vue.config.js

const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);module.exports = {baseUrl: './', // 默認(rèn)'/',部署應(yīng)用包時(shí)的基本 URLoutputDir: process.env.outputDir || 'dist', // 'dist', 生產(chǎn)環(huán)境構(gòu)建文件的目錄assetsDir: '', // 相對(duì)于outputDir的靜態(tài)資源(js、css、img、fonts)目錄lintOnSave: false,runtimeCompiler: true, // 是否使用包含運(yùn)行時(shí)編譯器的 Vue 構(gòu)建版本productionSourceMap: false, // 生產(chǎn)環(huán)境的 source mapparallel: require('os').cpus().length > 1,pwa: {} };

配置proxy跨域

const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV); module.exports = {devServer: {// overlay: {// warnings: true,// errors: true// },open: IS_PROD,host: '0.0.0.0',port: 8000,https: false,hotOnly: false,proxy: {'/api': {target: process.env.VUE_APP_BASE_API || 'http://127.0.0.1:8080',changeOrigin: process.env.NODE_ENV === 'development' ? true : false,}}} }

修復(fù)HMR(熱更新)失效

module.exports = {chainWebpack: config => {// 修復(fù)HMRconfig.resolve.symlinks(true);} }

添加別名

const path = require('path'); const resolve = (dir) => path.join(__dirname, dir); const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);module.exports = {chainWebpack: config => {// 添加別名config.resolve.alias.set('@', resolve('src')).set('assets', resolve('src/assets')).set('components', resolve('src/components')).set('layout', resolve('src/layout')).set('base', resolve('src/base')).set('static', resolve('src/static'));} }

添加打包分析

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {chainWebpack: config => {// 打包分析if (process.env.IS_ANALYZ) {config.plugin('webpack-report').use(BundleAnalyzerPlugin, [{analyzerMode: 'static',}]);}} }

配置externals
防止將某些 import 的包(package)打包到 bundle 中,而是在運(yùn)行時(shí)(runtime)再去從外部獲取這些擴(kuò)展依賴

module.exports = {configureWebpack: config => {config.externals = {'vue': 'Vue','element-ui': 'ELEMENT','vue-router': 'VueRouter','vuex': 'Vuex','axios': 'axios'}} }

去掉console.log
方法一:

const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); module.exports = {configureWebpack: config => {if (IS_PROD) {const plugins = [];plugins.push(new UglifyJsPlugin({uglifyOptions: {compress: {warnings: false,drop_console: true,drop_debugger: false,pure_funcs: ['console.log']//移除console}},sourceMap: false,parallel: true}));config.plugins = [...config.plugins,...plugins];}} }

方法二:使用babel-plugin-transform-remove-console插件

npm i --save-dev babel-plugin-transform-remove-console

在vue.config.js中配置

const plugins = []; if(['production', 'prod'].includes(process.env.NODE_ENV)) { plugins.push("transform-remove-console") }module.exports = {presets: [["@vue/app",{"useBuiltIns": "entry"}]],plugins: plugins };

開(kāi)啟gzip壓縮

npm i --save-dev compression-webpack-plugin const CompressionWebpackPlugin = require('compression-webpack-plugin'); const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;module.exports = {configureWebpack: config => {if (IS_PROD) {const plugins = [];plugins.push(new CompressionWebpackPlugin({filename: '[path].gz[query]',algorithm: 'gzip',test: productionGzipExtensions,threshold: 10240,minRatio: 0.8}));config.plugins = [...config.plugins,...plugins];}} }

還可以開(kāi)啟比gzip體驗(yàn)更好的Zopfli壓縮詳見(jiàn)https://webpack.js.org/plugins/compression-webpack-plugin/

npm i --save-dev @gfx/zopfli brotli-webpack-plugi const CompressionWebpackPlugin = require('compression-webpack-plugin'); const zopfli = require("@gfx/zopfli"); const BrotliPlugin = require("brotli-webpack-plugin"); const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;module.exports = {configureWebpack: config => {if (IS_PROD) {const plugins = [];plugins.push(new CompressionWebpackPlugin({algorithm(input, compressionOptions, callback) {return zopfli.gzip(input, compressionOptions, callback);},compressionOptions: {numiterations: 15},minRatio: 0.99,test: productionGzipExtensions}));plugins.push(new BrotliPlugin({test: productionGzipExtensions,minRatio: 0.99}));config.plugins = [...config.plugins,...plugins];}} }

為sass提供全局樣式,以及全局變量
可以通過(guò)在main.js中Vue.prototype.src=process.env.VUEAPPSRC;掛載環(huán)境變量中的配置信息,然后在js中使用src = process.env.VUE_APP_SRC;掛載環(huán)境變量中的配置信息,然后在js中使用src=process.env.VUEA?PPS?RC;環(huán)js使src訪問(wèn)。

css中可以使用注入sass變量訪問(wèn)環(huán)境變量中的配置信息

module.exports = {css: {modules: false,extract: IS_PROD,sourceMap: false,loaderOptions: {sass: {// 向全局sass樣式傳入共享的全局變量data: `@import "~assets/scss/variables.scss";$src: "${process.env.VUE_APP_SRC}";`}}} }

在scss中引用

.home {background: url($src + '/images/500.png'); }

添加IE兼容

npm i --save @babel/polyfill

在main.js中添加

import '@babel/polyfill';

配置vue.config.js

const plugins = [];module.exports = {presets: [["@vue/app",{"useBuiltIns": "entry"}]],plugins: plugins };

完整配置
安裝依賴
代碼如下:

npm i --save-dev compression-webpack-plugin babel-plugin-transform-remove-console @gfx/zopfli brotli-webpack-plugin

package.json

"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","analyz": "vue-cli-service build --mode analyz","lint": "vue-cli-service lint" }

vue.config.js

const plugins = []; // if(['production', 'prod'].includes(process.env.NODE_ENV)) { // plugins.push("transform-remove-console") // }module.exports = {presets: [["@vue/app",{"useBuiltIns": "entry"}]],plugins: plugins }; vue.config.js const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); const CompressionWebpackPlugin = require('compression-webpack-plugin'); // const zopfli = require("@gfx/zopfli"); // const BrotliPlugin = require("brotli-webpack-plugin");const path = require('path'); const resolve = (dir) => path.join(__dirname, dir); const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV); const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;module.exports = {baseUrl: './', // 默認(rèn)'/',部署應(yīng)用包時(shí)的基本 URLoutputDir: process.env.outputDir || 'dist', // 'dist', 生產(chǎn)環(huán)境構(gòu)建文件的目錄assetsDir: '', // 相對(duì)于outputDir的靜態(tài)資源(js、css、img、fonts)目錄lintOnSave: false,runtimeCompiler: true, // 是否使用包含運(yùn)行時(shí)編譯器的 Vue 構(gòu)建版本productionSourceMap: false, // 生產(chǎn)環(huán)境的 source mapconfigureWebpack: config => {// config.externals = {// 'vue': 'Vue',// 'element-ui': 'ELEMENT',// 'vue-router': 'VueRouter',// 'vuex': 'Vuex',// 'axios': 'axios'// }if (IS_PROD) {const plugins = [];plugins.push(new UglifyJsPlugin({uglifyOptions: {compress: {warnings: false,drop_console: true,drop_debugger: false,pure_funcs: ['console.log']//移除console}},sourceMap: false,parallel: true}));plugins.push(new CompressionWebpackPlugin({filename: '[path].gz[query]',algorithm: 'gzip',test: productionGzipExtensions,threshold: 10240,minRatio: 0.8}));// Zopfli壓縮 https://webpack.js.org/plugins/compression-webpack-plugin/// plugins.push(// new CompressionWebpackPlugin({// algorithm(input, compressionOptions, callback) {// return zopfli.gzip(input, compressionOptions, callback);// },// compressionOptions: {// numiterations: 15// },// minRatio: 0.99,// test: productionGzipExtensions// })// );// plugins.push(// new BrotliPlugin({// test: productionGzipExtensions,// minRatio: 0.99// })// );config.plugins = [...config.plugins,...plugins];}},chainWebpack: config => {// 修復(fù)HMRconfig.resolve.symlinks(true);// 添加別名config.resolve.alias.set('@', resolve('src')).set('assets', resolve('src/assets')).set('components', resolve('src/components')).set('layout', resolve('src/layout')).set('base', resolve('src/base')).set('static', resolve('src/static'));// 打包分析if (process.env.IS_ANALYZ) {config.plugin('webpack-report').use(BundleAnalyzerPlugin, [{analyzerMode: 'static',}]);}// 多頁(yè)面配置,為js添加hash// config.output.chunkFilename(`js/[name].[chunkhash:8].js`)// 修改圖片輸出路徑// config.module// .rule('images')// .test(/\.(png|jpe?g|gif|ico)(\?.*)?$/)// .use('url-loader')// .loader('url-loader')// .options({// name: path.join('../assets/', 'img/[name].[ext]')// })},css: {modules: false,extract: IS_PROD,// 為css后綴添加hash// extract: {// filename: 'css/[name].[hash:8].css',// chunkFilename: 'css/[name].[hash:8].css'//},sourceMap: false,loaderOptions: {sass: {// 向全局sass樣式傳入共享的全局變量// data: `@import "~assets/scss/variables.scss";$src: "${process.env.VUE_APP_SRC}";`data: `$src: "${process.env.VUE_APP_SRC}";`},// px轉(zhuǎn)換為rem// postcss: {// plugins: [// require('postcss-pxtorem')({// rootValue : 1, // 換算的基數(shù)// selectorBlackList : ['weui', 'el'], // 忽略轉(zhuǎn)換正則匹配項(xiàng)// propList : ['*']// })// ]// }}},pluginOptions: {// 安裝vue-cli-plugin-style-resources-loader插件// 添加全局樣式global.scss// "style-resources-loader": {// preProcessor: "scss",// patterns: [// resolve(__dirname, "./src/scss/scss/variables.scss")// ]// }},parallel: require('os').cpus().length > 1,pwa: {},devServer: {// overlay: {// warnings: true,// errors: true// },open: IS_PROD,host: '0.0.0.0',port: 8000,https: false,hotOnly: false,proxy: {'/api': {target: process.env.VUE_APP_BASE_API || 'http://127.0.0.1:8080',changeOrigin: true}}} };

總結(jié)

以上是生活随笔為你收集整理的vue-cli3全面配置详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。