Setup Golang server with Vue3 using InertiaJS
This commit is contained in:
commit
2e284cbff9
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
serve/build
|
13
go.mod
Normal file
13
go.mod
Normal file
@ -0,0 +1,13 @@
|
||||
module homeautomation/webserver
|
||||
|
||||
go 1.23.2
|
||||
|
||||
require (
|
||||
github.com/petaki/inertia-go v1.8.0
|
||||
github.com/petaki/support-go v1.10.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/gorilla/mux v1.8.1 // indirect
|
||||
github.com/romsar/gonertia v1.3.4 // indirect
|
||||
)
|
8
go.sum
Normal file
8
go.sum
Normal file
@ -0,0 +1,8 @@
|
||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||
github.com/petaki/inertia-go v1.8.0 h1:Gwt0U7fcSXoALahTYg4ovh6RKb+nJDG6kToMfzBfeTo=
|
||||
github.com/petaki/inertia-go v1.8.0/go.mod h1:roW6skZWJ8jz6RvGHOUyRipi8wb5fLu+4RmQWvV/0JE=
|
||||
github.com/petaki/support-go v1.10.0 h1:dtRkoRyU5n/Nv5LuIztoVk+PE0Bf7LzcaDqHZXAEqN0=
|
||||
github.com/petaki/support-go v1.10.0/go.mod h1:KdaZcqk+BrjYTpv+vEqUToRijzr0GssEsECN8/NSyGo=
|
||||
github.com/romsar/gonertia v1.3.4 h1:5BTBFNtKBVCRJF9vMBatvcw4CDrHpEtpJqU2aZ3Nw4M=
|
||||
github.com/romsar/gonertia v1.3.4/go.mod h1:aFqeLl9P8/zQ/aMfLz8iDj8gZWiNsooHFajj3b1VsYA=
|
6496
package-lock.json
generated
Normal file
6496
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
package.json
Normal file
27
package.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "webserver",
|
||||
"version": "1.0.0",
|
||||
"main": "server/js/App.js",
|
||||
"scripts": {
|
||||
"start": "webpack serve --config webpack.config.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"@inertiajs/inertia": "^0.11.1",
|
||||
"@inertiajs/inertia-vue3": "^0.6.0",
|
||||
"@inertiajs/vue3": "^1.2.0",
|
||||
"html-webpack-plugin": "^5.6.3",
|
||||
"vue": "^3.5.12",
|
||||
"webpack": "^5.95.0",
|
||||
"webpack-cli": "^5.1.4",
|
||||
"webpack-dev-server": "^5.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.26.0",
|
||||
"@babel/preset-env": "^7.26.0",
|
||||
"babel-loader": "^9.2.1",
|
||||
"vue-loader": "^17.4.2"
|
||||
}
|
||||
}
|
13
root.html
Normal file
13
root.html
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
|
||||
{{ .inertiaHead }}
|
||||
</head>
|
||||
<body>
|
||||
{{ .inertia }}
|
||||
<script type="module" src="build/main.bundle.js"></script>
|
||||
</body>
|
||||
</html>
|
18
serve/js/Pages/Home/index.vue
Normal file
18
serve/js/Pages/Home/index.vue
Normal file
@ -0,0 +1,18 @@
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
defineProps({ text: String })
|
||||
|
||||
const count = ref(0);
|
||||
|
||||
function increment() {
|
||||
count.value++;
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h1>Home Automation</h1>
|
||||
<h2>{{ text }} </h2>
|
||||
<span> {{ count }}</span>
|
||||
<button @click="increment">+</button>
|
||||
</template>
|
13
serve/js/app.js
Normal file
13
serve/js/app.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { createApp, h } from 'vue'
|
||||
import { createInertiaApp } from '@inertiajs/vue3'
|
||||
|
||||
createInertiaApp({
|
||||
resolve: name => require(`./Pages/${name}.vue`),
|
||||
setup({ el, App, props, plugin }) {
|
||||
createApp( { render: () => h(App, props)})
|
||||
.use(plugin)
|
||||
.mount(el)
|
||||
},
|
||||
})
|
||||
|
||||
|
34
server.go
Normal file
34
server.go
Normal file
@ -0,0 +1,34 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
inertia "github.com/romsar/gonertia"
|
||||
"log"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
func main() {
|
||||
i, err := inertia.NewFromFile("./root.html")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
mux := http.NewServeMux()
|
||||
|
||||
mux.Handle("/", i.Middleware(homeHandler(i)))
|
||||
|
||||
mux.Handle("/build/", http.StripPrefix("/build/", http.FileServer(http.Dir("./serve/build"))))
|
||||
|
||||
http.ListenAndServe(":8080", mux)
|
||||
}
|
||||
|
||||
func homeHandler(i *inertia.Inertia) http.Handler {
|
||||
fn := func(w http.ResponseWriter, r *http.Request) {
|
||||
err := i.Render(w, r, "Home/Index", inertia.Props{
|
||||
"text": "From Golang",
|
||||
})
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return http.HandlerFunc(fn)
|
||||
}
|
41
webpack.config.js
Normal file
41
webpack.config.js
Normal file
@ -0,0 +1,41 @@
|
||||
const path = require('path')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const { VueLoaderPlugin } = require('vue-loader')
|
||||
|
||||
module.exports = {
|
||||
mode: 'development',
|
||||
devtool: 'source-map',
|
||||
entry: './serve/js/app.js',
|
||||
output: {
|
||||
path: path.resolve(__dirname, 'serve/build'),
|
||||
filename: '[name].bundle.js',
|
||||
clean: true
|
||||
},
|
||||
plugins: [
|
||||
// new HtmlWebpackPlugin({
|
||||
// template: './root.html',
|
||||
// }),
|
||||
new VueLoaderPlugin(),
|
||||
],
|
||||
devServer: {
|
||||
port: 3000,
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.vue$/,
|
||||
loader: 'vue-loader',
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
exclude: /node_modules/,
|
||||
use: {
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: [ '@babel/preset-env'],
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user