NOTE:
@fastly/hono-compute-js-static-publishis provided as a Fastly Labs product. Visit the Fastly Labs site for terms of use.
@fastly/hono-compute-js-static-publish is a utility for Hono to allow your program to serve static files under Fastly Compute. It leverages the PublisherServer from @fastly/compute-js-static-publish.
Works with:
- Hono v4.x
- @fastly/compute-js-static-publish v6.x and v7.x
import { Hono } from 'hono/quick'
import { fire } from 'hono/service-worker'
import { fromStaticPublishRc } from '@fastly/hono-compute-js-static-publish'
import rc from '../static-publish.rc.js'
const serveStatic = fromStaticPublishRc(rc)
const app = new Hono()
app.get('/', (c) => {
return c.text('Hello Hono!')
})
app.get('/favicon.ico', serveStatic({ path: './favicon.ico' }))
app.get('/static/*', serveStatic({ root: './' }))
fire(app)import { Hono } from 'hono/quick'
import { fire } from 'hono/service-worker'
import { fromPublisherServer } from '@fastly/hono-compute-js-static-publish'
import { getServer } from '../static-publisher/statics.js'
const serveStatic = fromPublisherServer(getServer())
const app = new Hono()
app.get('/', (c) => {
return c.text('Hello Hono!')
})
app.get('/favicon.ico', serveStatic({ path: './favicon.ico' }))
app.get('/static/*', serveStatic({ root: './' }))
fire(app)Note
The instructions below are for @fastly/compute-js-static-publish v7.
Once you have set up a Hono project for Fastly Compute, add this library and the Static Publisher library to your application:
npm install @fastly/hono-compute-js-static-publish @fastly/compute-js-static-publish
These directions assume your static files exist directly under the ./assets subdirectory of your Fastly Compute application.
You will need to add and modify some files at the root of your project.
-
Add
static-publish.rc.js/** @type {import('@fastly/hono-compute-js-static-publish').StaticPublishRc} */ const rc = { kvStoreName: "site-content", publishId: "default", defaultCollectionName: "live", staticPublisherWorkingDir: "./static-publisher", }; export default rc;
This sets up the Static Publisher to use a KV Store named
site-contentand to place generated temporary files in the./static-publishersubdirectory. The other fields are not used in@fastly/hono-compute-js-static-publishbut are required fields.[!TIP] Add
./static-publisher/to your.gitignoreas these files will be regenerated on the build. -
Add
publish-content.config.js/** @type {import('@fastly/hono-compute-js-static-publish').PublishContentConfig} */ const config = { rootDir: './assets' }; export default config;
This instructs the Static Publisher to find static files at
./assets.[!IMPORTANT] As this application does not use
PublisherServerto directly serve assets, theserverfield is not applicable. -
Modify
package.jsonAdd the following items under thescriptssection:{ "scripts": { "dev:publish": "npx @fastly/compute-js-static-publish publish-content --local", "dev:start": "fastly compute serve", "fastly:deploy": "fastly compute publish", "fastly:publish": "npx @fastly/compute-js-static-publish publish-content" } } -
Modify
fastly.tomlAdd the following lines to the end of the file:[local_server.kv_stores] site-content = { file = "./static-publisher/kvstore.json", format = "json" } [setup.kv_stores.site-content]
Finally, modify your application's src/index.ts file:
- Import
fromStaticPublishRcfrom this library - Import the default constant from
static-publish.rc.jsand pass it tofromStaticPublishRc()to instantiate the Hono Middleware.
import { Hono } from 'hono/quick'
import { fire } from 'hono/service-worker'
import { fromStaticPublishRc } from '@fastly/hono-compute-js-static-publish'
import rc from '../static-publish.rc.js'
const serveStatic = fromStaticPublishRc(rc)
const app = new Hono()
app.get('/', (c) => {
return c.text('Hello Hono!')
})
app.get('/favicon.ico', serveStatic({ path: './favicon.ico' }))
app.get('/static/*', serveStatic({ root: './' }))
fire(app)Include either path or root in the object passed to serveStatic().
path- serves the static file at the specified path under the asset directory.- e.g., a request for
/favicon.icoserves./assets/favicon.ico.
- e.g., a request for
root- serves the file at the path under the asset directory relative to the specified directory.- e.g., a request for
/static/foo.htmlserves./assets/static/foo.html.
- e.g., a request for
npm run dev:publish # 'publish' your files to the simulated local KV Store
npm run dev:start # preview locallyServes your app at http://127.0.0.1:7676, powered by a simulated KV Store.
Create a free Fastly account if you haven't already, and then:
npm run fastly:deploy # deploy the app
npm run fastly:publish # upload your static filesFurther changes involving only updates to your static files can be made by running:
npm run fastly:publish # upload your static files📘 For more on Compute-JS Static Publisher:
https://github.com/fastly/compute-js-static-publish
If you encounter any non-security-related bug or unexpected behavior, please file an issue using the bug report template.
Please see our SECURITY.md for guidance on reporting security-related issues.
MIT.