https://github.com/honojs/hono/releases/tag/v4.0.0
Skip to content
Toggle navigation
Sign in
* Product
+
Actions
Automate any workflow
+
Packages
Host and manage packages
+
Security
Find and fix vulnerabilities
+
Codespaces
Instant dev environments
+
Copilot
Write better code with AI
+
Code review
Manage code changes
+
Issues
Plan and track work
+
Discussions
Collaborate outside of code
Explore
+ All features
+ Documentation
+ GitHub Skills
+ Blog
* Solutions
For
+ Enterprise
+ Teams
+ Startups
+ Education
By Solution
+ CI/CD & Automation
+ DevOps
+ DevSecOps
Resources
+ Learning Pathways
+ White papers, Ebooks, Webinars
+ Customer Stories
+ Partners
* Open Source
+
GitHub Sponsors
Fund open source developers
+
The ReadME Project
GitHub community articles
Repositories
+ Topics
+ Trending
+ Collections
* Pricing
Search or jump to...
Search code, repositories, users, issues, pull requests...
Search
[ ]
Clear
Search syntax tips
Provide feedback
We read every piece of feedback, and take your input very seriously.
[ ] [ ] Include my email address so I can be
contacted
Cancel Submit feedback
Saved searches
Use saved searches to filter your results more quickly
Name [ ]
Query [ ]
To see all available qualifiers, see our documentation.
Cancel Create saved search
Sign in
Sign up
You signed in with another tab or window. Reload to refresh your
session. You signed out in another tab or window. Reload to refresh
your session. You switched accounts on another tab or window. Reload
to refresh your session. Dismiss alert
{{ message }}
honojs / hono Public
*
* Notifications
* Fork 304
* Star 11.2k
* Code
* Issues 134
* Pull requests 16
* Discussions
* Actions
* Security
* Insights
Additional navigation options
* Code
* Issues
* Pull requests
* Discussions
* Actions
* Security
* Insights
1. Releases
2. v4.0.0
v4.0.0
Latest
Latest
Compare
Choose a tag to compare
[ ]
Could not load tags
Nothing to show
{{ refName }} default (*)
View all tags
@yusukebe yusukebe released this 09 Feb 11:27
v4.0.0
ca6f365
Going to full-stack.
Hono v4.0.0 is out! This major update includes some breaking changes
and the addition of three major features.
1. Static Site Generation
2. Client Components
3. File-based Routing
So Hono is going to full-stack. Let's take a look at the three
features.
1. Static Site Generation
We introduce SSG Helper. With it you can generate static pages of
your Hono applications.
To use this, create a separate file build.ts from the application and
call the toSSG() function in it.
import fs from 'node:fs/promises'
import { toSSG } from 'hono/ssg'
import app from './src/index'
toSSG(app, fs)
There are adapters for Bun and Deno, so you can write shorter for
Bun, for example.
import { toSSG } from 'hono/bun'
import app from './src/index'
toSSG(app)
And, just run it.
bun ./build.ts
Then HTML is generated.
$ ls static
about.html index.html
You can easily deploy this page to Cloudflare Pages, etc.
$ wrangler pages deploy static
With Vite
We have created a plugin @hono/vite-ssg for Vite. By using this, you
will be able to develop and build a static sites with just the vite
command.
The configuration is the following:
import build from '@hono/vite-ssg'
import devServer from '@hono/vite-dev-server'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
build(),
devServer({
entry: 'src/index.tsx'
})
]
})
If you want to develope, just run the command:
vite
If you want to build, just run the command:
vite build
In combination with the deployment mentioned above to Cloudflare
Pages, you can develop, SSG build, and deploy non-stop. And each of
them is extremely fast (the video is 2x faster).
Screen cast
2. Client Components
hono/jsx was originally designed to run server-side as an alternative
to template engines such as Mustache. Server-side JSX is an
interesting experiment, creating a new stack to combine with HTMX and
Alpine.js. But that's not all.
Now, hono/jsx runs on the client as well. We call it hono/jsx/dom or
Client Components.
The exact same code as React runs with Hono's JSX.
import { useState } from 'hono/jsx'
import { render } from 'hono/jsx/dom'
function Counter() {
const [count, setCount] = useState(0)
return (
Count: {count}
)
}
function App() {
return (
)
}
const root = document.getElementById('root')
render(, root)
The Hooks listed below are also implemented and you can create Client
Components just like in React.
* useContext
* useEffect
* useState
* useCallback
* use
* startTransition
* useDeferredValue
* useMemo
* useLayoutEffect
* Memo
* isValidElement
startViewTransition family
In addition, the original APIs, startViewTransition family make the
View Transition API easy to use.
import { useState, startViewTransition } from 'hono/jsx'
import { Style, css, keyframes } from 'hono/css'
const fadeIn = keyframes`
from { opacity: 0; }
to { opacity: 1; }
`
const App = () => {
const [showTitleImage, setShowTitleImage] = useState(false)
return (
<>
{!showTitleImage ? (
) : (
)}
>
)
}
You can easily create the animation.
SC
Ultra-small
The hono/jsx/dom is fast and ultra-small. It has a smaller JSX
runtime dedicated to the DOM in addition to the common server and
client ones. Just specify hono/jsx/dom instead of hono/jsx in
tsconfig.json.
"jsx": "react-jsx",
"jsxImportSource": "hono/jsx/dom"
The above counter example is 2.8KB with Brotli compression.
SS
In comparison, React is 47.3 KB for the same thing.
SS
3. File-based Routing
Last is File-based Routing. This is not included in the hono package,
but is provided in a separate package.
It is named HonoX.
HonoX
HonoX has the following features.
* File-based routing - You can create a large application like
Next.js.
* Fast SSR - Rendering is ultra-fast thanks to Hono.
* BYOR - You can bring your own renderer, not only one using hono/
jsx.
* Islands hydration - If you want interactions, create an island.
JavaScript is hydrated only for it.
* Middleware - It works as Hono, so you can use a lot of Hono's
middleware.
You can try it now. One of create-hono's starter templates named "
x-base" uses HonoX.
For detailed usage, please see the following HonoX repository.
https://github.com/honojs/honox
The core is still tiny
The addition of this feature has no impact on the core. "Hello World"
in hono/tiny is still small, only 12KB minified.
Other new features
* feat(base): Set Default Path to '*' for app.use() - #1753
* feat(hono-base): app.on supports multiple paths - #1923
* feat(css): Introduce pseudo global selector and class name based
extend syntax - #1928
* feat(jsx-renderer): Nested Layouts via Renderer - #1945
* feat!: validator throws error rathar than return c.json() - #2021
* feat: introduce Accepts Helper - #2001
* feat(serve-static): mimes option for serve-static - #2094
* feat!(validator): supports transformation - #2130
Breaking Changes
There are several breaking changes. Please see the Migration Guide
below.
https://github.com/honojs/hono/blob/main/docs/MIGRATION.md
Thanks
Thanks to all contributors. Great job on all the hard work!
All Updates
* feat(base): Set Default Path to '*' for app.use() by @watany-dev
in #1753
* feat: Introduce jsx/dom by @usualoma in #1917
* ci: enables CI in the v4 branch by @yusukebe in #1933
* feat(hono-base): app.on supports multiple paths by @yusukebe in #
1923
* feat!: remove deprecated features by @yusukebe in #1934
* fix(jsx/dom): fix cleanup for deps by @usualoma in #1936
* refactor(jsx/dom): replace existing content by render() by
@usualoma in #1938
* feat(css): Introduce pseudo global selector and class name based
extend syntax by @usualoma in #1928
* feat: Introducing a New SSG Adaptor/Helper by @watany-dev in #
1904
* chore(helper): Add experimental flag the SSG features by
@watany-dev in #1967
* refactor: remove unnecessary import by @yusukebe in #1969
* refactor: remove and fix comments by @yusukebe in #1970
* ci: remove lagon runtime tests and other lagon things by
@yusukebe in #1971
* refactor(ssg): SSG works without node:path by @nakasyou in #1965
* feat(factory): remove deprecated from Factory and createHandlers
by @yusukebe in #1979
* fix(ssg): fix path parser bug & refactor code by @EdamAme-x in #
1976
* feat(ssg): Implement Dynamic File Extension on MIME Type and
Enhanced Response Handling by @watany-dev in #1968
* feat(jsx/dom): rewrite renderer to use virtual tree by @usualoma
in #1981
* refactor: faster for loop by @EdamAme-x in #1989
* feat!(cloudflare-workers): make manifest required by @yusukebe in
#1984
* chore: enables lint and format for .tsx by @yusukebe in #1994
* feat(jsx/dom): provide jsx-runtime and jsx-dev-runtime via jsx/
dom by @usualoma in #1986
* fix(types): correct c.get() inference by @yusukebe in #1995
* feat(jsx/dom): startTransition() and useTransition() by @usualoma
in #1996
* refactor(jsx): export components and hook function from top level
'hono/jsx' by @usualoma in #1997
* feat(ssg): Ignore Dynamic Route by @watany-dev in #1990
* feat: Added ssgParams middleware by @nakasyou in #1960
* fix(ssg): fixed isDynamicRoute and ssgParams matter by @yusukebe
in #2006
* feat(jsx/dom): support createContext and useContext in jsx/dom by
@usualoma in #1999
* refactor(jsx/dom): make useTransition() handling more simple by
@usualoma in #2003
* chore(package.json): specify the config in test:deno by @yusukebe
in #2014
* chore(runtime-test): add deno.lock by @yusukebe in #2015
* fix(jsx/dom): find "insertBefore" node from next node list if not
found by @usualoma in #2017
* feat!: validator throws error rathar than return c.json() by
@yusukebe in #2021
* refactor(ssg): Removal of Libraries Dependent on Node.js by
@watany-dev in #2012
* feat!(deno): move middleware to helper by @watany-dev in #2027
* fix(SSG): Correct extension of the file output by @watany-dev in
#2029
* feat(jsx/dom): Introduce startViewTransition() by @usualoma in #
2020
* fix(ssg): Remove ArrayBuffer from FileSystemModule's writeFile by
@watany-dev in #2032
* refactor(jsx/dom): invoke update() in microtask by @usualoma in #
2036
* feat: introduce Accepts Helper by @sor4chi in #2001
* feat: improve ssgParams flexibility by @sor4chi in #2024
* refactor(types): name them BlankSchema or BlankInput by @yusukebe
in #2040
* feat(deno): export accpet helper for deno by @yusukebe in #2041
* docs: Add JSDoc by @nabeken5 in #1916
* fix!(types): Fix context type when chaining routes with
middlewares by @agatan in #2046
* refactor: rename accept to accepts by @EdamAme-x in #2063
* fix: use DOCTYPE by default by @EdamAme-x in #2064
* fix(ssg): Uniformly Convert Paths Ending with Slash to
'index.ext' Format by @watany-dev in #2056
* feat: Introduce useViewTransition() hook and viewTransition()
helper by @usualoma in #2053
* feat(ssg): support Improve Hook Handling by @watany-dev in #2054
* fix: await generate hook by @watany-dev in #2074
* fix:(ssg): make 'files' mandatory in ToSSGResult by @watany-dev
in #2071
* feat(types): explicitly specify statusCode by @EdamAme-x in #2073
* chore: vitest test.pool to 'forks' by @watany-dev in #2098
* goodbye: lagon by @EdamAme-x in #2087
* refactor: faster for loop in jsx/dom by @EdamAme-x in #2092
* refactor: "if" on one line and deletion of unneeded variables by
@EdamAme-x in #2093
* fix: add typesVersions of accepts helper by @sor4chi in #2096
* chore: use Bun as a package manager by @yusukebe in #2105
* docs(contributing): add Installing dependencies by @yusukebe in #
2113
* feat(serve-static): mimes option for serve-static by @ryuapp in #
2094
* feat(ssg): introduce disableSSG and onlySSG by @yusukebe in #2104
* feat!(mime): reduce default mimes by @ryuapp in #2119
* feat(types): better c.var type by @Kyiro in #2121
* fix(jsx-renderer): correct nested layouts by @yusukebe in #2128
* feat!(validator): supports transformation by @yusukebe in #2130
* feat(jsx/dom): more react staff by @usualoma in #2132
* refactor(jsx): Remove unused HONO_COMPONENT feature by @usualoma
in #2139
* fix(html): Remove circular dependencies in hono/html by
@javascripter in #2143
* Merge main into v4 by @usualoma in #2145
* feat(jsx): "className" is now an alias for "class" by @usualoma
in #2146
* fix!(deno): put SSG helper into helper.ts by @yusukebe in #2150
* refactor(jsx): Tidyup the types to be exported by @usualoma in #
2151
* fix(types): MergeSchemePath infers param types correctly by
@yusukebe in #2152
* fix(types): MergeSchemaPath infer inputs not only params by
@yusukebe in #2154
* Fix/function for attribute by @usualoma in #2161
* fix(jsx): The third argument of jsx(), key, is optional by
@usualoma in #2162
* Feat/more jsx event by @usualoma in #2165
* docs: update the migration guide for releasing v4 by @yusukebe in
#2159
* perf(mime): make getExtension() fast by @ryuapp in #2168
* v4 by @yusukebe in #2167
New Contributors
* @EdamAme-x made their first contribution in #1976
* @nabeken5 made their first contribution in #1916
* @Kyiro made their first contribution in #2121
* @javascripter made their first contribution in #2143
Full Changelog: v3.12.10...v4.0.0
Contributors
* @yusukebe
* @javascripter
* @usualoma
* @agatan
* @Kyiro
* @watany-dev
* @nakasyou
* @sor4chi
* @ryuapp
* @EdamAme-x
* @nabeken5
yusukebe, javascripter, and 9 other contributors
Assets 2
36 ysm-dev, vigneshksaithal, doooss, leonlarsson, armandsalle,
EdamAme-x, mkosir, aecea, kolyasapphire, halillusion, and 26 more
reacted with thumbs up emoji 1 o-az reacted with laugh emoji 46
ysm-dev, leonlarsson, armandsalle, EdamAme-x, mkosir, aecea,
juliomuhlbauer, kolyasapphire, soulchild, adaptive, and 36 more
reacted with hooray emoji [?] 27 ysm-dev, eadwinCode, leonlarsson,
armandsalle, EdamAme-x, mkosir, aecea, kolyasapphire, soulchild,
sergiocarneiro, and 17 more reacted with heart emoji 26 ysm-dev,
dalist1, leonlarsson, armandsalle, EdamAme-x, mkosir, AdiRishi,
aecea, kolyasapphire, soulchild, and 16 more reacted with rocket
emoji 2 o-az and robertherber reacted with eyes emoji
All reactions
* 36 reactions
* 1 reaction
* 46 reactions
* [?] 27 reactions
* 26 reactions
* 2 reactions
83 people reacted
Footer
(c) 2024 GitHub, Inc.
Footer navigation
* Terms
* Privacy
* Security
* Status
* Docs
* Contact
* Manage cookies
* Do not share my personal information
You can't perform that action at this time.