inertia

package module
v0.1.0-alpha Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 3, 2023 License: MIT Imports: 6 Imported by: 0

README

Inertia.js Go Adapter

Build Status

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.

Documentation

Index

Constants

View Source
const ContextKeyProps = contextKey("props")

ContextKeyProps key.

View Source
const ContextKeyViewData = contextKey("viewData")

ContextKeyViewData key.

Variables

View Source
var (
	// ErrInvalidContextProps error.
	ErrInvalidContextProps = errors.New("inertia: could not convert context props to map")

	// ErrInvalidContextViewData error.
	ErrInvalidContextViewData = errors.New("inertia: could not convert context view data to map")

	// ErrBadSsrStatusCode error.
	ErrBadSsrStatusCode = errors.New("inertia: bad ssr status code >= 400")
)

Functions

This section is empty.

Types

type Inertia

type Inertia struct {
	// contains filtered or unexported fields
}

Inertia type.

func New

func New(url, rootTemplate, version string) *Inertia

New function.

func (*Inertia) DisableSsr

func (i *Inertia) DisableSsr()

DisableSsr function.

func (*Inertia) EnableSsr

func (i *Inertia) EnableSsr(ssrURL string)

EnableSsr function.

func (*Inertia) EnableSsrWithDefault

func (i *Inertia) EnableSsrWithDefault()

EnableSsrWithDefault function.

func (*Inertia) IsSsrEnabled

func (i *Inertia) IsSsrEnabled() bool

IsSsrEnabled function.

func (*Inertia) Location

func (i *Inertia) Location(ctx *fiber.Ctx, url string) error

Location function.

func (*Inertia) Middleware

func (i *Inertia) Middleware(next *fiber.Ctx) error

Middleware function.

func (*Inertia) Render

func (i *Inertia) Render(ctx *fiber.Ctx, component string, props fiber.Map) error

Render function.

func (*Inertia) Share

func (i *Inertia) Share(key string, value interface{})

Share function.

func (*Inertia) WithProp

func (i *Inertia) WithProp(ctx context.Context, key string, value interface{}) context.Context

WithProp function.

func (*Inertia) WithViewData

func (i *Inertia) WithViewData(ctx context.Context, key string, value interface{}) context.Context

WithViewData function.

type Page

type Page struct {
	Component string                 `json:"component"`
	Props     map[string]interface{} `json:"props"`
	URL       string                 `json:"url"`
	Version   string                 `json:"version"`
}

Page type.

type Ssr

type Ssr struct {
	Head []string `json:"head"`
	Body string   `json:"body"`
}

Ssr type.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL