本文包括如下几个部分:

  • 初始化环境变量文件

  • JS 配置文件初始化:如是否开启 Mock 数据、加载本地菜单、URL 请求路径等;

  • 国际化文件初始化:初始化国际化文件的结构;

  • 整合 Element UI: 将 Element UI 添加到工程中;

  • 全局样式初始化:初始化全局样式、通用样式。

1 切换新分支

1.1 查看分支

1、 仅查看本地分支:

git branch
 

本地分支信息:

-MacBook-Pro dscloudy-admin-single % git branch                   
* master
 

2、 查看本地和远程分支:

 git branch -a
 

显示信息如下:

 -MacBook-Pro dscloudy-admin-single % git branch -a
* master
  remotes/gitee_origin/master
  remotes/github_origin/master
 

3、 仅查看远程分支:

git branch -r
 

显示信息如下:

-MacBook-Pro dscloudy-admin-single % git branch -r
  gitee_origin/master
  github_origin/master
 

1.2 开启本地新分支

当前本地只有一个 master 分支,现在基于这个分支,开启一个新分支 01_GlobalInit (全局初始化)。待本文结束后,再将其合并到 master 分支上,并将新分支 01_GlobalInitmaster 都推送到 Gitee 和 GitHub。

切换新分支的命令:

 git checkout -b 01_GlobalInit
 

再执行 git branch 命令,查看本地分支,显示:

 -MacBook-Pro dscloudy-admin-single % git branch
* 01_GlobalInit
  master
 

* 表示当前位于哪个分支。

2 初始化环境变量文件

