安装运行依赖后,导入并在axios拦截器中使用
//设置request拦截器
axios.interceptors.request.use(config => {
  //展示进度条
  Nprogress.start()
  //为请求头添加一个Authorization的属性,值为sessionStorage中存储的token
  config.headers.Authorization = window.sessionStorage.getItem(‘token‘)
  return config
})
//设置response拦截器
axios.interceptors.response.use(config => {
  //隐藏进度条
  Nprogress.done()
  return config
})
安装babel-plugin-transform-remove-console开发依赖
使用方法可参考官方文档
babel.config.js文件初步使用
//该文件全局共享,开发阶段和发布阶段都会生效
module.exports = {
  "presets": [
    "@vue/cli-plugin-babel/preset"
  ],
  "plugins": [
    [
      "component",
      {
        "libraryName": "element-ui",
        "styleLibraryName": "theme-chalk"
      }
    ],
    "transform-remove-console"
  ]
}
  
- 只在发布阶段移除所有console
  ```js
  //这是项目发布阶段要用到的 babel 插件
  const prodPlugins = []
  //判断当前所处模式
  if (process.env.NODE_ENV === ‘production‘) {
    prodPlugins.push("transform-remove-console")
  }
  module.exports = {
    "presets": [
      "@vue/cli-plugin-babel/preset"
    ],
    "plugins": [
      [
        "component",
        {
          "libraryName": "element-ui",
          "styleLibraryName": "theme-chalk"
        }
      ],
      //发布产品时候的插件数组(...对象展开符)
      ...prodPlugins
    ]
  }
在打包时生成报告有两种方式:
通过命令行参数
//通过 vue-cli 的命令选项可以生成打包报告
// --report 选项可以生成 report.html 以帮助分析包内容
vue-cli-service build --report
通过可视化UI面板直接查看
在vue.config.js导出的配置对象中,新增 configureWebpack 或 chainWebpack 节点,来自定义 webpack 的打包配置
configureWebpack 和 chainWebpack 的作用相同,唯一区别是它们修改 webpack配置的方式不同
通过chainWebpack自定义打包入口
将main.js入口文件复制一份,分别命名main-dev.js&main-prod.js
//vue.config.js文件内容
module.exports = {
    chainWebpack: config => {
        //发布模式
        config.when(process.env.NODE_ENV === ‘production‘, config => {
            config.entry(‘app‘).clear().add(‘./src/main-prod.js‘)
        })
        //开发模式
        config.when(process.env.NODE_ENV === ‘development‘, config => {
            config.entry(‘app‘).clear().add(‘./src/main-dev.js‘)
        })
    }
}
默认情况下,通过 import 语法导入的第三方依赖包,最终会被打包合并到一个文件中,导致打包成功后,单文件体积过大问题
通过webpack的externals节点,配置并加载外部CDN资源,凡是声明在externals中的第三方依赖包,都不会被打包
在 vue.config.js 中进行配置
module.exports = {
    chainWebpack: config => {
        //发布模式
        config.when(process.env.NODE_ENV === ‘production‘, config => {
            config.
            entry(‘app‘).
            clear().
            add(‘./src/main-prod.js‘)
            config.set(‘externals‘, {
                vue: ‘Vue‘,
                ‘vue-router‘: ‘VueRouter‘,
                axios: ‘axios‘,
                echarts: ‘echarts‘,
                nprogress: ‘NProgress‘,
            })
        })
        //开发模式
        config.when(process.env.NODE_ENV === ‘development‘, config => {
            config.entry(‘app‘).clear().add(‘./src/main-dev.js‘)
        })
    }
}
在index.html文件中导入CDN资源
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.isProd ? ‘‘ : ‘dev - ‘ %>522人事工资管理后台网站</title>
    <% if(htmlWebpackPlugin.options.isProd){ %>
    <!--nprogress的样式表文件-->
    <link href="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css" rel="stylesheet">
    <!--element-ui的样式表-->
    <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.9.0/theme-chalk/index.css" rel="stylesheet">
    <!--js文件-->
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.9.0-rc.1/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.20.0/axios.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.9.0/index.js"></script>
    <% } %>
</head>
优化后进行打包,js文件大小减少了大半,警告减少了一个
此处遇坑:即使使用了项目依赖对应版本的element-ui的cdn,打包后显示也不正常,切换多个版本后解决
不同的打包环境下,首页内容可能会有所不同,我们可以通过插件的方式进行定制
在开发与发布环境中为isProd设置不同的值
//为html插件新增自定义属性isProd
            config.plugin(‘html‘).tap(args => {
                args[0].isProd = true
                return args
            })
在index.html中根据isProd展示不同内容
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.isProd ? ‘‘ : ‘dev - ‘ %>title</title>
    <% if(htmlWebpackPlugin.options.isProd){ %>
    <!--nprogress的样式表文件-->
    <link href="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css" rel="stylesheet">
    <!--element-ui的样式表-->
    <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.4.5/theme-chalk/index.css" rel="stylesheet">
    <!--js文件-->
    <script src="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/4.9.0-rc.1/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.20.0/axios.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.4.5/index.js"></script>
    <% } %>
</head>
打包项目时,js包巨大,影响页面加载,可以把不同路由对应组件分割成不同的代码块,当路由被访问时才加载对应组件,提升效率
安装@babel/plugin-syntax-dynamic-import开发依赖
配置在babel.config.js文件中
改造router/index.js文件
import Vue from ‘vue‘
import VueRouter from ‘vue-router‘
/*
import Login from "@/views/Login";
import Home from "@/views/Home";
import Welcome from "@/views/Welcome";
import Users from "@/views/user/users";
import Rights from "@/views/power/Rights";
import Roles from "@/views/power/Roles";
import Positions from "@/views/staff/Positions";
import Staffs from "@/views/staff/Staffs";
import Events from "@/views/event/Events";
import Attendance from "@/views/staff/Attendance";
import Reports from "@/views/report/Reports";
*/
//路由懒加载
const Login = () => import(/* webpackChunkName: "login_home_welcome" */ ‘../views/Login‘)
const Home = () => import(/* webpackChunkName: "login_home_welcome" */ ‘../views/Home‘)
const Welcome = () => import(/* webpackChunkName: "login_home_welcome" */ ‘../views/Welcome‘)
const Users = () => import(/* webpackChunkName: "users_rights_roles" */ ‘../views/user/Users‘)
const Rights = () => import(/* webpackChunkName: "users_rights_roles" */ ‘../views/power/Rights‘)
const Roles = () => import(/* webpackChunkName: "users_rights_roles" */ ‘../views/power/Roles‘)
const Attendance = () => import(/* webpackChunkName: "attendance_positions_staffs" */ ‘../views/staff/Attendance‘)
const Positions = () => import(/* webpackChunkName: "attendance_positions_staffs" */ ‘../views/staff/Positions‘)
const Staffs = () => import(/* webpackChunkName: "attendance_positions_staffs" */ ‘../views/staff/Staffs‘)
const Events = () => import(/* webpackChunkName: "events" */ ‘../views/event/Events‘)
const Reports = () => import(/* webpackChunkName: "reports" */ ‘../views/report/Reports‘)
Vue.use(VueRouter)
const routes = [
  { path: ‘/‘, redirect: ‘/login‘},//访问根路径时重定向到:/login
  { path: ‘/login‘, component: Login },
  { path: ‘/home‘, component: Home, redirect: ‘/welcome‘, children: [
      { path: ‘/welcome‘, component: Welcome },
      { path: ‘/users‘, component: Users },
      { path: ‘/rights‘, component: Rights },
      { path: ‘/roles‘, component: Roles },
      { path: ‘/positions‘, component: Positions },
      { path: ‘/staffs‘, component: Staffs },
      { path: ‘/events‘, component: Events },
      { path: ‘/attendance‘, component: Attendance },
      { path: ‘/reports‘, component: Reports }
    ]}
]
const router = new VueRouter({
  routes
})
export default router
优化后js大文件被分割成数个小文件
原文:https://www.cnblogs.com/liutaodashuaige/p/14083349.html