Inertia.js Go Adapter
This is Fiber version of Inertia.js server side adapter. This adapter is still under development and yet hasn't be tested. See Development Branch for updates.
The adapter it self is a fork of Inertia.js server-side adapter for Go.
Installation
Install the package using the go get
command:
go get github.com/petaki/inertia-go
Usage
1. Create new instance
url := "http://inertia-app.test" // Application URL for redirect
rootTemplate := "./app.gohtml" // Root template, see the example below
version := "" // Asset version
inertiaManager := inertia.New(url, rootTemplate, version)
Or create with embed.FS
for root template:
import "embed"
//go:embed template
var templateFS embed.FS
// ...
inertiaManager := inertia.NewWithFS(url, rootTemplate, version, templateFS)
2. Register the middleware
mux := http.NewServeMux()
mux.Handle("/", inertiaManager.Middleware(homeHandler))
3. Render in handlers
func homeHandler(w http.ResponseWriter, r *http.Request) {
// ...
err := inertiaManager.Render(w, r, "home/Index", nil)
if err != nil {
// Handle server error...
}
}
Or render with props:
// ...
err := inertiaManager.Render(w, r, "home/Index", map[string]interface{}{
"total": 32,
})
//...
4. Server-side Rendering (Optional)
First, enable SSR with the url of the Node server:
inertiaManager.EnableSsrWithDefault() // http://127.0.0.1:13714
Or with custom url:
inertiaManager.EnableSsr("http://ssr-host:13714")
This is a simplified example using Vue 3 and Laravel Mix.
// resources/js/ssr.js
import { createInertiaApp } from '@inertiajs/vue3';
import createServer from '@inertiajs/vue3/server';
import { renderToString } from '@vue/server-renderer';
import { createSSRApp, h } from 'vue';
createServer(page => createInertiaApp({
page,
render: renderToString,
resolve: name => require(`./pages/${name}`),
setup({ App, props, plugin }) {
return createSSRApp({
render: () => h(App, props)
}).use(plugin);
}
}));
The following config creates the ssr.js
file in the root directory, which should not be embedded in the binary.
// webpack.ssr.mix.js
const mix = require('laravel-mix');
const webpackNodeExternals = require('webpack-node-externals');
mix.options({ manifest: false })
.js('resources/js/ssr.js', '/')
.vue({
version: 3,
options: {
optimizeSSR: true
}
})
.webpackConfig({
target: 'node',
externals: [
webpackNodeExternals({
allowlist: [
/^@inertiajs/
]
})
]
});
You can find the example for the SSR based root template below. For more information, please read the official Server-side Rendering documentation on inertiajs.com.
Examples
The following examples show how to use the package.
Share a prop globally
inertiaManager.Share("title", "Inertia App Title")
Share a function with root template
inertiaManager.ShareFunc("asset", assetFunc)
<script src="{{ asset "js/app.js" }}"></script>
Share a prop from middleware
func authenticate(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// ...
ctx := inertiaManager.WithProp(r.Context(), "authUserID", user.ID)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
Share data with root template
ctx := inertiaManager.WithViewData(r.Context(), "meta", meta)
r = r.WithContext(ctx)
<meta name="description" content="{{ .meta }}">
Root template
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/app.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<div id="app" data-page="{{ marshal .page }}"></div>
<script src="js/app.js"></script>
</body>
</html>
Root template with Server-side Rendering (SSR)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/app.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="favicon.ico">
{{ if .ssr }}
{{ raw .ssr.Head }}
{{ end }}
</head>
<body>
{{ if not .ssr }}
<div id="app" data-page="{{ marshal .page }}"></div>
{{ else }}
{{ raw .ssr.Body }}
{{ end }}
</body>
</html>
Example Apps
Satellite
https://github.com/petaki/satellite
Homettp
https://github.com/homettp/homettp
Waterkube
https://github.com/waterkube/waterkube
Reporting Issues
If you are facing a problem with this package or found any bug, please open an issue on GitHub.
License
The MIT License (MIT). Please see License File for more information.