在 package.json 的 scripts 节点中,配置了 servebuild ,默认情况下,serve 对应模式 development, build 对应 模式 production。 咱可以自定义模式,每个模式对应一套环境。 在高逼格的开发团队中,通常会有四套环境:

  • 开发环境 dev

  • sit

  • uat

  • 生产环境 prod

    由于每套环境对应的请求路径或其他配置不同,故每套环境可对应各自的环境变量文件。此处先简化为 dev 环境 和 sit 环境。以后上线时如果有 uat 与 prod 环境,操作完全一样,复制环境变量文件 并修改配置即可。

    2.1 创建环境变量文件

    在项目的根目录(与 src 平级),创建 dev 模式的环境变量文件,文件名为: .env.dev,里面的内容:

    NODE_ENV = dev
    VUE_APP_URL_GATEWAY = "http://dev-gateway"

    在同样的位置,继续创建 sit 默认的环境变量文件,文件名为:env.sit,里面的内容:

    NODE_ENV = sit
    VUE_APP_URL_GATEWAY = "http://sit-gateway"

    (上面的 Gateway 并不是真实的,仅此处演示环境变量使用。后面会替换为真实路径)

    2.2 修改 package.json 脚本

    1、 修改 scripts 中的 serve 命令,修改为:

    "serve": "vue-cli-service serve --mode dev",

    2、 添加 scripts 命令:

    "serve_sit": "vue-cli-service serve --mode sit",

    2.3 测试环境变量

    1、 在 main.js 中,测试环境变量:

    console.log(process.env)

    (测试完后记得自己删除这个语句)

    2、 点击按钮启动应用 (npm run serve),刷新页面,控制台打印:

    {NODE_ENV: "dev", VUE_APP_URL_GATEWAY: "http://dev-gateway", BASE_URL: "/"}

    3、 停止应用后,执行命令 npm run serve_sit, 刷新页面,控制台打印:

    {NODE_ENV: "sit", VUE_APP_URL_GATEWAY: "http://sit-gateway", BASE_URL: "/"}

    测试发现已经完美通过环境变量文件在不同模式下配置不同变量。需要注意的是,自己定义的变量,必须以 VUE_APP_ 开头,否则无法获取到对应的值。

    3 JS 配置文件

    config/ 目录下创建两个文件: index.js, urls.js。

    src
    |-- config
    |-- index.js
    |-- urls.js
    |-- ...

    3.1 config/index.js

    index.js 存放全局的配置,如是否开启 Mock 请求、是否使用本地 Mock 菜单、分页请求默认每页的大小等,代码如下:

    /**
    * 全局配置文件
    */
    const config = {
    /**
    * 是否使用 Mock 请求
    */
    isMock: true, /**
    * 是否使用本地 Mock 菜单
    */
    isMockMenu: false, /**
    * 网络请求的超时时间
    */
    timeout: 30 * 1000, /**
    * 请求的 host (联调时方便直连后端每个微服务)
    */
    host: {
    core: `${process.env.VUE_APP_URL_GATEWAY}/core`, // 核心模块
    demo: `${process.env.VUE_APP_URL_GATEWAY}/demo`, // 演示模块
    system: `${process.env.VUE_APP_URL_GATEWAY}/system` // 系统管理模块
    }, /**
    * 路由的白名单
    */
    whiteList: []
    } export default config

    3.2 config/urls.js

    import config from '@/config/index'
    
    /**
    * 系统所有请求的请求路径
    * @type {{core: {}}}
    */
    const urls = {
    /**
    * 核心模块
    */
    core: {
    test: `${config.host.core}/test`
    }, /**
    * 演示模块
    */
    demo: {
    test: `${config.host.demo}/test`
    }, /**
    * 系统管理模块
    */
    system: {
    test: `${config.host.system}/test`
    }
    } export default urls

    3.3 测试

    依然在 main.js 进行测试:

    import urls from '@/config/urls'
    ....
    console.log(urls.core.test)

    刷新页面,可以看见浏览器的输出:

    http://dev-gateway/core/test

    4 国际化配置

    4.1 添加依赖

    vue 提供了 vue-i18n 依赖来支撑国际化的实现。用户可以手动切换语言 locale, locale 信息存储在 cookie 中。 首先为项目分别添加 vue-i18n 和 js-cookie 依赖:

    npm install vue-i18n --save
    npm install js-cookie --save

    4.2 添加语言文件

    src/i18n 目录下,分别创建 en.jszh.js,分别存放英文和中文:

    zh.js :

    export default {
    route: {
    test: '测试'
    },
    valid: {
    notNull: ' 不能为空',
    minLength: ' 最小长度是 ',
    maxLength: ' 最大长度是 ',
    lengthIs: ' 长度必须是 '
    },
    icon: {
    changeLanguage: '切换语言',
    errorLog: '错误日志',
    screenFull: '全屏查看',
    screenNormal: '退出全屏'
    },
    tags: {
    closeCurrent: '关闭当前',
    closeOther: '关闭其他',
    closeAll: '关闭全部'
    },
    login: {
    pageTitle: '微服务微前端基础框架',
    loginTitle: '用户登录',
    usernamePlaceHolder: '请输入用户名',
    passwordPlaceHolder: '请输入密码',
    checkCodePlaceHolder: '请输入验证码',
    login: '登录',
    username: '用户名',
    password: '密码',
    checkCode: '验证码',
    loginError: '登录失败',
    userInfoError: '获取用户信息失败',
    noFunctionPermission: '该用户没有菜单权限'
    },
    home: {
    changePwd: '修改密码',
    logout: '退出系统',
    test: '测试'
    }
    }

    复制 zh.js 的内容到 en.js,将里面的中文文本都修改为英文文本:

    export default {
    route: {
    test: 'test'
    },
    valid: {
    notNull: ' Not Blank',
    minLength: ' min length is ',
    maxLength: ' max length is ',
    lengthIs: ' length must '
    },
    icon: {
    changeLanguage: 'Change Language',
    errorLog: 'View Error Logs',
    screenFull: 'View Full Screen',
    screenNormal: 'Exit Full Screen'
    },
    tags: {
    closeCurrent: 'close current tab',
    closeOther: 'close other tabs',
    closeAll: 'close all tabs'
    },
    login: {
    pageTitle: 'Member System Platform',
    loginTitle: 'MSP User Sign In',
    usernamePlaceHolder: 'Please input username',
    passwordPlaceHolder: 'Please input password',
    checkCodePlaceHolder: 'Please input check code',
    login: 'SIGN IN',
    username: 'Username',
    password: 'Password',
    checkCode: 'Check Code',
    loginError: 'Sign Error',
    userInfoError: 'Get User Info Error',
    noFunctionPermission: 'the account has no function permission'
    },
    home: {
    changePwd: 'Change Password',
    logout: 'Sign Out',
    test: 'test'
    }
    }

    后续不断往这两个文件中扩充文本。国际化的内容,也可以分散在各个模块中,然后在此处引入。

    4.3 添加国际化的入口文件

    src/i18n/ 下创建 index.js, 该文件用来配置 i18n。

    src/i18n/index.js

    import Vue from 'vue'
    import VueI18n from 'vue-i18n'
    import cookie from 'js-cookie'
    import enLocale from './en'
    import zhLocale from './zh' Vue.use(VueI18n) const messages = {
    en: {
    ...enLocale
    },
    zh: {
    ...zhLocale
    }
    } /**
    * 获取浏览器的语言
    */
    const getBrowserLang = function () {
    const browserLang = navigator.language ? navigator.language : navigator.browserLanguage
    let defaultBrowserLang = ''
    if (browserLang.toLowerCase() === 'cn' ||
    browserLang.toLowerCase() === 'zh' ||
    browserLang.toLowerCase() === 'zh-cn') {
    defaultBrowserLang = 'zh'
    } else {
    defaultBrowserLang = 'en'
    }
    return defaultBrowserLang
    } /**
    * 获取语言。
    *
    * 如果用户设置过语言,使用用户设置的;
    * 如果没有设置,使用浏览器语言。
    */
    const getLanguage = () => {
    const lang = cookie.get('language')
    if (lang) {
    return lang
    }
    const defaultLang = getBrowserLang()
    cookie.set('language', defaultLang)
    return defaultLang
    } const i18n = new VueI18n({
    locale: getLanguage(),
    messages,
    // 当没有 key 值时,不发出警告
    silentTranslationWarn: true
    }) export default i18n

    4.4 在 main.js 中引入

    import i18n from '@/i18n'
    ...
    new Vue({
    router,
    store,
    i18n,
    render: h => h(App)
    }).$mount('#app')

    4.5 测试

    在 main.js 中,测试国际化是否生效:

    console.log(i18n.t('route.test'))

    手动切换 src/i18n/index.js 中的 locale 测试是否会自动切换语言。

    5 Element UI

    5.1 添加依赖

    npm install element-ui --save

    5.2 引入 Element UI

    修改 main.js 文件,引入 element ui:

    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css' ... Vue.use(ElementUI, {
    size: 'mini',
    i18n: (key, value) => i18n.t(key, value)
    })

    5.3 修改国际化配置

    由于 Element UI 组件中也有一些文本,也支持国际化,故在国际化配置文件中需要引入 Element UI 中的这些信息。修改 src/i18n/index.js:

    import elementEnLocale from 'element-ui/lib/locale/lang/en'
    import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' ... const messages = {
    en: {
    ...enLocale,
    ...elementEnLocale
    },
    zh: {
    ...zhLocale,
    ...elementZhLocale
    }
    } ...

    5.4 测试

    src/components/HelloWorld.vue 中,使用 Element UI 的组件,测试 Element UI 是否引入成功:

    <template>
    <div class="hello">
    <el-button>Test Button</el-button>
    </div>
    </template>

    6 全局样式

    全局样式包括几个部分:

    • 屏蔽浏览器差异的样式,我使用 normalize.css

    • 基础样式(index):对全局的设置和公共样式类

    • 变量配置文件(config): 设置字号颜色的变量

    • 可复用的样式(mixin):如弹性布局、图片样式等

    • 覆盖 element ui 的样式。

    6.1 添加 normalize.css

    npm install normalize.css --save

    6.2 config.scss

    src/assets/scss 下新建变量配置文件:config.scss

    /* 尺寸 */
    $pageMinWidth: 1080px;
    $pageMinHeight: 600px;
    $topNavHeight: 54px;
    $leftWidthMax: 220px;
    $leftWidthMin: 65px;
    $pagePadding: 12px;
    $inputRadius: 4px;
    $commonPadding: 10px; /* 主颜色 */
    $colorM1: #4B9ADE !default;
    $colorM2: #034278 !default;
    $colorM3: #9CC7EC !default;
    $colorM4: #1E63A0 !default; /* 其他颜色 */
    $color1: #203025 !default;
    $color2: #333333 !default;
    $color3: #69707E !default;
    $color4: #9CA6B9 !default;
    $color5: #FBFBFB !default;
    $color6: #FFFFFF !default;
    $color7: #F4F4F4 !default;
    $color8: #E9E9E9 !default;
    $color9: #4C8DC5 !default;
    $color10: #E6E4E4 !default;
    $color11: #447DAD !default;
    $color12: #255884 !default;
    $color13: #c1c1c1 !default;
    $color14: #1A2225 !default;
    $color15: #13181A !default; /* 字号大小 */
    $fontA: 28px !default;
    $fontB: 24px !default;
    $fontC: 20px !default;
    $fontD: 18px !default;
    $fontE: 16px !default;
    $fontF: 14px !default;
    $fontG: 12px !default;
    $fontH: 10px !default;
    $fontI: 8px !default;
    $fontJ: 6px !default; $asideDivider: 1px solid rgba($color8, 0.17);
    $asideHoverBg: rgba($colorM3, 0.1) !important; /* 导出给 JS 使用 */
    :export {
    colorM1: $colorM1;
    colorM2: $colorM2;
    colorM3: $colorM3; color1: $color1;
    color2: $color2;
    color3: $color3;
    color4: $color4;
    color5: $color5;
    color6: $color6; topNavHeight: $topNavHeight;
    leftWidthMax: $leftWidthMax;
    leftWidthMin: $leftWidthMin;
    }

    6.3 mixin.scss

    src/assets/scss 下新建变量配置文件:mixin.scss

    @import "config";
    
    /** flex 布局 */
    @mixin flex($hov: space-between, $col: center) {
    display: flex;
    justify-content: $hov;
    align-items: $col;
    } @mixin flex-col($hov: space-between, $col: center) {
    @include flex($hov, $col);
    flex-direction: column;
    } @mixin img($width, $height) {
    width: $width;
    height: $height; img {
    width: 100%;
    height: 100%;
    }
    } @mixin container() {
    border: 1px solid $color7;
    box-shadow: 0 1px 7px 0 rgba(0,0,0,0.04);
    box-sizing: border-box;
    }

    config.scss 定义的变量、mixin.scss 定义的样式,在后面都会使用到,可以简化代码、统一样式风格、快速修改主题。

    6.4 element-ui.scss

    src/assets/scss 下新建变量配置文件:element-ui.scss

    @import "config";
    
    /* 改变主题色变量 */
    $--color-primary: $colorM2; $--font-path: '~element-ui/lib/theme-chalk/fonts'; @import "~element-ui/packages/theme-chalk/src/index";

    6.5 index.scss

    src/assets/scss 下新建变量配置文件:index.scss

    在 index.scss 中引入上面各种 scss 文件,并定义一些全局样式:

    @import "config";
    @import "element-ui";
    @import "~normalize.css/normalize.css"; html, body, #app, .site {
    width: 100%;
    height: 100%;
    min-width: $pageMinWidth;
    min-height: $pageMinHeight;
    overflow: scroll;
    margin: 0 !important;
    padding: 0 !important;;
    font-family: "PingFangSC-Regular", "Helvetica Neue", Helvetica, Arial, "Hiragino Sans GB", "Heiti SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "sans-serif";
    background-color: $color10;
    } .mt10 {
    margin-top: 10px !important;
    }
    .full-width {
    width: 100%;
    }

    6.6 添加到 main.js

    修改 main.js,将之前引入的 Element UI 的样式删除 (删除下面的语句):

    import 'element-ui/lib/theme-chalk/index.css'

    并引入 index.scss:

    import '@/assets/scss/index.scss'

    main.js 完整代码如下:

    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from './store'
    import i18n from '@/i18n'
    import ElementUI from 'element-ui'
    import '@/assets/scss/index.scss' Vue.use(ElementUI, {
    size: 'mini',
    i18n: (key, value) => i18n.t(key, value)
    }) Vue.config.productionTip = false new Vue({
    router,
    store,
    i18n,
    render: h => h(App)
    }).$mount('#app')

    刷新页面,程序能正常运行,界面如下则完成本文内容:

    7 合并代码

    提交代码:

    git add .
    git cz
    [准备工作] 全局设置

    合并到 master 分支:

    git checkout master
    git merge 01_GlobalInit

    将本地分支分别全部推送到 Gitee 和 GitHub

    git push --all gitee_origin
    git push --all github_origin

    欢迎关注我的个人公众号,留言可加我个人微信或交流问题

