Aller au contenu

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.

sh
bun create hono@latest my-app

Ouvrez my-app et installez les dépendances.

sh
cd my-app
bun install

2.2. Configuration d'un projet existant ​

Dans un projet Bun existant, il suffit d'installer la dépendance hono à la racine du projet avec :

sh
bun add hono

Ajoutez ensuite la commande dev à votre package.json existant.

json
{
  "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.

ts
import { Hono } from 'hono'

const app = new Hono()
app.get('/', (c) => c.text('Hello Bun!'))

export default app

Si 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.

sh
bun run dev

Ensuite, 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.

ts
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.

sh
bun add @hono/bun
ts
import { 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.png

rewriteRequestPath ​

Si vous souhaitez faire correspondre http://localhost:3000/static/* à ./statics, utilisez l'option rewriteRequestPath :

ts
app.get(
  '/static/*',
  serveStatic({
    root: './',
    rewriteRequestPath: (path) =>
      path.replace(/^\/static/, '/statics'),
  })
)

mimes ​

Vous pouvez ajouter des types MIME avec mimes :

ts
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é :

ts
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 :

ts
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.

ts
app.get(
  '/static/*',
  serveStatic({
    precompressed: true,
  })
)

Tests ​

Vous pouvez utiliser bun:test pour les tests sur Bun.

ts
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.

sh
bun test index.test.ts

Publié sous licence MIT.