vue之浏览器title的设置

设置title中的文本,如图:
在这里插入图片描述
这里也会展示在public的index.html中使用变量用法;

1、新建setting.js文件

文件里面其他内容可根据实际情况来定;

module.exports = {

  title: '蓝湖',

  /**
   * @type {boolean} true | false
   * @description 是否显示骨架屏
   */
  showSkeleton: true,

  /**
   * @type {boolean} true | false
   * @description 是否固定头部
   */
  fixedHeader: false,

  /**
   * @type {boolean} true | false
   * @description 是否显示LOGO
   */
  sidebarLogo: true
}

2、vue.config.js文件中代码

'use strict'
const path = require('path')
// const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title || '蓝湖' // page title

// If your port is set to 80,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following methods:
// port = 8080 npm run dev OR npm run dev --port = 8080
const port = process.env.port || process.env.npm_config_port || 8080 // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  // publicPath: process.env.ENV === 'production' ? '/' : '/',
  publicPath: process.env.ENV === 'production' ? '/' : '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    host: 'localhost',//target host
    port: port,
    overlay: {
      warnings: false,
      errors: true
    },
    proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        target: 'http://localhost:3000',
        // target: 'https://czx.dossen.com',
        // target: 'http://10.0.30.121:31009',
        // target: `http://127.0.0.1:${port}/mock`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + process.env.VUE_APP_BASE_API]: ''
        }
      },
    },
    // proxy:{
    //   // 当你请求是以/api开头的时候,则我帮你代理访问到http://localhost:3000
    //   // 例如:
    //   // /api/users  http://localhost:3000/api/users
    //   // 我们真是服务器接口是没有/api的
    //   "":{
    //     target:"http://localhost:31009",
    //     changeOrigin: true,// 如果接口跨域,需要进行这个参数配置
    //     pathRewrite:{"^":""}
    //   }
    // }
    // after: require('./mock/mock-server.js')
  },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },
  // css: {
  //   extract: true // 是否使用css分离插件 ExtractTextPlugin(开启骨架屏必须这个配置)
  // },
  chainWebpack(config) {
    config.plugin('html').tap(args => {
      // 添加初始化变量
      args[0].monitorId = process.env.VUE_APP_MONITOR_ID
      return args
    })

    config.plugins.delete('preload') // TODO: need test
    config.plugins.delete('prefetch') // TODO: need test

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()

    config
      // https://webpack.js.org/configuration/devtool/#development
      .when(process.env.NODE_ENV === 'development',
        config => config.devtool('cheap-source-map')
      )

    config
      .when(process.env.NODE_ENV !== 'development',
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin')
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
              // `runtime` must same as runtimeChunk name. default is `runtime`
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({
              chunks: 'all',
              cacheGroups: {
                libs: {
                  name: 'chunk-libs',
                  test: /[\\/]node_modules[\\/]/,
                  priority: 10,
                  chunks: 'initial' // only package third parties that are initially dependent
                },
                elementUI: {
                  name: 'chunk-elementUI', // split elementUI into a single package
                  priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                },
                commons: {
                  name: 'chunk-commons',
                  test: resolve('src/components'), // can customize your rules
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true
                }
              }
            })
          config.optimization.runtimeChunk('single')
        }
      )

    // 骨架屏配置
    // config
    //   .plugin('SkeletonWebpackPlugin')
    //   .use(new SkeletonWebpackPlugin({
    //     webpackConfig: {
    //       entry: {
    //         app: resolve('src/skeleton.js'),
    //       }
    //     },
    //     minimize: true,
    //     quiet: true,
    //     router: {
    //       mode: 'history',
    //       routes: [{
    //         path: '*',
    //         skeletonId: 'common-skeleton'
    //       }]
    //     }
    //   }))
  },
}

主要代码如下


const defaultSettings = require('./src/settings.js');
const name = defaultSettings.title || '蓝湖' ; // page title

 configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    name: name,
    resolve: {
      alias: {
        '@': resolve('src')
      }
    }
  },

3、public中index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Cache-control" content="no-cache">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <!-- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> -->
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= webpackConfig.name %></title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

主要代码如下:

