Vite 中的各种模版已经集成了 dotenv,使得我们可以直接通过 .env 文件为不同的环境配置所需的环境变量。

通常,这已经能够很好的满足需求了,但有些时候,尤其是在开发(生产)环境严重受限的情况下,我们无法事先知道最终能够使用的一些配置,如接口地址等。

而打包后的文件又是经过压缩的,难以阅读,我们不可能到代码中去手动修改配置(就算手动修改,也有可能出现修改不全的情况),那如何解决呢?

本文提供一个使用 provideinject 来解决这个问题的思路。

原理

在项目中,我们肯定会需要从接口获取数据,因此我们一定安装了相应的请求工具(如 Axios),如果我们将配置文件像获取数据的方式一样从“别处”获取,然后在运行时中使用,就可以不受预设限制了。

实现过程

通过Vite 创建一个新工程,在 public 文件夹下新建一个 config.json 文件,写入所需的配置,如:

{
    "api": "//example.com",
    "attachment": "//attachment.com"
}

然后在 main.js 中使用请求工具去获取上述配置文件,获取成功后再进行初始化,并使用 provide 将配置注入:

import {createApp} from 'vue'
import App from './App.vue'
import router from './router'
import myAxios from "./assets/js/myAxios";
import axios from "axios";

axios.get("/config.json").then(({config}) => {

  myAxios.defaults.baseURL = config.api;

  const app = createApp(App);

  app.provide("config", config);

  app.use(router).mount('#app')
})

这样一来,在所有组件中都可以通过 inject 取到所有配置:

<template>
  <div>{{config.attachment}}</div>
</template>

<script setup>
  import {inject} from "vue";

  const config = inject("config");
</script>

<style lang="scss" scoped>

</style>

从而实现不受开发(生产)环境限制。

结语

此方法还有一个好处就是即使线上正在运行,也可以直接修改 config.json 中的配置,实现实时更新。

最近更新:
作者: MeFelixWang