Ég er fyrst og fremst með blogg til að leika mér og þess vegna uppfærði ég síðuna að ástæðulausu. Hér er stutt yfirferð.
Fyrri stakkur
Astro fyrir static site generation — af því bara. Það er skemmtilegt hvernig tískan í vefnum fer í hringi. Seint á tíunda áratugnum notuðum við skriftur til að búa til HTML-skrár sem voru síðan hlaðnar upp. Nú (og reyndar búið að vera lengi) er þetta orðið töff aftur.
CI byggir síðuna og hendir henni upp, og svo er kannski webhook sem CMS dælir í þegar þarf að uppfæra. Vefsíðan þarf þá ekki að gera köll í gagnagrunn eða aðrar þjónustur heldur getur hent beint á notandann tilbúinni HTML-skrá. Þetta er svo hægt að skala í drasl með Cloudflare, CloudFront og öllu hinu.
SolidJS. Ég hef verið að nota React að mestu, eins og flestir, í tæpan áratug. React leysir vandamál sem tengjast uppbyggingu stærri verkefna, sem eiga til að fara úr böndunum í hreinu Vanilla JavaScript, en er samt ekki jafn stjórnsamt og til dæmis AngularJS.
Það besta og versta við React er Virtual DOM. Hann gerir gæfumuninn í veföppum (og öppum) þar sem einingar breytast ótt og títt, en getur stundum verið eins og að reyta arfa á gröfu þegar unnið er að einhverju eins og einfaldri bloggsíðu.
Ég hafði áður notað Svelte, sem ég kann vel við, og var því spenntur að prófa SolidJS. Solid hefur svipaðan syntax og React (JSX) en notar, líkt og Svelte, mun minni yfirbyggingu: einingar eru uppfærðar beint í DOM-inu sem þarf að breyta, í stað þess að millilag stýri uppfærslunum. Solid project (hoho!).
Nýi stakkurinn
Mig langaði að prófa eitthvað nýtt en fann ekkert JavaScript framework sem vakti nægan áhuga. Ég fór því aðra leið.
Skref 1
Generator (í stað Astro)
Lítið app sem ég skrifaði í Node.js. Það skiptist í nokkra þætti:
Markdown
Notar sömu Markdown-skrár og Astro til að búa til síður og pósta. Ég þurfti handvirkt að breyta örfáum MDX-skrám (Markdown með JSX) yfir í venjulegt Markdown.
CSS
Býr til CSS úr SCSS. Ekkert flókið.
Myndir
Býr til nokkrar útgáfur af öllum myndum svo hægt sé að skala þær eftir mismunandi tækjum.
Framendi (í stað SolidJS)
Ég ákvað að halda þessu einföldu. Ég hef oft fiktað með Web Components, í þeirri veiku von að þeir verði einhvern tímann málið, en það hefur aldrei alveg gerst.
All framendavirkni er mjög létt, svo ég notaði Web Components — í raun bara hamborgaravalmynd og play-takka á YouTube-innfellingum. Ég notast líka við gamaldags trikk: að sækja síðuna sem HTML og skipta út main-content í stað þess að vera með alvöru client-side rendering.
Síðan er lítil og þetta skiptir í raun litlu máli, en það sparast nokkrar millisekúndur með því að þurfa ekki að græja CSS og JavaScript upp á nýtt í framendanum.
Skref 2
Fá gervigreindina til að endurskrifa allan generatorinn í Go og Rust
Go. Af þessum tveimur var Go mun auðveldara. Bæði Claude og OpenAI skiluðu prótótýpum sem virkuðu og þurftu aðeins smávægilegar lagfæringar. Þau áttu smá í vandræðum með að bera saman úttakið við NodeJS-lausnina, en voru fljót að laga sig þegar þau fengu skýrari leiðbeiningar.
Rust. Þar fóru bæði OpenAI og Claude oftar í vandræði, einkum með týpur og lifetimes, og gáfust stundum einfaldlega upp. Til dæmis þegar Claude átti að græja JavaScript-transpiler með SWC ákvað hann að það væri ómögulegt, reyndi í staðinn að skrifa sinn eigin með RegEx (!!!), og endaði svo á að kalla bara á esbuild með Yarn.
Í flestum tilfellum dugði þó að benda þeim á rétt cargo-pakka, sýna dæmi og vísa í documentation til að fá rétta lausn.
Bæði Rust og Go eru, að sjálfsögðu, umtalsvert hraðari en NodeJS. Ég hefði líklega átt að velja Go-lausnina: hún er meðfærilegri og ekki mikið hægari en Rust-útgáfan. Ég ákvað þó, eins og svo oft í svona gamni-verkefnum, að velja lausnina sem er meira vesen.
CI
Rust-lausnin er talsvert sneggri en bæði Astro og NodeJS-útgáfurnar mínar — en aðeins ef ekki þarf að builda allt upp á nýtt. Nýtt build tók upphaflega:
- Sækja dependencies → rúm mínúta
- Test → 4½ mínúta
- Build → rúmar 2 mínútur (nýtir mikið úr test-skrefinu)
Mér tókst að fá þetta niður í:
- Sækja dependencies → 6 sekúndur
- Test → 1½ mínúta
- Build → < 1 mínúta og 20 sekúndur
með því að nota cache) á dependencies og sccache til að fá incremental build til að virka rétt.
Ég er ekki nógu sérfróður um Rust build-ferlið til að optimísera þetta mun betur nema leggjast í smá rannsóknarvinnu, og veit að ef verkefnið væri stærra myndi sccache líklega brotna (það gerir svo mörg köll að maður lendir fljótt á rate limit hjá GitHub).
Niðurstaða
Ég er fljótur að uppfæra bloggið mitt svo lengi sem ég þarf ekki að breyta lógík. Ég gæti gert þetta enn sneggra með því að láta kerfið aðeins búa til þær skrár og myndir sem raunverulega breytast, en hraðinn er nógu góður til að ég nenni því ekki.
Over-engineerað? Alveg klárlega. En til þess er þetta blogg.
Í alvöru verkefni hefði ég annaðhvort notað Astro eða NodeJS-lausnina. Hugsanlega Go. Rust-build-tíminn er of langur og flækjustigið við að láta AI-agenta laga kóða er of flaky — þó það batni með góðum testum og meira samhengi.