揭秘vue——vue-cli3全面配置

news/2024/7/1 3:55:28

★ vue-cli3 全面配置

★ Nuxt.js 全面配置


创建项目

配置环境变量

  通过在package.json里的scripts配置项中添加--mode xxx来选择不同环境

  在项目根目录中新建.env, .env.production, .env.analyz等文件

  只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,代码中可以通过process.env.VUE_APP_BASE_API访问

  NODE_ENV 和 BASE_URL 是两个特殊变量,在代码中始终可用

.env serve默认的环境变量

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默认的环境变量

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: './', // 默认'/',部署应用包时的基本 URLoutputDir: process.env.outputDir || 'dist', // 'dist', 生产环境构建文件的目录assetsDir: '',  // 相对于outputDir的静态资源(js、css、img、fonts)目录lintOnSave: false,runtimeCompiler: true, // 是否使用包含运行时编译器的 Vue 构建版本productionSourceMap: false,  // 生产环境的 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: true}}}
}

修复HMR(热更新)失效

module.exports = {chainWebpack: config => {// 修复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 中,而是在运行时(runtime)再去从外部获取这些扩展依赖


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

在babel.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
};

开启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];}}
}

  还可以开启比gzip体验更好的Zopfli压缩详见https://webpack.js.org/plugins/compression-webpack-plugin

npm i --save-dev @gfx/zopfli brotli-webpack-plugin
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提供全局样式,以及全局变量

  可以通过在main.js中Vue.prototype.$src = process.env.VUE_APP_SRC;挂载环境变量中的配置信息,然后在js中使用$src访问。

  css中可以使用注入sass变量访问环境变量中的配置信息

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';

配置babel.config.js

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

完整配置

vue-cli3-config github持续更新中


☞☞☞揭秘vue系列☜☜☜



http://lihuaxi.xjx100.cn/news/236789.html

相关文章

OBS源代码阅读笔记

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 obs配置文件加载:bool OBSBasic::InitBasicConfig(); OBS认证信息加载,貌似还没有实现吗? void Auth::Load(){ …

设计模式之禅笔记

2019独角兽企业重金招聘Python工程师标准>>> 1.设计原则 1)单一职责原则 There should never be more than one reason for a class to change (就一个类而言,应该只有一个引起它变化的原因) 用于控制类的粒度大小,防止类过于复杂…

提取Jar2Exe源代码,JavaAgent监控法

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 最近遇见一个麻烦,明明知道是java写的小软件,但是打包成了exe,木得办法,之前打包的都有缓存能在TEMP…

Aria2打造属于自己的下载神器

请关注微信公众号( ?sharingplus) 我使用Aria2差不多已经2年了。在这段时间使用很多下载工具,最开始使用的是迅雷极速版 、后面各种原因不好使了。Free Download Manager、uTorrent、qBittorrent、BitComet、IDM等等全部折腾了一遍。各有千秋,在上面中使…

以太坊官网

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊(Ethereum)以基金会为核心,形成了一个庞大的社区和生态。以太坊官网主要分为四类:以太坊基金会…

slf4j 日志监控

问题描述 监控系统 新系统起步,旨在监控原有系统的各种问题。主要的一部分,就是监视原有系统的日志。 日志,是Java企业级应用开发必不可少的一部分,市场上有诸多日志框架。我们选用slf4j。 日志有以下级别: TRACE, DEB…

linux 防火墙 -netfilter

2019独角兽企业重金招聘Python工程师标准>>> 关于iptables 什么是iptables? 常见于linx系统下的应用层防火墙工具 firewalld 和netfilter Linux 防火墙-netfilter selinux 临时关闭 setenforce 0selinux 永久关闭 vi /etc/selinux/configcentos7 之前使用 netfilte…

初识以太坊

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊(Ethereum)已经成功跻身为密码货币资本市场的第二名,其地位仅次于比特币。在短时间内,以太坊迅…