I september var jeg så heldig å få delta på den 10. utgaven av React Universe — den europeiske konferansen for alt som skjer i React Native atmosfæren. Der presenterte ByteDance, stjernene bak TikTok-plattformen, deres egetutviklede JavaScript rammeverk: LynxJS. Jeg ble ganske trollbundet av presentasjonen deres — min favoritt fra hele konferansen, og sa til meg seg at Lynx definitivt er noe jeg må sjekke ut øyeblikket jeg kommer hjem. I denne artikkelen skal jeg fortelle hva LynxJS er, hva det prøver å løse og hva mine første inntrykk er så langt.

Hva er LynxJS?
Hvis du har vært i internett-gamet lengre enn forfatter (meg) har levd, så tenker du nok mest sannsynlig på en terminalbasert nettleser når du hører Lynx, som morsomt nok fortsatt vedlikeholdes. Lynx i dagens kontekst derimot er en familie av teknologier utviklet av ByteDance, ett av de hotteste utviklingsselskapene som har dukket opp fra Kina den siste tiden.
LynxJS er et rammeverk som er designet for å kunne lage like gode UI som native på både mobil og web. Strategien for å få til dette er relativt rett frem. De har lagt til rette for å skrive markup og CSS slik som man gjør på web, og du gjør det ved hjelp av god gammeldags JavaScript (eller TypeScript 🤞). Teamet bak Lynx sier at du kan tenkte på det som: "alternativ web skreddersydd for app utvikling".
Men hvorfor lage et nytt rammeverk? ⚙️
Vi har jo allerede et knallsterkt rammeverk for å utvikle kryssplattform på mobil i dag: React Native. React Native lar deg skrive React kode akkurat som du ville gjort for web, mens et mellomlag tar seg av å oversette komponenter fra rammeverket til ekvivalente native komponenter på plattformen til brukeren. Fordelen med dette er at man slipper å skrive alt i appen flere ganger (for iOS, Android og muligens web) og man får tilgang på det enorme økosystemet av tredjepart biblioteker skrevet for React, nesten helt ut av boksen. Hva er da poenget med å introdusere enda et rammeverk bygget på JavaScript?
Å trå nålen i React Native 🪡
Lynx har gått inn for adressere det som lenge har vært den store flaskehalsen til React Native, nemlig at all form for kommunikasjon mellom JavaScripten og native-koden har skjedd gjennom én tråd. Det betyr at dersom du prøver å regne ut en litt dyr kalkulasjon i forretningslogikken din samtidig som du prøver å animerere noe, så kan du oppleve at det hopper over noen frames fordi alt konkurrerer om å få bruke samme tråden.
I fjor gikk endelig React Native over til det de kaller for “New Architecture”, etter seks år i utvikling. Da fikk rammeverket en splitter ny rendering engine skrevet i C++ som tilbyr rendering på flere tråder samtidig, men i praksis så skjer det meste fortsatt på hovedtråden. Hvordan man skal fordele arbeidet til apper effektivt til andre tråder var et større tema på React Universe 2025. For eksempel var det å ta i bruk Worklets på stor skala en annen framgangsmåte presentert for å løse problemet.
Nøste opp tråden(e) 🧶
Lynx har derimot gått for en fundamentalt ny tilnærming til å løse problemet: nemlig en to-tråds arkitektur. De har skrevet en custom JavaScript engine, med to distinkte JavaScript runtimes. Den ene “main-thread" runtimen er dedikert til å kunne kjøre synkroniserte UI oppgaver, mens “background" runtimen er standard for å kjøre utviklerens kode og tar seg av alt annet som ikke får privilegiet av å kjøre på main-thread.
Dette er en drastisk annen måte å gjøre ting på. I Lynx kan du faktisk ikke med et uhell klare å sakke ned UI-et med foretningslogikken din, fordi arkitekturen ikke tillater det! Denne arkitekturen gjør at Lynxs to magiske killer features er mulig:
- Instant First-Frame Rendering. Blokkerer main-thread når du starter opp appen, og hvis renderingen din er rask nok så gir det brukeren en helt sømløs opplevelse.
- Main-Thread Scripting. Lar deg bruke instruksjoner i koden for å si at noe skal kjøre på main-thread. Ved å bruke dette for gestures vil interaksjonene til brukeren være lynraske og silkemyke.
Demo av Instant First-Frame Render fra Lynx
Demo av Main-Thread Scripting fra Lynx
Resultatet er rett og slett sexy. Det er kjapt, smooth og gir en skikkelig premium følelse!
Hvordan føles det ut hands-on? 👐
Med en knallsterk presentasjon på React Universe og de helt rå eksemplene de hadde på nettisdene side så var det bare en ting å gjøre: teste det ut i praksis. Dette var de tingene som slo meg mens jeg rattet rundt i utviklermiljøet mitt:
Fantastisk å sette opp et testprosjekt 🤩
Det første som slo meg var at CLI-verktøyet for å sette opp et nytt prosjekt i LynxExplorer appen på en simulator var super enkelt. Å få på plass TypeScript, ESLint + Prettier eller Biome med ditt foretrukne pakkesystem var alt tatt hånd om i installasjonsprosessen.
I tillegg har de satt opp tutorials for å få testa ut de fantastiske demoene lenket til i forrige avsnitt. Det er supre måter å få en smakebit av Lynx, hvor man får testa ut det de er best på med en gang.
ReactLynx 🎨
Noe som er veldig fett med Lynx er at det er et agnostisk rammeverk, og legger opp til at man skal kunne skrive i den dialekten av JavaScript man selv foretrekker. ReactLynx er den første varianten som har kommet ut, og er den de har tatt i bruk selv for å utvikle. Som en React Native utvikler til daglig så hørtes dette ut som den beste måten for meg å å få testa ut Lynx!
Du må derimot ikke misforstå: ReactLynx ≠ React! ReactLynx er bare en wrapper på toppen av Lynx, og en ganske så utdatert en i tillegg. Det er implementert i tråd med React 17, en versjon som nå er 5 år gammel. Det er dermed mulig å bruke Hooks og Context, men du kan altså ikke holde tritt med det nye og freshe som React Server Components og React Compiler. Så hvis du er vant til å bruke en nyere versjon av React ellers, så kan det bli litt vanskelig å holde styr på hva du kan og ikke kan gjøre når du lager apper med ReactLynx.
Det betyr også at React Natives store fordel med å være kompatibelt med React forsvinner: nemlig å kunne bruke Reacts store økosystem. Du kan ikke importere pakker som funker med React ut av boksen. Lynx har lagt til støtte for noen av de største tredjepartsbibliotekene som Tanstack Query for data fetching eller React Router for routing, men du er veldig begrenset i hva du kan bruke av tredjepartsløsninger med mindre du lager en Lynx versjon av det selv.
Dersom du også er en utvikler som har tatt i bruk ulike AI-agenter som Github Copilot eller Claude Code så får du også bare kråkesølv fram dem. De er dessverre ikke så godt kjent med Lynx enda, og å bruke React syntaks på toppen av det hele har gjort at å prompte de for dette rammeverket bare blir klabb og babb. De skjønner jo ikke at det ligger en annen engine i bunn, og at ingen av bibliotekene de har lært at er standard for å løse mange problemer er uaktuelle å bruke. Et lite sidespor, men veldig relevant med tanke på hvordan metodene våre for utvikling er under endring.
Funker ikke frittstående 🧑🤝🧑
Den aller største fordelen med å bruke React Native som rammeverk er at utviklerne i teamet ditt nesten ikke trenger å ha noe forhold til native kode for plattformene de skriver på. Nesten alt av UI og logikk kan skrives i React delen av appen, utenom små koblinger mot OS-rettede APIer og widgets, og det kan til og med abstraheres bort ved hjelp av et meta-rammeverk som Expo. Det gjør at man bytter litt ytelse i appen mot at utviklere har mer fleksibilitet til å kunne utvikle løsninger på tvers av app og web med samme kode. Slik funker det for eksempel i teamet jeg sitter i til vanlig.
Det gjelder dessverre ikke i Lynx. Akkurat nå er det ikke mulig å bygge en helt ny app fra scratch i LynxJS frittstående, hvor man er nødt til å embedde Lynx koden i eksisterende native prosjekter! Så i dag kan du bare bruke det for å bygge UI moduler som krever høy ytelse i apper som allerede finnes, som i praksis er hva ByteDance allerede har gjort for TikTok Studio.
LynxJS: yay or nay? 🎭
Per i dag så ville jeg ikke satset på å utvikle den neste appen min i Lynx. Det er utrolig kult hvor bra ytelse man kan få på renderingen sin når man har gått for et så drastisk ulikt arkitekturvalg fra React Native. Det er ingen tvil om at et bra førsteintrykk er viktig for å få brukere til å investere tiden sin i å brukke appen din, og Lynx nailer det skikkelig med Instant First-Frame Rendering.
Dessverre så veier det ikke helt opp for de åpenbare svakhetene det har for øyeblikket:
- Kan ikke shippes stand-alone.
- Dyr kompetanseinvestering å dra inn et JavaScript rammeverk i eksisterende native applikasjoner.
- Får ikke fordelen av bare ett språk å forholde seg til.
- Kjempeungt økosystem, hvor mye må lages fra bunnen av.
- Ny rendering engine React Native har tettet ytelsesgapet betraktelig.
Sånn er det ofte med ny og spennende teknologi. Når noe nytt kommer og må bygge opp løsninger fra scratch, så må man ofte gå gjennom de samme utfordringene etablerte rammeverk allerede har addressert fra før. Det koster også mye tid og krefter for å få bygget opp et økosystem rundt rammeverket hvor flere enn bare hovedutviklerne ønsker å bidra.
Så selv om Lynx ikke er helt klart enda, så er det super spennende å følge med på et rammeverk som har en helt ny approach for å løse fundamentale utfordringer for kryssplattform på mobil! Det er splitter nytt og ble for første gang gjort til åpen kildekode i år, som virkelig kan få fart på bidragene. Hold et øye oppe for Lynx! Hvem vet hvor stort det har blitt om 2-3 år, og kanskje det da har blitt en reell utfordrer til React Native.