一、前言

这里相对于之前就没那么麻烦了,通俗点说就是使用配置文件来管理多环境,实现环境的切换。

二、实现切换

1、增加开发和生产配置文件

web根目录下,创建开发环境切换配置文件.env.dev,内容如下:

  1. NODE_ENV=development
  2. VUE_APP_SERVER=http://127.0.0.1:8880

web根目录下,创建线上环境切换配置文件.env.prod,内容如下:

  1. NODE_ENV=production
  2. VUE_APP_SERVER=https://www.baidu.com

2、修改编译和启动支持多环境

package.json中修改,就是吧原来的server做下调整,示例代码如下:

  1. {
  2. "name": "web",
  3. "version": "0.1.0",
  4. "private": true,
  5. "scripts": {
  6. "serve-dev": "vue-cli-service serve --mode dev --port 8080",
  7. "serve-prod": "vue-cli-service serve --mode prod",
  8. "build-dev": "vue-cli-service build --mode dev",
  9. "build-prod": "vue-cli-service build --mode prod",
  10. "lint": "vue-cli-service lint"
  11. },
  12. "dependencies": {
  13. "@ant-design/icons-vue": "^5.1.9",
  14. "ant-design-vue": "^2.0.0-rc.3",
  15. "axios": "^0.21.0",
  16. "vue": "^3.0.0",
  17. "vue-router": "^4.0.0-0",
  18. "vuex": "^4.0.0-0"
  19. },
  20. "devDependencies": {
  21. "@typescript-eslint/eslint-plugin": "^4.18.0",
  22. "@typescript-eslint/parser": "^4.18.0",
  23. "@vue/cli-plugin-eslint": "~4.5.0",
  24. "@vue/cli-plugin-router": "~4.5.0",
  25. "@vue/cli-plugin-typescript": "~4.5.0",
  26. "@vue/cli-plugin-vuex": "~4.5.0",
  27. "@vue/cli-service": "~4.5.0",
  28. "@vue/compiler-sfc": "^3.0.0",
  29. "@vue/eslint-config-typescript": "^7.0.0",
  30. "eslint": "^6.7.2",
  31. "eslint-plugin-vue": "^7.0.0",
  32. "typescript": "~4.1.5"
  33. }
  34. }

点击右侧npm中的刷新按钮,查看效果如下:

为了看到效果,我们在main.ts添加输出日志代码,以便验证是否修改成功,添加代码如下:

  1. console.log('环境',process.env.NODE_ENV);
  2. console.log('服务端',process.env.VUE_APP_SERVER);

知识点:

  • NODE_ENV为配置文件对应的NODE_ENV变量
  • VUE_APP_SERVER为配置文件对应的VUE_APP_SERVER变量

重新编译,启动服务,结果如下图:

3、修改axios请求地址支持多环境

为什么要修改?

因为一个系统不可能只有一个请求,再者每个请求都写全路径,这会使代码的维护成本很大,所以,这里我们采用统一的配置去维护会相对好些。

因为是全局的,所以只要在main.ts中修改即可,引用axios,并设置默认访问路径,示例代码如下:

  1. import {createApp} from 'vue';
  2. import Antd from 'ant-design-vue';
  3. import App from './App.vue';
  4. import 'ant-design-vue/dist/antd.css';
  5. import router from './router';
  6. import store from './store';
  7. import axios from 'axios';
  8. axios.defaults.baseURL=process.env.VUE_APP_SERVER;
  9. //优点就是方便开发,缺点就是打包的时候会使文件较大(但并影响什么)
  10. createApp(App).use(store).use(router).use(Antd).mount('#app')
  11. console.log('环境', process.env.NODE_ENV);
  12. console.log('服务端', process.env.VUE_APP_SERVER);

