通用vue

373 阅读1分钟

router 配置

router.beforeEach((to, from, next )=>{ //路由过滤 跳转 定向// next() })

router.afterEach(route=> { 路由操作 })

store 配置

new Vuex.Store({ modules })

**模块话的形式 区分各个 脚本的 状态 **

`const files = require.context('.', false, /.js$/)

const modules = {}

files.keys().forEach(key => { if (key === './index.js') return modules[key.replace(/(./|.js)/g, '')] = files(key).default })

export default modules`

vue.config.js 配置

` const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin const { SkeletonPlugin } = require('page-skeleton-webpack-plugin')

const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');

// const CompressionPlugin = require('compression-webpack-plugin'); // Gzip 只用在 开发阶段 const path = require('path') const isProd = process.env.NODE_ENV === 'production'

const cdn = {

  dev: {
    css: [],
    js: []
  },
  build: {
    css: [
      'https://cdn.bootcss.com/animate.css/3.7.2/animate.min.css',
      'https://cdn.bootcss.com/nprogress/0.2.0/nprogress.css'
    ],
    js: [
      'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
      'https://cdn.bootcss.com/vue-router/3.0.6/vue-router.min.js',
      'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
      'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
      'https://cdn.bootcss.com/moment.js/2.24.0/moment.min.js',
      'https://cdn.bootcss.com/nprogress/0.2.0/nprogress.js'
    ]
  }

}

const externals = { 'vue': 'Vue', 'vue-router': 'VueRouter', 'vuex': 'Vuex', 'axios': 'axios', 'moment': 'moment', 'nprogress': 'NProgress' }

const resolve = dir => { return path.join(__dirname, dir) }

const vueSkeleton = new SkeletonWebpackPlugin({

webpackConfig: { entry: { app: resolve('./src/skeleton/entry-skeleton.js') } }, quiet: true, minimize: true, router: { mode: 'history', routes: [ { path: '/login', skeletonId: 'skeleton1' }, { path: '*', skeletonId: 'skeleton2' } ] } })

const pageSkeleton = new SkeletonPlugin({ pathname: path.resolve(__dirname, './shell'), // 用来存储 shell 文件的地址 staticDir: path.resolve(__dirname, './dist'), // 最好和 output.path 相同 routes: ['/login', '/total'], // 将需要生成骨架屏的路由添加到数组中 port: '8988' })

const plugins = [ // page-skeleton // pageSkeleton // vue-skeleton 骨架屏 vueSkeleton // new CompressionPlugin({ // 文件开启Gzip,也可以通过服务端(如:nginx)(github.com/webpack-con…) // filename: '[path].gz[query]', // algorithm: 'gzip', // test: new RegExp('\.(' + ['js', 'css'].join('|') + ')$'), // threshold: 8192, // minRatio: 0.8 // }) ]

if (!isProd) { plugins.push(new BundleAnalyzerPlugin()) }

module.exports = {

// baseUrl: BASE_URL,

// 如果不需要使用eslint,把lintOnSave设为false即可 lintOnSave: true,

chainWebpack: config => {

config.resolve.alias
  .set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components'))
  .set('pages', resolve('src/pages')) // key,value自行定义,比如.set('@@', resolve('src/components'))
  .set('common', resolve('src/components'))
  .set('utils', resolve('src/utils'))
  .set('mixins', resolve('src/mixins'))
config.module.rules.delete('svg')
config.module
  .rule('svg-sprite-loader')
  .test(/\.svg$/)
  .include
  .add(resolve('src/components/SvgIcon'))
  .end()
  .use('svg-sprite-loader')
  .loader('svg-sprite-loader')
  .options({
    symbolId: 'icon-[name]'
  })
config.plugin('html').tap(args => {
  if (isProd) {
    args[0].cdn = cdn.build
  } else {
    args[0].cdn = cdn.dev
  }
  return args
})
// if (process.env.NODE_ENV !== 'development') {
//   config.plugin('html').tap(opts => {
//     opts[0].minify.removeComments = false
//     return opts
//   })
// }

// console.log(config, 'chainWebpack')
// 移除 prefetch 插件
config.plugins.delete('prefetch')
// 移除 preload 插件
config.plugins.delete('preload');

},

// 打包时不生成.map文件

productionSourceMap: !isProd,

devServer: {

open: false,
port: 8083,
proxy: {
  '/develop': {
    
    target: '*******',
    // target: 'http://192.168.0.152:60000',
    ws: true,
    changeOrigin: true,
    pathRewrite: {
      '^/develop': ''
    }
  }
}

},

configureWebpack: {

externals: isProd ? externals : {},
// externals: {
//   'vue': 'Vue',
//   'vue-router': 'VueRouter',
//   'vuex': 'Vuex',
//   'axios': 'axios',
//   'moment': 'moment',
//   'nprogress': 'NProgress'
// },
plugins

},

css: {

// css拆分ExtractTextPlugin插件,默认true - 骨架屏需要为true
// 是否使用css分离插件 ExtractTextPlugin
// extract: true,
extract: isProd,
// 开启 CSS source maps?
sourceMap: !isProd,
// 启用 CSS modules for all css / pre-processor files.
modules: false

},

pwa: {

iconPaths: {
  favicon32: 'favicon.ico',
  favicon16: 'favicon.ico',
  appleTouchIcon: 'favicon.ico',
  maskIcon: 'favicon.ico',
  msTileImage: 'favicon.ico'
}

}

} `

axios 基本配置

import { baseUrl } from './config'

import axios from 'axios'

import { message } from 'ant-design-vue'

class HttpRequest {

  constructor(baseUrl = '') {
    this.baseUrl = baseUrl
  }
  getDefaultConfig() {
    const config = {
      baseURL: this.baseUrl,
      method: 'post',
      timeout: 30000,
      headers: {
        // 'Content-Type': 'application/x-www-form-urlencoded',
        'X-Requested-With': 'XMLHttpRequest'
      }
    }
    return config
}
  interceptors(instance, url) {
    instance.interceptors.request.use(config => {
        // bus.$loading.open()
        const token = localStorage.getItem('token')
         if (token) {
            config.headers.Authorization = 'Bearer ' + token.replace(/"/g, '')
        }
        // console.log(config)
        return config
    }, error => {
      // alert('error')
      return Promise.reject(error)
    })
    instance.interceptors.response.use(res => {
      // console.log(`response`)
      // console.log(res)
      if (res.status >= 200 && res.status < 300) {
        if (res.data.errcode === 2002) {
          message.warning(res.data.errmsg)
          bus.$emit('logout')
        }
        return res.data
      }
      return res
    }, err => {
      console.dir(err)
      if (err.message.indexOf('timeout') > -1) {
        // 判断请求异常信息中是否含有超时timeout字符串
        message.error('请求超时')
      }
      return err
    })
  }
  request(options) {
    const instance = axios.create()
    options = Object.assign(this.getDefaultConfig(), options)
    this.interceptors(instance, options.url)
    return instance(options)
}

}

const service = new HttpRequest(baseUrl)

export default service

基本ajax调用 {

    /**
     * @description Object => formData
     * @param {*} data
     */
export const makeFormData = data => {
  const fd = new FormData()
  for (const key of Object.keys(data)) {
    fd.append(key, data[key])
  }
  return fd
}

export const getDataById = (url, data) => {
  return service.request({
    url: url + '/' + data,
    method: 'get'
  })
}

export const getData = (url, params) => {
  return service.request({
    url,
    params,
    method: 'get'
  })
}

export const getParams = (url, params) => {
  return service.request({
    url,
    params,
    method: 'get'
  })
}
export const postData = (url, data) => {
  return service.request({
    url,
    data
  })
}
export const uploadData = (url, data, method = 'post') => {
  // 如果是upload   数据应该是  formData 形式
  return service.request({
    url,
    method,
    data: makeFormData(data)
  })
}

export const postDataById = (url, id, data) => {
  return service.request({
    url: url + '/' + id,
    data
  })
}
export const deleteData = (url, id) => {
  return service.request({
    url: url + '/' + id,
    method: 'delete'
  })
}

export const deleteBindThird = (url, data) => {
  return service.request({
    url: url,
    data,
    method: 'delete'
  })
}

export const patchData = (url, data) => {
  return service.request({
    url,
    data,
    method: 'patch'
  })
}
export const putData = (url, data) => {
  return service.request({
    url,
    data,
    method: 'put'
  })
}
export const putDataById = (url, data) => {
  const { id } = data
  delete data.id
  return service.request({
    url: url + '/' + id,
    data,
    method: 'put'
  })
}
export const deleteDataById = (url, data) => {
  const { id } = data
  delete data.id
  return service.request({
    url: url + '/' + id,
    data,
    method: 'delete'
  })
}

export const downLoadFile = (url, data, method = 'post') => {
  return service.request({
    url,
    data,
    method,
    responseType: 'blob'
  })
}
export const getDownLoadFile = (url, params, method = 'get') => {
  return service.request({
    url,
    params,
    method,
    responseType: 'blob'
  })
}

}