Fragments middleware for Fiber enables building microservices for the frontend.
A <fragment>
symbolizes a part of a template that can be served by a singular microservice. Thus, making a fragment the contract between different services and teams within a large engineering organization. The middleware concurrently fetches those parts from the service and replaces it in the template. It supports GET
and POST
HTTP methods to fetcht the content. Related resources like CSS or JavaScript are injected via the HTTP LINK
entity header field. A <fragment>
can occure in the body
element or the header
element. See Example to learn more about using fragments.
Tailor by Zalando is prior art for this middleware.
A fragment
will be hybrid-polymorphic (if this is a thing). On the server it is parsed and evaluate by the middleware. 🦄 In the browser it will be a web component that received data from the middleware (this is still work in progress
src
The source to fetch for replacement in the DOMmethod
can be ofGET
(default) orPOST
.primary
denotes a fragment that sets the response code of the pageid
is an optional unique identifier (optional)ref
is an optional forward reference to anid
(optional)timeout
timeout of a fragement to receive in milliseconds (default is300
)deferred
is deferring the fetch to the browserfallback
is the fallback source in case of timeout/error on the current fragment
Import the middleware package this is part of the Fiber web framework.
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/html"
"github.com/github/fiber-fragments"
)
After you initiate your Fiber app, you can plugin in the fragments middleware. The middleware draws the templates for the fragments to load from the template engine. Thus it supports using all template engines supported by the Fiber team.
// Create a new engine
engine := html.New("./views", ".html")
// Pass the engine to the Views
app := fiber.New(fiber.Config{
Views: engine,
})
// Associates the route with a specific template with fragments to render
app.Get("/index", fragments.Template(fragments.Config{}, "index", fiber.Map{}, "layouts/main"))
// this would listen to port 8080
app.Listen(":8080")
<html>
<head>
<script type="fragment" src="assets"></script>
</head>
<body>
<h1>Example</h1>
<fragment src="fragment1.html"></fragment>
</body>
</html>
The example
folder contains many examples. You can learn how to use a forward reference of content for fetching outer and inner content and replace either one.
This is run on a MacBook Pro 16 inch locally. It is the example
run.
- Parsing a local template with extrapolation with the fragments
- Parsing the fragments
- Doing fragments
- Inlining results and adding
Link
header resources to the output
echo "GET http://127.0.0.1:8080/index" | vegeta attack -duration=5s -rate 2000 | tee results.bin | vegeta report
vegeta report -type=json results.bin > metrics.json
cat results.bin | vegeta plot > plot.html
cat results.bin | vegeta report -type="hist[0,100ms,200ms,300ms]"
Requests [total, rate, throughput] 10000, 2000.26, 2000.15
Duration [total, attack, wait] 5s, 4.999s, 285.172µs
Latencies [min, mean, 50, 90, 95, 99, max] 183.725µs, 251.517µs, 226.993µs, 310.698µs, 394.601µs, 563.022µs, 1.347ms
Bytes In [total, mean] 6240000, 624.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:10000
Error Set:
Bucket # % Histogram
[0s, 100ms] 10000 100.00% ###########################################################################
[100ms, 200ms] 0 0.00%
[200ms, 300ms] 0 0.00%
[300ms, +Inf] 0 0.00%