Vue企业级优雅实战03-准备工作04-全局设置的更多相关文章

  1. Vue企业级优雅实战-00-开篇

    从2018.1.开始参与了多个企业的中台建设,这些中台的技术选型几乎都是基于 Spring Cloud 微服务架构 + 基于 Vue 全家桶的前端.我前后端架构及开发我几乎各占一半的精力,在企业级前端 ...

  2. Vue企业级优雅实战05-框架开发01-登录界面

    预览本文的实现效果: # gitee git clone git@gitee.com:cloudyly/dscloudy-admin-single.git # github git clone git ...

  3. Vue企业级优雅实战02-准备工作03-提交 GIT 平台

    代码管理.版本管理是件老大难的事情,尤其多人开发中的代码冲突.突击功能时面临的 hotfix 等.本文只是简单说说如何将一套代码提交到两个 Git 平台(GitHub.GitEE)上.其他的 Git ...

  4. Vue企业级优雅实战04-组件开发01-SVG图标组件

    (后续的文章 公众号会提前一周更新,欢迎关注文末的微信公众号:程序员搞艺术) 预览本文的实现效果: # gitee git clone git@gitee.com:cloudyly/dscloudy- ...

  5. Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

    前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...

  6. Vue3 企业级优雅实战 - 组件库框架 - 2 初始化 workspace-root

    上文已经搭建了 pnpm + monorepo 的基础环境,本文对 workspace-root 进行初始化配置,包括:通用配置文件.公共依赖.ESLint. 1 通用配置文件 在项目 根目录 下添加 ...

  7. Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境

    前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库.example.文档.cli.本文内容是搭建 组件库的开发环境. 1 packages 目录 前面在项目根目录下创建了 ...

  8. Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构

    在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...

  9. 如何优雅的使用vue+vux开发app -03

    如何优雅的使用vue+vux开发app -03 还是一个错误的示范,但是离优雅差的不远了... <!DOCTYPE html> <html> <head> < ...

