Bun 1.2 med innebygget PostgreSQL og HTML-import – dette er nytt

Versjon 1.2 av Bun skal gjøre det mye enklere å lage fullstack-applikasjoner, hevder Bun-skaper Jarred Sumner.

Vi har tidligere skrevet om at JavaScript-kjøremiljøet Bun har fått S3-støtte, en endring ikke alle var like begeistret for.

Onsdag kveld kom versjon 1.2, med enda mer nytt – der en av de aller mest interessante nyhetene er innebygget støtte for PostgreSQL.

I tillegg har Bun 1.2 også fått en masse andre spennende nyheter, som ifølge Bun-skaper Jarred Sumner skal gjøre det enklere enn noensinne å bygge fullstack-applikasjoner.

Introducing Bun 1.2 bun.sh/blog/bun-v1.2

[image or embed]

— Bun (@bun.sh) January 22, 2025 at 10:32 PM

Og "selvfølgelig" har Bun blitt raskere enn forgjengeren. For eksempel vil en Express-server som kjører på Bun 1.2 være tre ganger raskere enn om den hadde kjørt på Node.js, mens Bun 1.1 er "bare" 2,2 ganger raskere.

#1: Innebygget PostgreSQL

Bun har helt siden starten hatt en innbygget SQLite-klient, men fra versjon 1.2 er også en PostgreSQL-kompatibel SQL-klient innebygget: Bun.sql.

Bun.sql er inspirert av den populære npm-pakken postgres.js. Syntaksen skal være helt lik, så bruker du postgres.js fra før skal det å bytte til Bun.sql være så enkelt som å bare endre importen.

Bun.sql bruker "tagged template literals" for å lage spørringer. Dette har den fordelen at du kan bruke verdier fra JavaScript i spørringene dine uten å risikere SQL injection-angrep. Bun.sql sørger for å automatisk "escape" strenger og sørge for at alt foregår på en trygg måte.

Dermed kan du gjøre for eksempel dette:

import { sql } from "bun";

const users = [
  { name: "Alice", age: 25 },
  { name: "Bob", age: 65 },
];

await sql`
  INSERT INTO users (name, age)
  VALUES ${sql(users)}
`;

Og vil du lese rader fra en tabell kan du gjøre det slik:

import { sql } from "bun";

const seniorAge = 65;
const seniorUsers = await sql`
  SELECT name, age FROM users
  WHERE age >= ${seniorAge}
`;

console.log(seniorUsers); // [{ name: "Bob", age: 65 }]

Det skal for øvrig komme MySQL-støtte også om ikke lenge.

#2: Raskere og bedre bun install

Frem til nå har Bun av ytelsesmessige årsaker brukt en binær lock-fil. Men de har fått klager fra utviklere som har påpekt at disse har vært umulig å se igjennom ved pull requests og vanskelige å ha med å gjøre ved merge-konflikter.

– Hva skjer hvis du mottar en pull request fra en ekstern bidragsyter som endrer bun.lockb-filen? Stoler du på den? Antagelig ikke, skriver Ashcon Partovi i Bun i lanserings-bloggen.

Derfor bytter Bun nå til en tekstbasert (JSON) lock-fil, slik som de fleste andre.

Bun install har blitt raskere, til tross for at de måtte bite i det sure eplet og gå bort fra binære lock-filer. 📸: Bun.sh
Bun install har blitt raskere, til tross for at de måtte bite i det sure eplet og gå bort fra binære lock-filer. 📸: Bun.sh Vis mer

Og ifølge Bun selv så har de noen smarte triks på lur, slik at bun install med versjon 1.2 faktisk har blitt 30 prosent raskere enn Bun 1.1 – selv uten binær lockfil.

#3: Import av HTML-filer

Vi nevner til slutt at Bun har fått støtte for import av HTML-filer. Det betyr at du kan importere en HTML-fil på denne måten:

import homepage from "./index.html";

Bun.serve({
  static: {
    "/": homepage,
  },

  async fetch(req) {
    // ... api requests
  },
});

Når serveren er oppe og kjører og du besøker "/", vil Bun automatisk bundle <script>- og <link>-tagger i HTML-filene, eksponere dem som statiske ruter, og serve resultatet.

– HTML imports forenkler hele frontend-toolchainen din til ett enkelt import-statement, men skanner HTML-en og automatisk minifyer og bundler JavaScript og CSS, sier Bun-skaper Jarred Sumner i introvideoen.

Her kan du se Buns egen introvideo av de viktigste nyhetene: