Bun
Bun est un autre environnement d'exécution JavaScript, distinct de Node.js et de Deno. Bun inclut un transpileur, ce qui vous permet d'écrire du code en TypeScript ou en JavaScript classique. Hono fonctionne aussi sur Bun.
1. Installation de Bun
Pour installer la commande bun, suivez les instructions du site officiel.
2. Configuration
2.1. Configuration d'un nouveau projet
Un modèle de démarrage est disponible pour Bun. Créez votre projet avec la commande « bun create ». Sélectionnez le modèle bun pour cet exemple.
bun create hono@latest my-appOuvrez my-app et installez les dépendances.
cd my-app
bun install2.2. Configuration d'un projet existant
Dans un projet Bun existant, il suffit d'installer la dépendance hono à la racine du projet avec :
bun add honoAjoutez ensuite la commande dev à votre package.json existant.
{
"scripts": {
"dev": "bun run --hot src/index.ts"
}
}Consultez le modèle de démarrage Bun pour un exemple de configuration minimal. Il correspond au résultat de bun create hono@latest.
3. Bonjour le monde
Voici le script « Hello World ». Il est presque identique à celui des autres plateformes.
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))
export default appSi vous configurez Hono dans un projet existant, la commande bun run dev attend que le script « Hello World » se trouve dans src/index.ts.
4. Exécution
Exécutez la commande.
bun run devEnsuite, ouvrez http://localhost:3000 dans votre navigateur.
Modifier le numéro de port
Vous pouvez préciser le numéro de port en exportant port.
import { Hono } from 'hono'
const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))
export default app
export default {
port: 3000,
fetch: app.fetch,
} Servir des fichiers statiques
Pour servir des fichiers statiques, utilisez serveStatic du paquet @hono/bun.
bun add @hono/bunimport { serveStatic } from '@hono/bun'
const app = new Hono()
app.use('/static/*', serveStatic({ root: './' }))
app.use('/favicon.ico', serveStatic({ path: './favicon.ico' }))
app.get('/', (c) => c.text('You can access: /static/hello.txt'))
app.get('*', serveStatic({ path: './static/fallback.txt' }))Le code ci-dessus fonctionne avec l'arborescence suivante.
./
├── favicon.ico
├── src
└── static
├── demo
│ └── index.html
├── fallback.txt
├── hello.txt
└── images
└── dinotocat.pngrewriteRequestPath
Si vous souhaitez faire correspondre http://localhost:3000/static/* à ./statics, utilisez l'option rewriteRequestPath :
app.get(
'/static/*',
serveStatic({
root: './',
rewriteRequestPath: (path) =>
path.replace(/^\/static/, '/statics'),
})
)mimes
Vous pouvez ajouter des types MIME avec mimes :
app.get(
'/static/*',
serveStatic({
mimes: {
m3u8: 'application/vnd.apple.mpegurl',
ts: 'video/mp2t',
},
})
)onFound
Avec onFound, vous pouvez préciser le traitement à effectuer lorsque le fichier demandé est trouvé :
app.get(
'/static/*',
serveStatic({
// ...
onFound: (_path, c) => {
c.header('Cache-Control', `public, immutable, max-age=31536000`)
},
})
)onNotFound
Avec onNotFound, vous pouvez préciser le traitement à effectuer lorsque le fichier demandé est introuvable :
app.get(
'/static/*',
serveStatic({
onNotFound: (path, c) => {
console.log(`${path} is not found, you access ${c.req.path}`)
},
})
)precompressed
L'option precompressed vérifie si des fichiers portant des extensions telles que .br ou .gz sont disponibles et les sert selon l'en-tête Accept-Encoding. Elle privilégie Brotli, puis Zstd et Gzip. Si aucun de ces fichiers n'est disponible, elle sert le fichier original.
app.get(
'/static/*',
serveStatic({
precompressed: true,
})
)Tests
Vous pouvez utiliser bun:test pour les tests sur Bun.
import { describe, expect, it } from 'bun:test'
import app from '.'
describe('My first test', () => {
it('Should return 200 Response', async () => {
const req = new Request('http://localhost/')
const res = await app.fetch(req)
expect(res.status).toBe(200)
})
})Ensuite, exécutez la commande.
bun test index.test.ts