みなさん、こんにちは。silverbirder です。 私の最近の興味として、Micro Frontends があります。
今、Ara-Framework というフレームワークを使った Micro Frontends のアプローチ方法を学んでいます。
Build Micro-frontends easily using Airbnb Hypernova
※ https://ara-framework.github.io/website/
Ara-Framework は、Airbnb が開発した Hypernova というフレームワークを使って、Micro Frontends を構築します。
A service for server-side rendering your JavaScript views
※ https://github.com/airbnb/hypernova
簡単に説明すると、Hypernova はデータを渡せばレンダリング結果(HTML)を返却してくれるライブラリです。 これにより、データ構築とレンダリングを明確に分離することができるメリットがあります。
Ara-Framework のアーキテクチャ図は、次のようなものです。
※ https://ara-framework.github.io/website/docs/nova-architecture
構成要素は、次のとおりです。(↑ の公式ページにも説明があります)
このように、Layout と Rendering (Nova Bindings) を明確に分けることで、独立性、スケーラビリティ性が良いのかなと感じます。 各レイアの間にキャッシュレイヤを設けることでパフォーマンス向上も期待できます。
詳しくは、公式ページをご確認下さい。
Ara-Framework を実際に使ってみました。サンプルコードは下記にあげています。 https://github.com/silverbirder/micro-frontends-sample-code-2
package.json はこんな感じです。
package.json
"scripts": {
"cluster": "cd cluster && PORT=5000 ara run:cluster --config ./views.json",
"layout": "cd layout && PORT=8080 node ./bin/www",
"proxy": "cd proxy && HYPERNOVA_BATCH=http://localhost:5000/batch PORT=8000 ara run:proxy --config ./nova-proxy.json",
"search:dev": "cd search && PORT=3000 ./node_modules/webpack/bin/webpack.js --watch --mode development",
"product:dev": "cd product && PORT=3001 ./node_modules/webpack/bin/webpack.js --watch --mode development",
"dev": "concurrently -n cluster,layout,proxy,search,product \"npm run cluster\" \"npm run layout\" \"npm run proxy\" \"npm run search:dev\" \"npm run product:dev\"",
}作っていく手順は、次の流れです。
Ara-Framework を使うためには、次の準備をしておく必要があります。
npm i -g ara-cliNova Proxy は、Nova Directive へ Proxy しますので、その host を書きます。
nova-proxy.json
{
"locations": [
{
"path": "/",
"host": "http://localhost:8080",
"modifyResponse": true
}
]
}また、Nova Proxy は、Nova Cluster へ問い合わせするため、HYPERNOVA_BATCH という変数に URL を指定する必要があります。
Nova Proxy を動かすときは、次のコマンドを実行します。
HYPERNOVA_BATCH=http://localhost:5000/batch PORT=8000 ara run:proxy --config ./nova-proxy.jsonNova Directvie は、hypernova-handlebars-directive を使います。
これは、Node.js の handlebars テンプレートエンジン(hbs)で使えます。
Express の雛形を生成します。
npx express-generator -v hbs layout詳細は割愛しますが、次の HTML ファイル(hbs)を作成します。
※ 詳しくはこちら https://ara-framework.github.io/website/docs/render-on-page
layout/index.hbs
<h1>{{title}}</h1>
<p>Welcome to {{title}}</p>
{{>nova name="Search" data-title=title }}
<script src="http://localhost:3000/public/client.js"></script>
<script src="http://localhost:3001/public/client.js"></script>{{>nova}} が Hypernova のプレースホルダーである hypernova-handlebars-directive です。
name は、Nova Bindings の名前 (後ほど説明します)、data-*は、Nova Bindings に渡すデータです。
また、script で client.js を load しているのは、CSR を実現するためです。
動かすのは、Express を動かすときと同じで、次になります。
PORT=8080 node ./bin/wwwNova Cluster は、Nova Bindings を管理します。
views.json
{
"Search": {
"server": "http://localhost:3000/batch"
},
"Product": {
"server": "http://localhost:3001/batch"
}
}Search や Product は、後ほど作成する Nova Bindings の名前です。server は、Nova Bindings が動いている URL です。
Nova Cluster を動かすときは、次のコマンドを実行します。
PORT=5000 ara run:cluster --config ./views.jsonNova Bindings を作るために、次のコマンドを実行します。
ara new:nova search -t react
ara new:nova product -t vueそこから、自動生成されたディレクトリから、少し修正したものが次のとおりです。
search/Search.jsx
import React, { Component } from 'react'
import { Nova } from 'nova-react-bridge'
class Search extends Component {
render() {
<div>
<div>Search Components!</div>
<table>
<tr>
{['🐙', '🐳', '🐊', '🐍', '🐷', '🐶', '🐯'].map((emoji, key) => {
return <td key={key}>
<Nova
name="Product"
data={{title: emoji}}/>
</td>
})}
</tr>
</table>
</div>
}
}今までの説明ではなかったですが、Nova Bridge である nova-react-bridge を使っています。
これは、Nova Directive に似ているのですが、使えるファイルが React や Vue.js などの JS フレームワークに対応しています。
そのため、Nuxt.js や Next.js,Gatsby.js にも使えるようになります。
※ わかりにくいですが、このサンプルの Nova Bridge は、CSR で動作します。SSR で動作させるためには、Nova Proxy を挟む必要が (たぶん) あります。
product/Product.vue
<template>
<div>{{title}}</div>
</template>
<script>
export default {
props: ['title']
}
</script>Nova Bindings のこれらを動作させるためには、次のコマンドを実行します。
## search
PORT=3000 ./node_modules/webpack/bin/webpack.js --watch --mode development
## product
PORT=3001 ./node_modules/webpack/bin/webpack.js --watch --mode development今まで紹介したものを同時に実行する必要があります。
そこで、concurrently を使います。
concurrently -n cluster,layout,proxy,search,product "npm run cluster" "npm run layout" "npm run proxy" "npm run search:dev" "npm run product:dev"動作として、次のような画像になります。
繰り返しますが、Ara-Framework を使うとデータ構築(Nova Directive)とレンダリング(Nova Bindings)を明確に分離できます。 また、レンダリング部分は、それぞれ独立できます。今回紹介していない API 部分は、誰がどのように管理するのか考える必要があります。
ただ、Nova Bindings で使用する CSR 用 javascript は、重複するコードが含まれてしまい、ブラウザロード時間が長くなってしまいます。 そこで、webpack 5 から使えるようになった Federation 機能を使って解決するとった手段があります。
Ara-Framework の紹介でした!
-
s※ ログイン不要で投稿できます。
※ 同じブラウザから投稿を削除できます。
0
読み込み中...
タグ「バックエンド」の記事
はじめに tRPCは、型安全なAPIを簡単に構築できるフレームワークです。開発中、バックエンドの実装を待たずに、Storybook上でフロントエンドの開発を進めたい場合、Mock Service Worker (MSW) を使用してAPIのモックを行うことができます。この記事では、maloguertin/msw-trpc を用いて、tRPC通信をMSWでモックする方法について解説します。実用例として、サンプルコードをGitHubリポジトリ silverbirder/trpc-msw-storybook-nextjs で共有しています。
Stable Diffusion は、文章を渡すと画像を生成してくれる AI で OSS です。これを自前で動かそうとすると、GPU が必要になります。
タグ「フロントエンド」の記事
趣味で作っているWebアプリにて、実装したものを細かくPull Request(以降、PR)を作成します。 PR に対して、機械的にチェックするCIチェックリストがあります。 個人的に気に入っているものを紹介します。 未使用コードの削除 実
Webmention というのを最近知りました。 名前の通り、Web 上でメンションすることができます。 受信側、送信側、どちらも対応したので感想を残そうと思います。 Webmention ざっくりと Web AサイトにBサイトのリンクをつ
ITヲタクな AI くんにピッタリな仕事の一つは、モジュールアップデート。 特に、メジャーアップデートが超助かる。 昔だったら 数ヶ月掛かった移行も、数日たらずに対応できるようになったので、 さすが ITヲタクくん。 対応してよかったフロー
タグ「成果物」の記事
仕事柄、GitHub Busy を設定しています。 この Busy には有効期限を GUI 上で登録することができます。 GitHub Busy 編集画面 困っていること 毎週水曜日に Busy を設定していて、木曜日に解除しています。 こ
2026年06月19日
個人ブログ好きの皆さんに朗報です! "個人ブログを、見つけて、読んで、シェアする" アプリ、こぶりーをリリースしました!🎉 こぶりー アプリのURLは、以下の通りです。 こぶりー - kobliy.vercel.app こちらから、個人ブ
個人サイトリニューアルを機に、記事を書く執筆環境Webアプリを用意しました。 https://silverbirder.github.io/blog/contents/20260128/ どのようなものか簡単に紹介します。 入力とプレビュー
2026年02月20日