环境

  1. # .env.development
  2. ENV = 'development'
  3. # .env.production
  4. ENV = 'production'
  5. # 接口地址
  6. VUE_APP_BASE_API = 'http://11111'

main

  1. import { createApp } from "vue"
  2. import jsCookie from "js-cookie"
  3. import App from "./App.vue"
  4. import router from "./router"
  5. import store from "./assets/js/store"
  6. // elementUI
  7. import ElementPlus from "element-plus"
  8. import "element-plus/theme-chalk/index.css"
  9. // 重置全局样式
  10. import "./assets/css/reset.css"
  11. // 全局组件
  12. import component from "./assets/js/component"
  13. const app = createApp(App)
  14. // 接口
  15. import Http from "./assets/js/fetch"
  16. // 挂载全局
  17. app.config.globalProperties.$Cookie = jsCookie
  18. app.config.globalProperties.$Http = Http
  19. app.use(store).use(router)
  20. app.use(ElementPlus).use(component)
  21. app.mount("#app")

vue.config.js

  1. const CompressionPlugin = require('compression-webpack-plugin')
  2. module.exports = {
  3. outputDir: 'dist',
  4. publicPath: '/',
  5. productionSourceMap: false,
  6. runtimeCompiler: true,
  7. devServer: {
  8. port: 1122,
  9. open: true,
  10. disableHostCheck:true //webpack4.0 开启热更新
  11. },
  12. configureWebpack:config=> {
  13. config.plugin('CompressionPlugin').use(
  14. new CompressionPlugin({
  15. filename: '[path].gz[query]', // 压缩后的文件名(保持原文件名,后缀加.gz)
  16. algorithm: 'gzip', // 使用gzip压缩
  17. test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'), // 匹配文件名
  18. threshold: 10240, // 对超过10k的数据压缩
  19. minRatio: 0.8 // 压缩率小于0.8才会压缩
  20. })
  21. )
  22. }
  23. }

Home页面

  1. <template>
  2. <el-container>
  3. <el-aside width="200px">{{name}}</el-aside>
  4. <el-container>
  5. <el-header>Header</el-header>
  6. <el-main>main</el-main>
  7. <el-footer>Footer</el-footer>
  8. </el-container>
  9. </el-container>
  10. </template>
  11. <script>
  12. import { computed, reactive, toRefs, getCurrentInstance } from 'vue'
  13. import { useStore } from 'vuex'
  14. export default {
  15. name: "home",
  16. setup () {
  17. const store = useStore()
  18. const { proxy } = getCurrentInstance()
  19. const state = reactive({
  20. name: computed(() => store.state.login.name),
  21. })
  22. let params = {
  23. username: 'admin',
  24. password: '123456',
  25. }
  26. proxy.$Http.get("/xx", { params }).then((result) => {
  27. console.log(result)
  28. })
  29. return { ...toRefs(state) }
  30. }
  31. }
  32. </script>
  33. <style lang="scss" scoped>
  34. </style>

全局路由

  1. import { createRouter, createWebHistory } from "vue-router"
  2. import Cookies from "js-cookie"
  3. const routes = [
  4. {
  5. path: "/",
  6. name: "home",
  7. component: () => import(/* webpackChunkName: "home" */ "../views/home")
  8. },
  9. {
  10. path: "/login",
  11. name: "login",
  12. component: () => import(/* webpackChunkName: "login" */ "../views/login")
  13. }
  14. ]
  15. const router = createRouter({
  16. history: createWebHistory(process.env.BASE_URL),
  17. routes
  18. })
  19. // 全局前置守卫
  20. router.beforeEach((to, from, next) => {
  21. let isAuthenticated = Cookies.get("isAuthenticated")
  22. if (to.name !== "login" && isAuthenticated) next({ name: "login" })
  23. else next()
  24. })
  25. export default router

全局组件

  1. const modulesFiles = require.context("@/components", true, /.vue$/)
  2. const comps = modulesFiles.keys().reduce((modules, modulePath) => {
  3. const moduleName = modulePath.replace(/^.\/(.*)\.vue/, "$1")
  4. const value = modulesFiles(modulePath)
  5. modules[moduleName] = value.default
  6. return modules
  7. }, {})
  8. const subGroup = {
  9. install: (Vue) => {
  10. for (const [key, val] of Object.entries(comps)) {
  11. Vue.component(key, val)
  12. }
  13. }
  14. }
  15. export default subGroup
  16. // require 自动引入实现
  17. const files = require.context('.', false, /\.ts$/);
  18. const modules = {};
  19. files.keys().forEach((key) => {
  20. if (key === './index.ts') { return; }
  21. modules[key.replace(/(\.\/|\.ts)/g, '')] = files(key).default;
  22. });
  23. export default modules;
  24. // import 自动引入实现
  25. const files = import.meta.globEager("./*.ts")
  26. const modules: any = {};
  27. for (const key in files) {
  28. if (Object.prototype.hasOwnProperty.call(files, key)) {
  29. modules[key.replace(/(\.\/|\.ts)/g, '')] = files[key].default
  30. }
  31. }
  32. export default modules;

Axios封装

  1. import axios from "axios"
  2. const Http = axios.create({
  3. timeout: 5000,
  4. baseURL: process.env.VUE_APP_BASE_API,
  5. headers: { "Content-Type": "application/json" }
  6. })
  7. // 请求拦截器
  8. Http.interceptors.request.use(
  9. (config) => {
  10. // do something...
  11. return config
  12. },
  13. (error) => Promise.reject(error)
  14. )
  15. // 响应拦截器
  16. Http.interceptors.response.use(
  17. (response) => {
  18. // do something...
  19. return response
  20. },
  21. (error) => Promise.reject(error)
  22. )
  23. export default Http

Vuex 引入

  1. import { createStore } from "vuex"
  2. const modulesFiles = require.context("@/store", true, /.js$/)
  3. const comps = modulesFiles.keys().reduce((modules, modulePath) => {
  4. const moduleName = modulePath.replace(/^.\/(.*)\.js/, "$1")
  5. const value = modulesFiles(modulePath)
  6. modules[moduleName] = value.default
  7. return modules
  8. }, {})
  9. export default createStore({ comps })

store模板

  1. const state = {}
  2. const actions = {}
  3. const mutations = {}
  4. export default {
  5. namespaced: true,
  6. state,
  7. actions,
  8. mutations
  9. }
  1. // router.js 文件
  2. // 不需要权限的路由
  3. export const constantRouterMap = [
  4. {
  5. path: '/login',
  6. component: () => import('@/views/login/index'),
  7. hidden: true
  8. },
  9. {
  10. path: '/404',
  11. component: () => import('@/views/404'),
  12. hidden: true
  13. },
  14. {
  15. path: '*',
  16. redirect: '/404',
  17. hidden: true
  18. }
  19. ]
  20. const createRouter = () => new Router({
  21. mode: "history",
  22. routes: constantRouterMap
  23. });
  24. const router = createRouter();
  25. export function resetRouter() {
  26. const newRouter = createRouter();
  27. router.matcher = newRouter.matcher;
  28. }
  29. export default router;
  30. // 在 addRoutes的地方
  31. import {resetRouter} from '@/router'
  32. // 先重置,然后再添加
  33. resetRouter()
  34. router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表