Nova Cluster
Nova Cluster is a Micro-frontends (Nova) aggregator to enable Nova Proxy to resolve the views it needs from multiple Microfrontends without know which one is responsible to render them. You can see the detailed explanation about the architecture design here.
Setup Environment
We'll create two simple Micro-frontends, foo
and bar
.
Foo Nova
Creates foo
Nova:
ara new:nova -t vue foo
The previous command creates a basic Micro-frontent (Nova) using Vue.js into the foo
folder.
We need to modify the Example.vue
component adding a prefix in the title.
src/components/Example.vue
<template>
<h1>FOO - {{title}}</h1>
</template>
<script>
export default {
props: ['title']
}
</script>
Finally we need to change the view name from Example
to Foo
in the server entry point.
src/index.js
...
import Example from './components/Example.vue'
hypernova({
...
getComponent (name) {
if (name === 'Foo') {
return renderVue(name, Vue.extend(Example))
}
},
....
})
Runs Nova service on 3001
port
PORT=3001 npm run dev
More details about how test the Nova service here.
Bar Nova
Creates bar
Nova:
ara new:nova -t vue bar
The previous command creates a basic Micro-frontent (Nova) using Vue.js into the bar
folder.
We need to modify the Example.vue
component adding a prefix in the title.
src/components/Example.vue
<template>
<h1>BAR - {{title}}</h1>
</template>
<script>
export default {
props: ['title']
}
</script>
Finally we need to change the view name from Example
to Bar
in the server entry point.
src/index.js
...
import Example from './components/Example.vue'
hypernova({
...
getComponent (name) {
if (name === 'Bar') {
return renderVue(name, Vue.extend(Example))
}
},
....
})
Runs Nova service on 3002
port
PORT=3002 npm run dev
More details about how test the Nova service here.
Configure Nova Cluster
Nova Cluster needs a configuration file in order to resolve the views with their Nova services.
Creates a file name views.json
in the root folder with the following configuration.
{
"Foo": {
"server": "http://localhost:3001/batch"
},
"Bar": {
"server": "http://localhost:3002/batch"
}
}
Run and Test Nova Cluster
Runs Nova Cluster on http://0.0.0.0:8000 using the CLI.
ara run:cluster --config ./views.json
Once the Nova Cluster is running we can make a POST
request to http://localhost:8000/batch using a payload like:
{
"foo": {
"name": "Foo",
"data": {
"title": "Ara Framework"
}
},
"bar": {
"name": "Bar",
"data": {
"title": "Ara Framework"
}
}
}
The results
property in the response contains the views rendered by the Foo
and Bar
services. In this way we can on-board a new Micro-frontend without modify the underlying services.
Example:
{
"results": {
"bar": {
"name": "Bar",
"html": "<div data-hypernova-key=\"Bar\" data-hypernova-id=\"7ccb575c-53c6-4598-bbd6-b42df842ef9e\"><h1 data-server-rendered=\"true\">Bar - Ara Framework</h1></div>\n<script type=\"application/json\" data-hypernova-key=\"Bar\" data-hypernova-id=\"7ccb575c-53c6-4598-bbd6-b42df842ef9e\"><!--{\"title\":\"Ara Framework\"}--></script>",
"duration": 0.986263,
"success": true,
"error": {
"name": "",
"message": ""
}
},
"foo": {
"name": "Foo",
"html": "<div data-hypernova-key=\"Foo\" data-hypernova-id=\"4f2348e4-e776-4643-99ca-279db8950343\"><h1 data-server-rendered=\"true\">FOO - Ara Framework</h1></div>\n<script type=\"application/json\" data-hypernova-key=\"Foo\" data-hypernova-id=\"4f2348e4-e776-4643-99ca-279db8950343\"><!--{\"title\":\"Ara Framework\"}--></script>",
"duration": 0.360844,
"success": true,
"error": {
"name": "",
"message": ""
}
}
}
}
Integrating with Nova Proxy
Set the HYPERNOVA_BATCH
env variable using the Nova Cluster endpoint instead of a Nova service endpoint.
export HYPERNOVA_BATCH=http://localhost:8000/batch
It's transparent for Nova Proxy because the communication interface between Nova Proxy with Nova Service and Nova Cluster are the same.
More details how to make server-side includes using Nova Proxy here.