然后,我们在home修改axios的请求地址,只剩路径即可,示例代码如下:

  1. <template>
  2. <a-layout>
  3. `<a-layout-sider width="200" style="background: #fff">
  4. <a-menu
  5. mode="inline"
  6. v-model:selectedKeys="selectedKeys2"
  7. v-model:openKeys="openKeys"
  8. :style="{ height: '100%', borderRight: 0 }"
  9. >
  10. <a-sub-menu key="sub1">
  11. <template #title>
  12. <span>
  13. <user-outlined />
  14. subnav 1
  15. </span>
  16. </template>
  17. <a-menu-item key="1">option1</a-menu-item>
  18. <a-menu-item key="2">option2</a-menu-item>
  19. <a-menu-item key="3">option3</a-menu-item>
  20. <a-menu-item key="4">option4</a-menu-item>
  21. </a-sub-menu>
  22. <a-sub-menu key="sub2">
  23. <template #title>
  24. <span>
  25. <laptop-outlined />
  26. subnav 2
  27. </span>
  28. </template>
  29. <a-menu-item key="5">option5</a-menu-item>
  30. <a-menu-item key="6">option6</a-menu-item>
  31. <a-menu-item key="7">option7</a-menu-item>
  32. <a-menu-item key="8">option8</a-menu-item>
  33. </a-sub-menu>
  34. <a-sub-menu key="sub3">
  35. <template #title>
  36. <span>
  37. <notification-outlined />
  38. subnav 3
  39. </span>
  40. </template>
  41. <a-menu-item key="9">option9</a-menu-item>
  42. <a-menu-item key="10">option10</a-menu-item>
  43. <a-menu-item key="11">option11</a-menu-item>
  44. <a-menu-item key="12">option12</a-menu-item>
  45. </a-sub-menu>
  46. </a-menu>
  47. </a-layout-sider>
  48. `
  49. <a-list item-layout="vertical" size="large"
  50. :grid="{ gutter: 16, column: 3 }" :data-source="ebooks1">
  51. <template #renderItem="{ item }">
  52. <a-list-item key="item.name">
  53. <template #actions>
  54. <span v-for="{ type, text } in actions" :key="type">
  55. <component v-bind:is="type" style="margin-right: 8px"/>
  56. {{ text }}
  57. </span>
  58. </template>
  59. <a-list-item-meta :description="item.description">
  60. <template #title>
  61. <a :href="item.href">{{ item.name }}</a>
  62. </template>
  63. <template #avatar><a-avatar :src="item.cover" /></template>
  64. </a-list-item-meta>
  65. </a-list-item>
  66. </template>
  67. </a-list>
  68. </a-layout>
  69. </template>
  70. <script lang="ts">
  71. import {defineComponent, onMounted, reactive, ref, toRef} from 'vue';
  72. import axios from 'axios';
  73. import {LikeOutlined, MessageOutlined, StarOutlined} from '@ant-design/icons-vue';
  74. const listData: Record<string, string>[] = [];
  75. export default defineComponent({
  76. components: {
  77. StarOutlined,
  78. LikeOutlined,
  79. MessageOutlined,
  80. },
  81. name: 'Home',
  82. setup(){
  83. const pagination = {
  84. onChange: (page: number) => {
  85. console.log(page);
  86. },
  87. pageSize: 3,
  88. };
  89. const actions: Record<string, string>[] = [
  90. { type: 'StarOutlined', text: '156' },
  91. { type: 'LikeOutlined', text: '156' },
  92. { type: 'MessageOutlined', text: '2' },
  93. ];
  94. console.log('set up');
  95. //使用ref进行数据绑定
  96. const ebooks=ref();
  97. // 使用reactive进行数据绑定
  98. const ebooks1=reactive({books:[]})
  99. onMounted(()=>{
  100. axios.get("/ebook/list?name=").then(response => {
  101. console.log("onMounted");
  102. const data = response.data;
  103. ebooks.value = data.content;
  104. ebooks1.books = data.content;
  105. console.log(response);
  106. })
  107. })
  108. return {
  109. pagination,
  110. actions,
  111. ebooks1: ebooks,
  112. ebooks2: toRef(ebooks1, "books")
  113. }
  114. }
  115. });
  116. </script>
  117. <style scoped>
  118. .ant-layout-sider {
  119. float: left;
  120. }
  121. .ant-avatar {
  122. width: 50px;
  123. height: 50px;
  124. line-height: 50px;
  125. border-radius: 8%;
  126. margin: 5px 0;
  127. }
  128. </style>

我们再次重新编译启动,查看结果如下:

由红圈处查看,证明修改axios请求地址,实现全局配置维护成功。

知识点:

  • 多环境配置文件要放在web根目录下
  • .env.xxx,后缀xxx和package.json里的指令的–mode xxx对应
  • 增加–port参数来修改启动端口
  • 自定义变量必须以VUE_APP_开头
  • 通过设置axios.defaults.baseURL,来统一设置后端的IP端口或域名

三、写在最后

写到这,终于有一种好像入门的感觉了,就是之前有些不懂得东西,突然就明白了,学东西确实是循序渐进,坚持才是最重要的。

