Reputation: 472
I'm wondering if it is possible to let to a Vue App to read an external configuration file. I imagine something in which I deploy the application, ship the application with the config file; at this point it should be possibile to change the configuration in the external file without having to rebuilt the entire application. Is there someway I can achieve that result? Now I am using a separated Vuex store but i cannot change configuration without rebuilding the entire app.
I forgot to mention that the project is made with Vue CLI.
Upvotes: 14
Views: 20271
Reputation: 43
Inspired by @Hammad, but for vue.js 3 using typescript and the component API, as well as the app.provide() mechanism.
Place your configuration keys in /public/config.json
file
{
"KEY": "value"
}
Then in your /src/main.ts
file
fetch(import.meta.env.BASE_URL + 'config.json')
.then((response) => response.json())
.then((config) => {
for (const key in config) {
app.provide(key, config[key])
}
app.mount('#app')
})
Finally, to read the configuration inside components:
<script setup lang="ts">
import { inject } from 'vue'
...
const config_value = inject('KEY')
Upvotes: 3
Reputation: 1338
You can fetch config.json
from public folder and then load your Vue app in the resolve callback
Place your configuration keys in /public/config.json
file
{
"KEY": "value"
}
Then in your /src/main.js
file
fetch(process.env.BASE_URL + "config.json")
.then((response) => response.json())
.then((config) => {
Vue.prototype.$config = config
new Vue({
router,
store,
render: (h) => h(App)
}).$mount("#app")
})
You will have your configuration loaded application-wide. You can then just use
mounted() {
this.$config.KEY // "value"
}
in your Vue components
Update Nov 23, 2022 (Adding Vue 3 Version):
// VUE 3 Version
const app = createApp(App)
fetch(process.env.BASE_URL + "config.json")
.then((response) => response.json())
.then((config) => {
// either use window.config
window.config = config
// or use [Vue Global Config][1]
app.config.globalProperties.config = config
// FINALLY, mount the app
app.mount("#app")
})
Upvotes: 34
Reputation: 9455
Here's how I did it:
Create a config.js file in your public folder with the settings you want:
window.VUE_APP_API_KEY = 'blahblahblah';
Then in your public/index.html add the following lines to your head section:
<script type="text/javascript">
var cachebuster = Math.round(new Date().getTime() / 1000);
document.write('<scr' + 'ipt type="text/javascript" src="<%= BASE_URL %>config.js?cb=' + cachebuster + '"></scr' + 'ipt>');
</script>
Then in your VUE app, you just have to call window.VUE_APP_API_KEY. Simple, quick :)
Upvotes: 4
Reputation: 7097
I have a route served by node which returns a dynamically created JS files and defines a global object where I store that config. Nothing that is Vue dependent.
In index.html
:
<script type="text/javascript" src="config.js"></script>
In node
(server side):
app.get('/config.js', (request, reply) => {
reply.header('Content-Type', 'application/javascript');
reply.send(`MyConfig = ${JSON.stringify(config)}`);
});
In components (or anywhere else):
{
data: () => ({
someField: MyConfig.someField
})
}
Upvotes: 0