<title><%= webpackConfig.name %></title>

4、document.title 修改title的内容

新建文件 get-page-title.js

import defaultSettings from '@/settings'

const title = defaultSettings.title || ''

export default function getPageTitle(pageTitle) {
  if (pageTitle) {
    return `${pageTitle} - ${title}`
  }
  return `${title}`
}

路由切换时调用如上的函数

// import NProgress from 'nprogress'
// import 'nprogress/nprogress.css'
import router from './router'
import store from './store'
import { getAccessToken } from '@/utils/auth'
import { goLoginPage } from '@/utils'

import getPageTitle from '@/utils/get-page-title'

// NProgress.configure({ showSpinner: false })

const SYSTEM_APPID = process.env.VUE_APP_SYSTEM_APPID
const WHITE_LIST = ['/401']

router.beforeEach(async (to, from, next) => {
  // NProgress.start()
  
  document.title = getPageTitle(to.meta.title)
  
  // 如果url上带有code,则需要生成token
  if (to.query && to.query.code) {
    // console.log('token丢失依旧先走这里',to.query);
    const sData = {
      appID: SYSTEM_APPID,
      code: to.query.code,
      redirectUri: window.location.origin,
      timestamp: new Date().getTime(),
      version: '1.0',
    }
    const result = await store.dispatch('user/generateToken', sData)
    if (result.item.accessToken) {
      router.replace(to.path) // 去掉url上的query参数
    }
    return
  }

  const token = getAccessToken()
  if (token) {
    // 有token
    if (WHITE_LIST.indexOf(to.path) !== -1) {
      // 白名单
      next()
    } else if (store.getters.routes && store.getters.routes.length > 0) {
      await generateBreadcrumbList(from, to)
      // 已经生成路由
      next()
    } else {
      // 获取用户信息
      try {
        const { menuList, loginInformation } = await store.dispatch('user/getUserInfo', {})
        if (menuList.length) {
          const pageList = loginInformation.functionList
          const accessRoutes = await store.dispatch('permission/generateRoutes', { pageList, menuList })
          router.options.routes = accessRoutes
          router.addRoutes(accessRoutes)
          next({
            ...to,
            replace: true
          })
        } else {
          next({
            path: '/401'
          })
        }
      } catch (error) {
        // Message.error(error || '服务器异常')
        // goLoginPage()
        // NProgress.done()
      }
    }
  } else {
    // 无token
    goLoginPage()
    // NProgress.done()
  }
})

router.afterEach(() => {
  // NProgress.done()
})

const needPushList = ['/system/newTask', '/system/taskSet', '/system/history', '/system/statistics', '/system/contentSet',
  '/system/look', '/taskInfo/mytask/look', '/taskInfo/mytask/history', '/taskInfo/mytask/statistics', '/taskInfo/mytask/execute',]
function generateBreadcrumbList(from, to) {
  let breadcrumbList = store.state.permission.breadcrumbList
  let localBreadcrumbList = localStorage.getItem('breadcrumbList') && JSON.parse(localStorage.getItem('breadcrumbList')) || []

  if (needPushList.includes(to.path)) {
    if (breadcrumbList && breadcrumbList.length) {
      breadcrumbList.push(to.matched[1])
    } else if (localBreadcrumbList && localBreadcrumbList.length) {
      // vuex里没有则从缓存取
      breadcrumbList = localBreadcrumbList
    } else {
      breadcrumbList = to.matched.filter(
        item => item.meta && item.meta.title
      )
    }
  } else {
    breadcrumbList = to.matched.filter(
      item => item.meta && item.meta.title
    )
  }

  breadcrumbList = breadcrumbList.map(item => ({ meta: item.meta, name: item.name, path: item.path, redirect: item.redirect }))

  localStorage.setItem('breadcrumbList', JSON.stringify(breadcrumbList))
  store.commit('permission/SET_BREADCRUMB_LIST', breadcrumbList)
}

主要代码如下:


import getPageTitle from '@/utils/get-page-title'

router.beforeEach(async (to, from, next) => {

  document.title = getPageTitle(to.meta.title)
  
  next()
})

效果如下:
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