Vue3学习(八)之 Vue CLI多环境配置的更多相关文章

  1. [eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置

    [eShopOnContainers 学习系列] - 02 - vs 2017 开发环境配置 https://github.com/dotnet-architecture/eShopOnContain ...

  2. Ant学习-001-ant 基础知识及windows环境配置

    一.Ant 概要基础知识 Apache Ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发,用以构建应用,或结合其他开源测试工具例如 git.T ...

  3. Vue CLI 5 和 vite 创建 vue3.x 项目以及 Vue CLI 和 vite 的区别

    这几天进入 Vue CLI 官网,发现不能选择 Vue CLI 的版本,也就是说查不到 vue-cli 4 以下版本的文档. 如果此时电脑上安装了 Vue CLI,那么旧版安装的 vue 项目很可能会 ...

  4. Vue基础(环境配置、内部指令、全局API、选项、内置组件)

    1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...

  5. vue cli 3 lintOnSave 配置有时无效问题

    一个使用vue cli 3.2创建的项目,创建时未开启 lintOnSave,后来希望开启并设置为 lintOnSave: 'error',但配置不生效. 解决方法1:新创建项目(此时vue cli ...

  6. Python学习(一)安装、环境配置及IDE推荐

    Python的安装.环境配置及IDE推荐 官网:https://www.python.org/ 版本:2.x 和 3.x 差别较大:python3是不向下兼容:版本区别可参考网官网介绍 至于选择 Py ...

  7. 【Mac + Appium + Python3.6学习(三)】之IOS自动化测试环境配置

    在做这一节之前先配置我的另一篇文章所需要安装的前提准备条件:<[Mac + Appium学习(一)]之安装Appium环境前提准备> 一.安装IOS自动化测试环境 配置环境: Appium ...

  8. Node.js与VUE安装及环境配置之Windows篇

    Node.js安装及环境配置之Windows篇 https://www.cnblogs.com/zhouyu2017/p/6485265.html Node.js安装及环境配置之Windows篇htt ...

  9. vue cli 3.x 配置使用 sourceMap

    项目使用vue cli 3.x搭建,没有了配置文件,如何更方便的查找到对应的scss文件,配置项目支持sourceMap方式? 分二步走: 1.项目根目录(不是src目录,不要搞错了)添加vue.co ...

随机推荐

  1. vue 引用 tcplayer 做直播( 俩个例子,都可以用。替换直播地址即可,后端推流,前端观看。 )

    例子一比例子二更加容易被理解.另外 m3u8 也支持 webrtc 开头的直播地址. 补充JS 得下载到本地,自行引入: https://imgcache.qq.com/open/qcloud/liv ...

  2. IPSEC的实现方式

    IPSEC的实现方式 在IPSEC通信中涉及到一个重要方面,那就是如何定义要保护的数据流(又称为感兴趣流).这不仅涉及到IPSEC最终要保护哪部分数据,还关系到IPSEC的实现方式,因此有必要把感兴趣 ...

  3. Java关键字-static汇总

    1.静态变量(被static修饰的成员变量) 1-静态变量 运行时,Java虚拟机只为静态变量分配一次内存(加载类的过程中完成静态变量的内存分配) 类的内部可以在任何方法内直接访问静态变量 其他类中可 ...

  4. MySQL实战45讲(16--20)-笔记

    目录 16 | "order by"是怎么工作的? 全字段排序 rowid 排序 17 | 如何正确地显示随机消息? 内存临时表 磁盘临时表 随机排序方法 18 | 为什么这些SQ ...

  5. python库--tensorflow--数学函数

    官方API(需FQ) 中文API 方法 返回值类型 参数 说明 算数运算符 .add() Tensor x, y, name=N 加法(若x,y都为tensor, 数据类型需一致, 以下所有x,y都如 ...

  6. Go并发编程--正确使用goroutine

    目录 1. 对创建的gorouting负载 1.1 不要创建一个你不知道何时退出的 goroutine 1.1.1 不要帮别人做选择 1.1.2 不要作为一个旁观者 1.1.3 不要创建不知道什么时候 ...

  7. 2.1Java基础

    2.1.9面向对象的三大特性(携程): 封装:把一个对象的属性隐藏在对象内部,外部对象不能直接访问这个对象的内部信息.但是可以提供一些可以被外界访问的方法来操作属性.就比如我们常常创建一个类,把他的属 ...

  8. 进程代数CSP基础知识总结(Communicating sequencing process)

    进程代数(Process Algebra) Process Algebra 理论 提出者 理论名称 缩写 论文链接 简介 C. A. R. Hoare/Tony Hoare Communicating ...

  9. Apache Dolphin Scheduler - Docker Compose 详解

    Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.简称 DS,包括 Web 及若干服务,它依赖 PostgreSQL 和 Zookeep ...

  10. 单页应用后退不刷新方案(vue & react)

    引言 前进刷新,后退不刷新,是一个类似app页面的特点,要在单页web应用中做后退不刷新,却并非一件易事. 为什么麻烦 spa的渲染原理(以vue为例):url的更改触发onHashChange/pu ...