随机推荐

  1. 极简 Node.js 入门 - Node.js 是什么、性能有优势?

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  2. Android Studio--Activity实现跳转功能

    首先,完成一个布局文件,名字就叫做activity_text_view.xml <?xml version="1.0" encoding="utf-8"? ...

  3. JavaScript按位运算符~

    1. JavaScript按位运算符 Bit operators work on 32 bits numbers. 2. JavaScript按位运算符~ 值得注意的是,在JavaScript中,~5 ...

  4. Java 集合框架综述,这篇让你吃透!

    一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...

  5. 3、Template Method 模板方法 行为型设计模式

    1.了解模板方法 1.1 模式定义 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中. 它的本质就是固定算法框架. 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不 ...

  6. mongodb 4.0副本集搭建

    近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下 ...

  7. 我能想到的最浪漫的Java网络教程之Socket,三步到位!!!

    简说 如果要使用Java中的TCP/IP通过网络连接到服务器,则需要创建一个java.net.Socket对象以连接到服务器.如果使用JavaNIO,则还可以在JavaNIO中创建SocketChan ...

  8. C#LeetCode刷题之#226-翻转二叉树(Invert Binary Tree)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4080 访问. 翻转一棵二叉树. 输入: 4    /   \   ...

  9. C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...

  10. kereas 实现鸢尾花分类

    import tensorflow as tf from sklearn import datasets import numpy as np x_train=datasets.load_iris() ...