Jarred Sumner - Bun

Durée: 67m44s

Date de sortie: 19/08/2022

This week our guest is Jarred Sumner, creator of bun a new JavaScript runtime focused on speed. Bun has already had an influence on the Javscript development, and is now released to the public. Join us as we dive deep on one of the most interesting new things happening in JavaScript.

https://www.patreon.com/devtoolsfm

Twitter GitHub Website bun


Tooltips

Andrew


Justin


Jarred

Les outils existants aujourd'hui ont souvent laissé ce genre d'esprit d'engineering
que vous verrez dans les outils qui sont construits dans Linux.
Je pense que certains de ces outils ont été mis en train de faire un travail.
Bonjour, bienvenue à la podcast de DevTools FM avec une message spéciale.
Il y a quelques épisodes, nous avons parlé de la podcaste dans un épisode de META
et de la façon dont nous avons créé.
En essayant de la faire, nous avons trouvé un position
qui va prendre un peu de fonds pour développer ce que nous voulons.
Nous voulons délire plus de contenus sur un cadence plus consistant
et notre format va devoir changer un peu.
Nous planons avoir la plupart des épisodes tout à fait prêts.
Nous planons encore de donner un podcast libre,
mais ce podcast sera limité à environ 45 minutes
et sera un format plus condensé de nos interviews.
Les épisodes sont maintenant hostées sur Patreon.
Vous pourrez trouver une version de l'épisode de la version de la longueur.
Mais nous voulons toujours être un produit de qualité
que vous vouliez encore consulter.
Oui, oui, j'espère que ça va donner le meilleur de tout le monde.
Nous essayons de naviguer ceci au niveau de la qualité
et de savoir comment nous pouvons faire le podcast plus sustainable
et de le développer,
en aussi avoir une expérience de qualité
si vous voulez juste aller dans la main et écouter le podcast.
Il y a quelques autres choses que nous allons commencer à faire.
Si vous abonnez à Patreon, vous allez avoir accès à notre service Discord.
Nous allons essayer de nous donner tous nos speakers
qui ont participé dans le passé.
Et puis, comme d'autres set-ups de Discord,
les rôles de la longueur sont plus bas.
Peut-être que vous pouvez nous aider à nous choisir qui à interviewer
ou être évolu en planant l'épisode.
Donc, nous travaillons toujours sur les détails, mais il y a plein de choses.
Le Patreon est live maintenant,
si vous êtes intéressés, le lien sera dans les notes de la show.
Nous avons un plan pour que si nous avons fait 1 000 $ par mois,
nous allons pouvoir évaluer le podcast à un podcast weekly.
C'est notre but initial.
J'espère que vous allez nous joindre.
Nous sommes très contents pour cette prochaine chapter de DevTools FM.
Merci à tous les gens qui l'ont appris et nous soutenu.
C'était une très bonne journée et nous sommes contents de faire plus.
Bonjour, bienvenue à la DevTools FM podcast.
C'est un podcast sur les tools de développeur et les gens qui les font.
Je suis Andrew et c'est mon co-host Justin.
Bonjour à tous.
Notre guest aujourd'hui est Jared Sumner.
Jared est le créateur de Bun,
un runtime de JavaScript qui a aussi une bâtisse de bundler,
un transpiler, un tass-runner et un manager de compétition.
Je ne suis pas sûr si j'ai oublié de l'autre, mais c'est très expensif.
Des projets très ambitieux et la performance de nos numéros
est très excitant.
Jared est vraiment, vraiment bien à vous avoir.
J'ai très hâte de vous parler de Bun.
Mais avant de commencer, on parle de Bun.
Vous pouvez vous dire à nos audiences un peu plus sur vous-même ?
Oui, un peu sur mon bâtiment.
J'ai étudié à la haute-school quand j'étais 16,
j'ai été dans une start-up,
puis j'ai fait la fellowship de Tiel,
juste avant la fellowship de Tiel,
le premier projet d'opérance d'open source
que j'ai fait qui a eu des attractions,
était cette plateforme de fondation de crowdfunding
appelée Self-Starter.
La start-up a été créée à environ 10 millions de dollars
avec Self-Starter à la fois où c'était comme ça.
Et c'était en 2013,
je pense 2012,
j'ai vu ça en 2014,
quelque chose dans cette période.
Ça a commencé à devenir un truc
que les start-ups de hardware
étaient comme un réveil de start-up de hardware.
Mais il y avait un Kickstarter,
mais il y avait des problèmes avec Kickstarter
qui ont été créés pour que vous puissiez hoster.
C'est ce que nous avons fait pour la company
qui a travaillé à la fois, Lockatron.
Et plus recentement,
j'étais à Stripe,
en travaillant sur le dashboard du front-end.
C'était comme un peu de bâtiment
pour construire quelque chose de scratch.
Donc, j'ai eu un an de tout ça,
et j'ai commencé à construire un peu de choses.
Et puis, j'ai commencé à...
Et puis ça a fini de devenir un jeu,
un jeu de multiplayer,
de voxel,
de jeu de construction dans le browser.
C'était un jeu vraiment,
il y avait environ 100 000 lines de code.
Et puis, il a juste été très lent à construire.
Il n'était pas comme ça.
Il était en train de faire des petits tweaks.
C'était vraiment génial.
Qu'est-ce que vous vous réveillez dans le jeu?
C'était une app Next.js,
et puis,
le G.I. Shell
était juste réacte,
mais puis le jeu en fait.
C'était initialement,
la première version
en parlant de la fréquence.
Ce n'était pas 3.js,
c'était Babel.js.
Babel.js.
Babel.
Build tools.
Et puis,
j'ai gradually rempli
avec 3.js,
et puis j'ai optimisé un peu plus.
Parce que j'ai commencé à faire des problèmes
parce que j'ai voulu
que le monde de jeu
soit vraiment grand.
Et puis,
j'ai commencé à faire des build tools
pour le jeu en fait.
En premier, je l'ai écrit,
vous pouvez voir ça sur le gât,
que j'ai lu ce truc
à Build,
qui était un
macro
syntaxe
pour JavaScript,
où vous pouvez
faire des blocs
de code à Build Time,
et ils allaient utiliser
la manipulation de string
pour générer plus de code.
Et ça a été utilisé
pour optimiser
le rendering de voxel
pour l'actual model 3D
qui a été créé par voxel.
Le build a juste été très lent.
Alors j'ai essayé de
switcher
l'app
pour être
un build
pour le faire plus vite.
Et ça a été un peu plus vite,
mais j'ai perdu
le module de reloading
et j'ai perdu
l'incrédite d'incrédite
et j'ai dit,
OK,
alors,
qu'est-ce que j'ai essayé
de faire ça ?
Alors,
j'ai passé
ce gât de
construire
un go-cli
qui a utilisé
beaucoup de build plugins.
Et j'ai dit, OK,
qu'est-ce que j'ai
pour le faire ?
Je l'ai emballé
un V8 isolate
pour faire ça et ça a été
OK.
Et tout de suite,
c'est un JavaScript runtime.
Mais,
c'est en utilisant
les builds et les builds,
ce n'est pas vraiment
un design pour ça.
Mais si je ne
n'ai pas utilisé les builds
et j'ai écrit mon propre.
Et
j'ai pensé
à la langue que j'ai utilisée
pour faire ça,
il ne devrait pas
avoir un collector garbage.
Il faut être vraiment très vite.
Il faut être très productive
pour moi d'actuellement
écrire le code,
parce qu'il y a beaucoup de codes
à écrire.
Et il faut être
quelque chose qui aussi
a été faible avec Wawesome,
parce que je voulais
vraiment que Wawesome
ait travaillé bien à la fois.
Un peu moins
de priorité,
mais à la fois,
je pensais que c'était
vraiment cool.
Et je pense que c'est
quelque chose qui va
révisse-t-il.
Et
j'ai essayé de faire un rust
avant.
Donc, je me suis dit
que je vais essayer de faire un rust.
Mais je n'étais pas
productive.
C'était vraiment
difficile pour moi
d'avoir un peu de rust
en utilisant.
Je me sentais
vraiment battu
avec ce compiler.
C'est vraiment plus
important que le barb-checker.
Et donc,
je me suis dit que je vais essayer
de faire un rust.
J'ai lu un article
sur Hacker News,
le tout pour compter.
Et je me suis dit que c'était
le plus cool que j'ai
entendu dans un programme
de language.
Et je pense que
je vais expliquer.
CompTime
fait que vous exacrotez
la code à compile time.
C++
a un temps de template,
mais c'est pas
c++.
C'est comme
ce autre chose.
Et puis,
Rust a des macros.
Et c'est aussi
macros.
Et en fait,
vous pouvez exacrouter
la code à compile time.
Et le résultat
est en train de lurer
l'AST.
Et c'est vraiment cool.
Et c'est comme
ce que vous faites
comme des types.
C'est comme
ce que vous faites
comme des types généraux.
C'est juste
une fonction
qui règle un compile time
et qui s'étend à un nouveau type.
C'est
comme un très, très
primaire.
Et ça signifie
que beaucoup de choses
sont plus simples.
Donc,
j'ai juste essayé de le faire
en zague.
La première version
était
une ligne directe
pour ligne port
de la transpiler
de la build

de zague.
C'est
3 semaines,
je veux dire.
Avant, j'ai eu
quelque chose qui sort de
travail,
parfois.
Et par travail, je veux dire
des codes printés
qui se sont réunis.
Et c'était
en fait de scratch.
Je n'ai jamais
fait de la zague avant.
Donc,
c'est
aussi un testament
de comment
c'est simple
que l'anglais
c'est que
quelqu'un qui
a spécifiquement
pris le temps
en avant
peut juste
faire un
build
de très compliquant
chose.
Et ça
fonctionne
après
3 semaines.
Est-ce que vous vous
rassurez
à des challenges
juste
avec des
basic
management de membre?
Donc,
pour ceux
de nos listeners
qui ne sont pas
réconnus,
je vais faire
une analyse
terrible
sort de description
ici.
Mais je pense
que zague
est
comme c
mais russ
est
un peu
plus
haut.
Et
c'est un peu plus
plus
plus
bas.
Mais
zague
est
plus haut
que je
pense
que
votre
relation
de membre
et
des choses
qui
permettent
de
l'allocer
à la membre
qui est
très
intéressant.
Et russ
t'aimera
à la
compagnie
pour
faire
un programme
sauvage
pour

gare
et
ne
pas
penser
à
cela.
C'est un
grand
horde
pour
faire
ce
programme.
Et
vous
n'aurez
pas
de
membre.
C'est
très
russ.
Et


russ.
Il
n'y a pas
de










ménage
de membre.
Il
n'y a pas


Il
n'y a pas


Il
n'y a pas
Il
n'y a pas
de
ménage
film.
Il
n'y a pas
de
ménage.
Il

de
...
...
on y absorption �ve
par

non,
non,
c'est effectivement un allocateur de bump,
qui signifie que tu n'as pas de frein à l'aide de tout,
ou tu n'as pas de frein à l'aide de tout,
jusqu'à la fin de la cycle.
Et ça fait un offset.
C'est comme si tu as un grand arrêt de spécifiquement allocé,
et que tu as appris à la fin de l'arrêt que tu as utilisé.
Et puis, à la fin de l'arrêt,
et puis quand tu es prêt, tu resettes tout à la fin.
Et puis, en cas de bun,
il y a juste un peu de blocs.
Et puis ça dit,
c'est ce que j'ai utilisé et ce que j'ai utilisé.
Donc, ça fait beaucoup de choses de management de membre.
C'est spécialement utilisé pour l'AST.
Et après que c'est printé,
il resettit tout à la fin.
Et puis, sur le dessus,
la deuxième chose avec l'allocation de membre
est qu'il utilise beaucoup de freins.
Donc, c'est vraiment...
C'est difficile,
si tu...
La façon de faire le default de membre
pour ce type de langage
est probablement plus comme
tu manuellement en n'aies pas de temps.
Dans les six cas, c'est ce qu'on appelle le D&N.
C'est ce qu'on appelle la convention.
Mais ce que je fais la plupart du temps
c'est que je fais des points de set
dans le cycle de la programmation
où on sait que c'est temps de freiner tout
ou que l'on peut freiner tout.
Et ça fait beaucoup plus vite
parce que le temps qu'on fait de frein
fait ça.
Et c'est aussi beaucoup moins probable
que ça cause des bouts
parce que c'est trop simple.
Et la seule chose qu'on doit être careful de
c'est
ne pas utiliser beaucoup de membre
parce que sinon, tu vas juste
faire le tour de frein.
Mais
ZIG est déjà très bon pour ça.
C'est vraiment intéressant.
Donc, c'est
très très basse
que je pense que beaucoup de gens
vont avoir
pour construire un tour comme ça.
En général,
beaucoup de gens vont approcher
à un niveau beaucoup plus haut
en pensant à
avoir les
sortes de comportements de runtime
qu'ils veulent.
Et par choisir ZIG,
ce qui est un niveau bas
en enversant le langage
et en pensant directement
sur les allocations de membre
et des choses comme ça,
tu es forcé à tous ces constraints
que, pendant que les gens ne pensent pas
que
tu n'aimes absolument pas
les costs de performance
dans ces choses.
C'est pourquoi
la langue de la Scarborough
vous donne l'adresse
de ne pas avoir
de la pensée pour la plupart.
Mais, tu souffres
des pénalités de performance
dans des temps différents.
Et
ça peut être un trade-off
que les gens sontOK avec.
Mais, je pense que
nous avons vu plus et plus
spécialement
dans le monde de la tooling de JavaScript.
La performance
a beaucoup de choses,
surtout si tu es
construit, transpilé,
un projet très grand.
Donc, ce genre de chose
est vraiment apprécié,
je pense,
juste par ce genre de complexité.
Est-ce que
cette expérience
change ta perspective
de
comment tu approches de la tooling
ou de la façon dont tu penses?
Juste,
tu sais, approcher de la perspective
de la perspective de la low-level ?
Oui.
Oui.
Une chose que je pense beaucoup
de la question
est
ce que l'académie
fait.
Dans
tout le monde,
c'est très pedantiquement
un exemple très petit.
Dans un contexte de JavaScript,

la différence du subtle
entre object.assign
et
le spread d'opérateur.
Ce n'est pas un bon exemple.
Un meilleur exemple est
juste de créer un nouveau objecte
en utilisant une littéraire
vers assignant
l'objet d'une propre
individuelle.
Tu vas trouver que,
si tu as un micro-bench,
comme ça,
et que tu as,
tu vas trouver que
le set d'un propre individuel
est un peu plus petit.
Même si c'est un nouveau objecte,
tu as juste créé.
C'est parce que le prototype
change chaque fois.
Et c'est parce que
il y a tous ces hauts costs
de mettre des objets
dans un objecte JavaScript
parce que les objets peuvent être réglés
parce que le nombre de propres
peut être un index
vers un objecte
d'une certaine nature
qui,
et
et que
il faut
si c'est un array,
ce qui vient de
dépendre de ce que l'intérêt
est.
Mais en code JavaScript,
par exemple,
il y a un mode array index
qui
a un impact de performance
si tu es en utilisant
objets littéraux,
si tu es en utilisant
les objets vers
si tu es en utilisant les identifiés.
D'accord.
Si tu es en utilisant un identifié
vers si tu es en utilisant l'intature.
Et puis il y a des
points de vision
et des choses comme ça
qui viennent de l'effet
si tu
tu as un getter,
si tu as un string property
et un identifié property
sur un array.
Et il y a tous ces...
Et donc,
ces sortes de
extrêmement
détails
sont les différences
entre la setting
des objets vers un objecte
vers un objecte littéral
sont des choses
que je n'aurais pas pensé
avant
le fun.
Oui, pour sûr.
Je pense que
c'est quelque chose
que beaucoup de gens ne pensent pas
jusqu'à ce qu'il y ait un problème.
Tu sais?
Ou, je pense,
de l'inverse,
c'est que tu es construit
un tool
comme
tu es construit
comme Bun
depuis
le début.
La performance peut se matter beaucoup.
Mais
en en faisant un step-back
et en en parlant de Bun
plus grandement,
je dis à la première

Bun est un projet
très ambitieux
et expansif.
Le scope est
grand
comparé à
ce qu'on peut normalement
prendre.
Donc,
on pense sur les
tools comme Dino,
qui est un temps de tour
et qui sort de
ce qu'on peut dire
comme
je peux
faire
type script
sans
le faire
par le type script
ou pour
les types de tout.
Mais,
Bun,

on peut
faire la dépendance
et
faire la transformation
et ça a
toutes ces
responsabilités extraites.
Pourquoi
est-ce que l'inspiration
pour
mettre
tous ces
features ensemble?
Tu parles de
votre jeu
plus tard
et de
comment
ta transition
est passée.
Mais
ça semble
comme
prendre plus de responsabilités
et ça ne fait
plus
plus
de
faire
attention
à l'une des zones
qui sont
intéressées
sur
comment
cela a
développé.
Je suis vraiment
frustré
de comment
tout est
en
type script.
Et
c'est
je me souviens
encore
la première fois
que
j'ai
écrit
une objective C
et j'ai
essayé de
logger
quelque chose
d'en
en
en utilisant
un S-log
qui est
comme la fonction
et c'était
juste
plus
rapide
que
le console.log
et
ça ne me fait pas
j'ai eu
ce que


comment
l'enviendrion
devrait
prendre
et ça
juste
complètement
m'a
pensée
que vous pouvez
logger
quelque chose
d'en
en
en




en
en
en

en
en
en

en

en
en


en

en
en
en
en


en


en


en





en


en
en




C'était vraiment pas un important 10 ou 15 ans plus tard, mais comme l'internet a été plus important et a été sérieux,
le JavaScript a été très sérieux.
Mais il semble que les outils ne...
Ils ont la même...
Les outils existants aujourd'hui ont souvent la même effort d'engénérisation que les outils qui sont construits dans les linéaux.
Et je pense que c'est quelque chose qui a été mis en train de faire un JavaScript.
Oui, oui.
Donc, votre tour au BUN a été comme, ok, je veux juste construire un outil, et puis tu as un code copy de ce bâtiment.
Et puis tu es comme, oh non, ça doit être un tour au BUN.
Oh non, maintenant, ça doit être tout.
Donc, où est-ce que ça s'arrête ?
Qu'est-ce que c'est ton but en cours ?
Qu'est-ce que le futur de BUN perfect ?
Est-ce que chaque bâtiment de JavaScript que je fais, je le run au BUN ?
Peut-être.
Ou peut-être plus précisément,
ça devrait être vraiment rapide.
Ça ne devrait pas être un problème.
Build times pour tout ça ne devrait pas être un problème.
Et c'est aussi une partie de l'inspiration du BUN install.
C'est que ça a pris un temps très long pour installer les dépendances.
Et je pense que c'est un peu comme le BUN run.
Le BUN run...
Le BUN npm run npm juste trop long.
Et le problème n'est pas vraiment le bunt de l'NPM.
Ou, en cas de l'article de BUN, c'est vraiment un article de bunt.
Le bunt est un domicile de bunt très common ici.
Le bunt est trop lent.
Et la partie de ça n'est pas entièrement bunt.
C'est aussi un peu comme le B8.
Ces choses ont besoin d'un start-up très vite.
Et je pense que c'est une des choses uniques de la course de JavaScript.
C'est que c'est très très vite, comme un compiler de temps juste.
Mais aussi, le temps de start-up est vraiment bon.
Le shell de JSU, pas le BUN, mais juste le shell de la l'onix de la l'automne.
C'est un point de vue de 4,5 milliseconds.
C'est une base-line.
Peut-être que c'est 3,5.
C'est un point de vue de 3,5.
Si je vous le rappelle correctement,
c'est quelque chose d'un point de vue de 24ms,
pour faire un monde hélo.
Et Dino est un peu mieux que ça,
parce qu'ils utilisent des snapshots.
Non, pas des snapshots, c'est un autre.
C'est un autre nom.
Mais c'est seulement un 2x différent.
Oui, je pense que c'est bien de se débrouiller le point de vue de 3,5.
L' declaring Bing, et les Key workăr streaming wr αναcht weten ben les culottes chez G drying.

on moque en défi en porta Yo know paia,
c'est un JCP Air Asíître couples des courtesy MOSW bunları.


Oui, me stainless.

ごow followed.
Oui, c'est une D flat que j'étais d'une chance positive.
Chromium exécute JavaScript using VA.
Vous pouvez penser que Chromium a aussi acheté sa propre runtime,
comme Node ou Dino ou Bun,
parce qu'ils ont la web,
mais qu'à l'aide d'un server, ils ont les web APIs.
Donc, Bun utilise le Core JavaScript.
Et le Core JavaScript est utilisé par Safari.
Il a aussi des séparements de devices qui le run.
C'est différent, il a une implementation différente.
Il y a beaucoup d'interessants d'un Core JavaScript.

Il y a beaucoup d'interessants,

qui font que c'est plus possible pour moi,
pour que la web API soit la Bun.
Et je ne peux pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de
mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir
de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas
à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de
mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir
de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas
avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne pas avoir de mal à ne
stack
ça
et c'est vraiment sympa parce que ça vous permet de la faire.
C'est aussi une partie de pourquoi je n'ai pas pris beaucoup de temps pour le mettre à la base.
Ce sont probablement les plus compliquants parts pour se faire comprendre
ce que les fonctions sont, ce que les fonctions sont en JavaScript Core.
JavaScript Core n'est pas vraiment design pour être facile à être embeddé.
Les docs qu'ils ont sont pour le API C, qui est assez limité à ce que vous pouvez le faire.
Le API C est principalement design pour les apps iOS,
pour l'embêtissement de JavaScript Core pour un petit truc,
comme un in-game,
comme quelque chose qui a des codes,
comme si vous avez des pares ou quelque chose.
Donc, bun, il faut utiliser beaucoup de l'application de l'application private de la JavaScript Core.
Et ça a été un mois
de me faire lire un peu de code en webkit.
C'est un gros code base.
Et juste comme...
Oui, c'était juste de passer
par le code et de tenter de...
Il serait comme...
Un peu de chose, c'était juste,
« Comment j'ai-je commencé une application simple
par mettre en place ? »
Et même avant ça, c'était comme, « Comment j'ai-je même emmené ? »
Comment j'ai-je construit
pour que ça puisse être inclus dans un autre application ?
Sans en mettre en place tout.
Parce que le code ne faut pas avoir un web browser,
il ne faut pas avoir un bar URL, pour exemple.
Ça ne fait pas du tout.
Fortuniellement, dans la case de la JavaScript Core,
ils ont un port JSC-only,
qui fait que vous portez juste les parts
qui sont rélevées à la construction
et à la construction de la JavaScript.
Mais même si vous avez juste la CAPI,
vous devez faire un peu de choses
pour utiliser l'application C++.
Et aussi, je n'ai pas vraiment connu C++.
Je ne me sent pas vraiment connu C++.
C'est un langage non-trivile.
Et j'ai créé beaucoup de choses.
J'ai fait un C++ en collège.
Et j'ai pas regardé ça beaucoup de temps.
Et maintenant, je vais voir un peu de nouveaux specs.
Et je suis comme, oh mon Dieu, il y a beaucoup de choses.
Oui.
Je pense que...
Il y a des choses que j'aime vraiment.
J'aime que vous avez plusieurs fonctions
avec différents types dans la signature.
Le nom est le même.
Il y a probablement un nombre spécifique.
Je ne sais pas.
C'est comme fonction overloading?
Peut-être.
C'est un peu plus compliqué.
Je pense que c'est probablement plus compliqué.
Parce que ce n'est pas exactement...
Ce n'est pas comme quand vous étendez...
Ce n'est pas comme la classe.
C'est comme que vous avez le même nombre de fonctions.
Mais ça accepte différents arguments.
Si vous avez une spécialisation,
c'est comme si vous avez une spécialisation en nom.
Je pense que c'est un cool feature.
Mais je n'aime pas beaucoup plus.
Le truc intéressant avec C++
c'est que vous pouvez faire beaucoup de choses
et c'est vraiment difficile de trouver exactement ce qui se passe.
Parce que le truc spécifique
c'est que vous pouvez avoir des codes
qui se rassemblent dans le constructeur
et dans le destructeur.
C'est comme un grand source de comportement
qui va se faire courir,
faire de l'exploitation,
rassembler plus vite
parce que vous n'oubliez pas
que cette fonction est en train de s'en parler.
Il y a 4 niveaux de nesting.
Vous faites un lookup anatomique
pour que vous puissiez avoir un reference.
Et c'est comme une nature anatomique.
Une nature ou autre.
Et ce n'est pas de la existence.
Parce que ZIG n'a pas
ces types d'obstractions.
C'est une décision très bonne.
Ça fait quelque chose de plus compliqué.
Mais...
pour ce type de product
où vous voulez vraiment...
Il faut vraiment être rapide
pour tout.
C'est important.
C'est la bonne trait de l'offre.
En parlant de tout,
quelque chose qui est très commun avec le toulon de JavaScript
est les plugins.
Et les plugins aujourd'hui
sont en javascript pour Babel.
Et pour ça,
le code de bun
est très petit
et maintenant vous avez ce nouveau source de sainte.
Vous plantez sur ajouter les plugins
au bun?
Parce que vous avez
un code de CSS.
Vous avez un bundler.
Vous avez un transpiler.
Il semble naturel
que les plugins
vont venir à un moment.
Donc,
ce n'est pas documenté.
Mais ça existe.
Je pense que ça va être
quelque chose que les gens
vont vraiment aimer
quand c'est un peu plus long.
Ça fonctionne maintenant.
Donc, la idée est...
Je parlais vraiment
de comp, de temps,
et tout ça.
Et la même chose
pour JavaScript.
Donc, l'idée est
quelque chose de...
C'est...
La implementation est un peu
comme Babel Macros.
Mais,
en plus de
avoir un DSL
que vous avez à apprendre
afin de
convertir
des arrays
à
les arrays de la version AST.
Le bun fait
la conversion automatique.
Donc, vous
utilisez la fonction de la construction
et le bun
va retourner...
Les objectifs que vous retournez
ou
si c'est un primitive,
ça va être
répliqué
avec la fonction de la call.
Donc,
c'est un moyen vraiment simple
pour
faire la code
de la runtime
à la construction.
Donc, les plugins sont élus
dans ZIG?
JavaScript.
Oh, ils sont élus dans JavaScript.
C'était une grande raison
pourquoi j'ai choisi
un runtime en bun.
Parce que
le bun n'a pas...
Le bun n'a pas commencé
comme une runtime.
Le bun a commencé
comme un bundler
et un transpiler.
C'est
quelque chose qui
semble malade
avec
d'autres
native transpilers
que
tout de suite,
tout le monde
a dû
mettre tous leurs plugins
dans Rust
et
dans
le cas de
EOS Build,
si vous regardez
si vous vous mettez
les plugins
de JavaScript,
ils ne sont pas très vite.
C'est
un constrain
de utiliser
ce protocole IPC
de ne pas avoir
de la contrôle au niveau
de comment le JavaScript
exécute.
Donc,
je pense que
dans le cas de bun,
ce n'est pas un problème.
Mais
les constraints
vont être différents.
Le moyen de ce travail
maintenant
n'est pas de mettre
le code AST
dans les plugins.
Il donne un code AST
dans le scope
de
si vous appelez
une fonction,
alors
le
code a été appelé
avec le code AST
qui est la expression de call.
Donc, ça
inclut
la
fonction
et
n'est pas
n'importe quel argument.
C'est très bien
comme vous appelez
une fonction
à la build time.
Mais
vous vous en avez
des codes AST
en lieu de
les arguments.
Et donc,
ces arguments
peuvent aussi
être cohorsés
à l'un de les types natifs
et
à l'un de les types de travail.
Donc,
si vous
passez
une littérale de string,
vous pouvez
obtenir l'evaluage
comme une string
ou vous passez
un littérale d'objectif.
Vous pouvez
convertir ça
dans un objet.
Mais
si vous passez
un identifier,
vous allez le
comme un identifier.
Et que
ce identifier
en ce cas
est un code AST.
Oui, c'est intéressant.
Ça ressemble
beaucoup à
les macros
ou
je pense
peut-être
même en compter
en temps.
Je peux voir
l'inspiration
là-bas
de ces
systèmes.
Parce que
je veux dire
une tool de JavaScript
où vous
vous en prenez
un bloc de
texte
et ensuite
convertir
en AST
et ensuite
passer
à des
fonctions
qui
se transforment
en
un autre.
Comme le tout.
C'est
évidemment
lent
et
délicieux.
Mais ça vous donne
beaucoup de liberté
et de flexibilité
pour faire
des choses très
malades.
Donc,
vous savez,
c'est
intéressant de

Je voudrais voir ce que ça
ressemble.
Oui,
il y a un exemple
dans Mon's Repo.
Il y a quelques exemples.
Il y a...
Il y a...
Je dois en fait
faire
les vrais docks.
Il y a...
C'est juste
vraiment
très bien
maintenant.
C'est
absolument pas
bon.
Mais
l'exemple
est
si vous vous rendez
des packages,
il y a
un relais
et c'est
un
plug-in
pour
que
ça
utilise ces macros.
Et en ce cas,
donc
les macros
ont deux
différentes manières
pour les utiliser.
Un est
que vous pouvez
juste
rétablir l'objectif
et ensuite
vous pouvez aussi
utiliser
le transform
de la JSEX.
Et le transform
de la JSEX
juste pour les macros,
ça
permet de vous
avoir
des choses
qui ne sont pas
que vous
inclus
des notes
qui ne sont pas
représentables
par
les littéraux
et les arrays
et des choses comme ça.
Donc
dans
le
relais

il faut
injecter
un importe
dans le fil du top.
Donc
ça
utilise
la
JSEX
tag
avec importe
avec
une passée
de passée
et
ça
fonctionne
parce que
c'est
comme
un mode macro
dans
le temps de la JSEX.
On










s'est
Grace



operative
de
편.
Il y a
une
!
!
!

2
6
des enjeux et des barres.
Et je pense que
quand ça devient
plus utilisé,
vraiment, c'est
je pense qu'il faut être testé un peu plus
et avoir des gens essayer
parce que c'est mostly
ideas in my head
et pas enough
building things with it.
Il y a quelques exemples in the repo,
there's one that's like that's your CSV
at build time and from a URL
and get just the results
into the build.
So then like, you could do like
in that specific example, it's like you
create, you statically render
a react component
by using remote data and it's sort of like
sort of like if you've
ever used like next.js
it would be sort of similar to like get static
props except instead of
only being in the page, it could be literally anywhere
in any file and then
so
so in the other neat thing about
doing this stuff at build time, at comp time
really, is like it enables a lot of
optimizations for the transpiler
and for like dead code elimination
that are just not possible in any other
tool because it can detect, it actually
inlines the result of what you call
and it does this recursively.
So if you
get a big JSON object from like the github
API or something and you only actually
want the username, then it's
going to only include the username and the output.
And
that can be like a lot smaller than
the entire
JSON object and how you would do it
normally. And it'd be pretty hard in a lot
of cases for a tool to do that
because the minifier or what not wouldn't know
it wouldn't know that like those are side effect
free and that like you're only ever going to be able
to access this one thing because
there are various constraints but because this operation
happens at build time and because
it's all like one cohesive
thing, it's possible to make this really
fast while also
being making the code
like make these macros run really fast
while also making the code smaller
and they run fast because they don't get
access to the whole AST, they only get access
to the part that they're actually care about.
Yeah, yeah, that's definitely the big thing
and I think that's a lot of the problems
that we've had with, you know, a lot of tools
Babel, Post-CSS, which I think Post-CSS
might be trying to take a little bit of a different
tack now but like if you just give
the whole AST
to a function that only cares about like
two or three things then you know it like
is inevitably slow, especially when you run it
over an entire code base. Yeah, and when you run it multiple
times because
when you have to run it for every single
plug-in, like that's a problem.
Yeah, yeah, totally.
It makes any
performance problem that you have at a baseline
of just a single plug-in just explode
because you're like multiplying that by
n plugins.
This is really awesome.
I think one of the most challenging things
with like any metaprogramming
or macro system or whatever is like
the happy path is great
because it's like you get to do complex things
and it, you know,
simple like in user code
but like when things break
or stuff doesn't work
that's always where it's really hard.
It's like understanding that
this thing is broken because of some macro code
and like trying to trace that sort of thing.
It's like it makes your
implementations a lot more complicated
and error handling and all that stuff
can be hard.
But it's really cool to see.
Yeah, the error handling part
is mostly,
it mostly re-use the existing error handling
for the JavaScript runtime parts.
It just turns them into build errors.
There's like a global log
essentially, which is a distinct
log for,
from like standard out that is structured
as like a bunch of build errors or resolve errors.
And because BUN transpiles
every file, even like node modules
even regular JavaScript files
it has these, it always
has this build log and then
depending on how the code is
run, that build log will
either become, either that will
return or throw build errors,
which I think it's literally called build error
in JavaScript, like if you do like a dynamic import
to a file, then in that file
fails to build, like fails to transpile
then it throws a build error.
Or if it's at the very start
of the application, then it just logs it.
And then if you do like console up error
on the build error, it prints it the same way.
Like the console functions
detect that oh you're printing a build error.
I'm going to print this using the special
build error format.
Nice, nice, that's awesome.
Yeah, it's really cool how
you detect the context and sort of take care
of things in so many situations whereas
in a lot of other, like if you're doing other
tooling, it's like you have to be very aware
of your context and like do a lot of extra
effort to, you know, map
things and that can make
consistency and tooling really hard because you can
have like three different plugins
trying to log in different ways or whatever.
That's really awesome.
I kind of want to just like step back a little bit
and talk about like, so
Bun, we've discussed very ambitious project
that like does a lot of stuff.
There's like two things that I'm wondering
is obviously this is a ton of work
and it seems like you might be building up to
something. So the first question
is sort of like, what's your
end goal here? What would you like to do with it?
And then
my sort of follow-up question is that is like
how do you, do you have any plans on
making it sustainable?
I know this is obviously a ton of work for you
and as we've talked
about a lot on this podcast, open source stuff
can be hard to monetize
but your time is very valuable.
This is really, really hard work
so
yeah, maybe like, so just starting
what is sort of the end goal?
What do you want to do with Bun?
I think basically,
I think Bun, there's this, we're sort of
entering a, the past like
five or so years, JavaScript is kind of
the syntax and like the tooling has sort of
started to stabilize a little bit more
like in contrast from like the ES6 time
around that time, where like there was a bunch
of new tools and new ways of doing things
and there's like, you know, there's a couple
newer things coming out, like the match
I'm,
that's not exactly the right name for that but
there's like two recent proposals that are
like records and tuples and then the match
one, I'm forgetting the name.
Yes, those will probably change the syntax a lot
and then maybe the optional types but
it seems like it's kind of somewhat stabilizing
so I think there's going to be a consolidation
of JavaScript tools, I think that's kind of
inevitable and it'll just, everything's just
going to go like a lot simpler
if you have fewer and
tools that do more but
I also think a prerequisite
of that is it needs to be
really fast and
consolidation should enable tools
to be faster because you can share more
of the data together so like
in Bun's case, the
Tomo parser and the JSON
parser use the same AST
and that means that
that's like more efficient from like a
from for many reasons
but one is that if I optimize
the JSON printer
that also makes the Tomo
part print faster
because they do the same code
so basically, I think
Bun has an opportunity
that there's this opportunity for like
an all in one tool
that fills a lot of the roles
of existing tools and
we will just make
everything a lot simpler for
like day to day stuff
and I think
Bun has a good shot at being that tool
I really only see two players
in this space right now, it's you
and Rome tools, like you guys
you're not approaching the problem in the same way
but like it's kind of the same
angle of like unified JavaScript
tooling set that's also fast
I don't really know
about Rome that much
I don't really work on Rome
I would say
it's almost different though because
you know, so Rome
their goal is to have
this and for
listeners who might not know, Rome is like
this all in one tool set written in Rust
that tries to
re-implement linters
and pretty printers
and basically all the JavaScript tooling
from a very similar setup
but I don't think a runtime is in their
wheelhouse, that's not something they're trying to do
and at the same time you have Dino
which is a runtime for
JavaScript also written in Rust
Ryan and crew are sort of focusing on
doing
improving on what
the foundation that they laid in Node
and trying to make better decisions technically
and make that faster and everything
but the crazy thing for me
as Bun seems to be a combination of these two things
is that you take Rome and you take
Dino which are both huge projects
you lump them together
and both with VC backing
like you're one man shop
I guess the real question is
do you
plan to make Bun more
of a community driven project?
Do you plan to get VC backing at some point?
Like you can't do this all by yourself forever
Yeah, no
it's impossible to do
all that I really want Bun to do
by myself and I think
that like
Bun is going to be a company
and we'll hire people
and people
will help
won't just be me working on Bun
and I think this is going to happen pretty soon
it's been really really cool
seeing the reaction of Bun
I spent a whole
over a year just kind of
in this room
writing lots of code and
I think that it's just really gratifying to just see
like we got like
I think is that like 25,000 stars
on a GitHub now which is just like
seems like kind of insane
especially when it's so early
and when so much stuff doesn't actually work super well yet
it feels it's very much like
like Bun and Saul is really fast
but there are all these things I need to fix with it
like it there's like a few crashes
that are not good and then like
it's just very early
but people still seem to be really excited
Yeah, usually the order
is make it work then make it fast
you seem to kind of do in the opposite
of make it really fast and then make it work
Well
it's more like doing both at the same time
and I think
it has to be fast
like the speed has to be prioritized
from the beginning because
it's so easy to build a slow thing
and so like the only way to make it real
to make it fast is you have to focus on it
from the very beginning
and you have to also just like benchmark a lot
I spend so much time
just benchmarking stupid things
What's the stupidest thing
you think you've benchmarked?
This is like a really subtle
this one actually had some impact though
basically
So bun
text encoder, like the text encoder class
it's really fast
but if you compare it with
dino or note, to compare it with note
it's like a
I think it's ten times faster
but I'm sure somebody will double check
If you compare it with dino
I think it depends on the type of string
but if it's a
latin one string
and it is not a rope string
I can explain what that means in a second
then it is usually
from what I remember it's two times faster
and this was after some back and forth
where they saw that bun's text encoder was faster
so then they were like we got to speed up
our text encoder
and the reason part of what made bun's text encoder
really fast is this micro optimization
where I spend a bunch of time
figuring out okay how do I
when you
to do a text encoding
to encode from flatten one
to utf-8, flatten one is an encoding
is the default encoding in most JavaScript engine
you have to
you basically to find all the characters
all the letters which are greater than equal to
127 in ASCII
and then if they are
you do some stuff to convert them
but the slow part is
how do you quickly find the character
that is greater than equal to 127
the really naive way
which is the easy way
is you just do a for loop and you say
okay does this character
is it greater than 127
and if so you do the encoding stuff
the slightly faster way
is you use something called simpt
and this is a tool that's not really available to JavaScript
it's simpt for single instruction multiple data
and it's a way to tell computers
it's a CPU instruction
it's a bunch of CPU instructions, it's not one
where you can pass it
you can instead of operating
a one number at a time
you can operate on up to
it depends on the
there's like various differences between like
CPU architectures and when in supported features
but usually in bun's case
you can do, you can
it'll read 16
numbers at a time
which are 16 characters in a string
and it looks at which if any of those 16 characters
are greater than 127
so that's like the
that was like the first optimization
for like how do you
basically it's like how do you find the number bigger
than 127 really fast
then the second optimization after that
was once you do find it
you also need to find the index
which of those numbers
which of those 16 numbers are
less than 127
because you need to, or greater than 127
because in which is the first one, the lowest one
because it tells you
depends on how you use it but the easiest way to use it
slash the
the
the most straightforward way to use it
is you just get, you just find
which if any are, if it has any non-zero values
so then
but there is like a bug in
this is like a, I think it's like an LLVM
bug LLVM is like the compiler used
that is like the, ZIG is a compiler
but ZIG has a compiler but it also uses
it emits LLVM
IR which is like
and then the link which is like the language
that then gets converted into like
assembly and so there's like
an LLVM IR bug
that causes it to
emit, if you
you're using this simd
and you're in this way and
there's like an efficient instruction
dedicated to just counting
what was the first number
that's not, what is the first bit
set, it's count
trailing zeros and there's count leading zeros
and these in JavaScript
the function is
math.clz32
which is a very
which is like a weird acronym
without the context
or like a meaningless acronym
but basically it counts
the leading zeros in the
bits but in the
there's some LLVM bug
that was like
causes it to be, if you pass it for the
simd vector it causes it to
count to effectively do a for loop
and it does it like using
the non-simscaller
way. That's the name for
the non-simscaller. I probably
mispronounce it now, it's not a word I read
but it's not a word I really say a lot. There's a lot of words like that
in programming.
So the one micro, that micro
optimization was basically just using
just getting the max, checking
if the max is greater than zero and then
using what's it called, a different
technique simd
within a register, soirs
or, I don't know how to say that
and then basically doing a similar sort of thing
as what you would do with simd but without any of the simd parts
just with like, bit shift operations
there's a few different blog posts on this
that are pretty good. Basically everything that like
I don't know how to say the name
Le Maier, L-E-M-I-R-E
everything he writes is really good on performance.
So yeah, that was an example of like a
this wasn't a stupid micro optimization but it was like
it turns out that it's actually really complicated
to correctly
to to, as efficiently as possible, find
a number that is greater than
127 in an array
if you want to just like
be really obsessed with
making it fast.
Which you are.
But there's also real performance
that like gains from this. It's not just like
micro benchmark, it's part of wide
bond is like three times faster
than the node at server side rendering
it's because it's like
that actually turns out
it's mostly a text encoder thing
that it just has to spend a bunch of time
converting the text from Latin 1
or from UTF 16 into UTF 8
so if you can count
which number is greater than 127
really fast, you could make
react server side rendering much faster.
That conclusion probably took you
hours upon hours
to come to.
Well, in this particular case
it was I did the text encoder
optimization stuff well before I
focused on react SSR
but the direct SSR part
it was I profiled
it a bunch using instruments
and then instruments was like
here are the functions that are taking a long time
so now I was like okay how do I make these
these numbers go down.
Yeah, it's interesting you're working at a much
different part of the stack than I
like any front end people so like
the way you view these problems is very
interesting. I have one last question
before we move on to tool tips. I saw a tweet
where you talking about like
kind of like the future use cases of bun
and like doing per client
bundles on the edge.
Like that kind of sounds like a bunch of word soup
to me and probably to a bunch of our listeners.
Can you explain like what that idea is
and like yeah just explain that.
Well, sort of
what I was saying earlier about macros, you could take the same idea
and basically
today
you generate
you have like you have
today the way build steps working for
a lot of front end co-basis you have a
you push to production
you push to get and then you have some
CI step that runs web
pack or whatever on the
on the asset and then you serve the same asset to everyone
and then you have a CDN that caches it.
The direction I think would be really interesting for bun
is
what if you build a unique JavaScript bundle
for each user
and you had like an API
et sort of like hitting the
the loading that importing the JavaScript
is sort of like hitting an API endpoint
or you have like some dynamically
generated data
and inside the
inside the actual printed source code
and the result is that
a lot of code could get a bunch
could your code could get a lot
could get a lot simpler because a lot of the complexity
of
writing front end JavaScript is
how do I manage getting the data
how do I manage the state associated with the data
and even if it's just a pure static
data you still
you still have to have like a serialization
library you still have to like
you have to worry about type safety in a lot of cases
and you have to worry about
like even if it's just static
but if you could actually just make it so
each when the user
imports the code
when the code is loaded if each one
if it already has the
data inside
it gets a lot simpler
you don't need to like a library then
you just have a function that's called a build time
and that build time
happens to just be the HTTP request
so then what's missing is
how do you actually pass that context
into the back row how do you pass that context
into the function and so then that's like a thing
that it's like an API that the transpiler
needs to expose but
if you can get access to the request
data if you can read the URL
and read the headers that's enough
to just like make some database calls
and then inline the data directly
into the file and then suddenly
you have really good dead code elimination
because you know exactly what
parts of the code they're using so you don't need
a whole data fetching library you don't need
you don't even necessarily need to
it might not even include the entire
object that you're returning
from the database it might only include
the exact fields that you're referencing so it turns into both
a more efficient
it turns into like less code that you have to write
while also being
less code that runs in the browser
so the thing loads faster
of course the tradeoff is now you have to run
this code
you have to run you have to generate new javascript bundles
or at least new
at least new individual components or something
for each user
but and the only way to make that actually work
is it has to be really fast because otherwise
it's gonna just
make it way slower because
and so
that's sort of like
this is like
this hyper thing that's really only possible because
bun is a transpiler a bundler
and a runtime all in one
super cool
that's crazy fascinating so facebook
had this project and I
was trying to look for the name of it now
where they tried to take your code
and do some like early optin like
prepack they tried to execute it
yeah yeah yeah
they try to execute it just like
run it and transform things so it's like he has some static code
that like took a static array
and did a lot of operations on it or whatever
they would like run it through there and it would like just
spit out the result and that's the final result
was what you would
but this is like so much crazier
and that
the actual complexity of this is probably
much much lower
cause I mean
they had this tremendously complex problem
and like you know doing early execution
of the programs and trying to figure out what they can serve
whatever
but the actual complexity of this is much lower
just like the question is can you get it fast enough
to be able to serve what you needed to serve
super super fascinating
I really would like to talk more about that
I think the long term there
is you really need a hosting service
to make that work
and that's also
yeah
so that's kind of the direction I'm thinking about
with bun
that's super cool
awesome
with that let's move on to tool tips
what did you say the name of the tool was
is re what?
prepack
yeah it's a cool idea
they stopped working on that
yeah
it's too bad
I mean it makes sense
it's a fiendishly complex problem
I think they stopped working on it quickly
yeah
I feel like it's just be very hard to define
what it could do
how to make it like
consistently work
oh this is cool
I hadn't seen this before
yeah so my first tool tip of the week
is my new get client
over the past six or eight years
my main get client has been using
get up which is a very visual way
to visualize your get repo
it's basically
this like
this tree part of the client
but that's the entire get client
but unfortunately it's an open source tool
that's maintained by people that aren't paid
and the performance has just gone
to shit
and in my work repo which is like
50,000 commits it just like
it chugs to a halt to do any operation
so I set out to find a new get client
that I wanted to actually use
and I've been using this one for about three weeks now
and I gotta say it's very good
and what's funny about it
it's like it's built by a couple
a husband and a wife
who just put it on get hub and then I found an issue
where people were like begging them to be like
hey take my money I want this to keep going
so like it does cost $50
but it's like the sublime model
of costing money where it's like
I'm just gonna annoy you every
amount of times you do something
and if you're looking for a new get client
it's very fast and very easy to learn
so check it out
it has a lot of cool features in it
the really cool feature though
is this rebase feature
it brings up all the commits you're rebasing
and you can just like say
if you want to drop them squash them merge them reword them
very nice
nice nice
this is an actual tip
did you know that
you can have a qr code
that is actually
like a wifi access
so special format
of qr code I didn't know
there is this blog
and I think I saw it on hacker news
probably
it's JGC.org
we'll link the blog post in the show notes
but yeah it's just that
I didn't know
that there is a special format of qr code
that is just like wifi access
so like all the phones that support this
you can just point it at the thing
and set up wifi access
yeah I think this works on both iphone
and android phones
something that android phones do a little bit better though
is you can sort this same thing
on an NFC tag
and on an android phone
that'll like automatically like
log you into the wifi
it doesn't work with IOS but hopefully someday
it'll get it eventually
yeah you know 5-6 years after
after it's a cool thing
now we got the awesome bun repo
what cool things have you found in here Jared
like one thing that bun hasn't implemented yet
it's just like it's just child process
but in bun utilities somebody implemented child process
using nappy, using nodes native bindings
and I just think it's like
really cool that like bun has been public
for like less than a week and people have already started
writing all these libraries
but not less than a week it's been public for just over a week
and there's actually more than this there's not on the repo yet
and I think that I think it's like
I think it's just
it's just really cool that like honestly
I just think it's cool that people even want bun
it's just very gratify that like you know I've been working on this thing
for a year and just people seem really excited
yeah it's definitely a cool thing
like you've probably dedicated thousands
of hours of your life to this at this point
and that like it's just getting such
wide wide acceptance
is it pretty cool
for a while there were you like kind of
you had like a closed beta going
or like a sponsors only type thing going
it was it's I've actually never accepted
any money for bun I've just been living off
savings the the
yeah I had a private beta
but it was like kind of like
the way it worked was
you would go to the website you click request access
and then it would take you to bun's discord
and then you type I want bun
and then the bot would send
you an invite link to the GitHub repo
so at the time of launching publicly
there were there was already like 4000 people
in the GitHub repo and that was just because it's been
it was important in this like
private beta for a while
I think it's really important that bun
did a private beta because it's just such
so much scope and
honestly like I should have just
tested it more before shipping it publicly
it was kind of random excuse me
it was like a I just
felt like if I waited any longer
people would think it's just vaporware
and that was just never going to happen so I was like ok I'm just
going to choose a date that's not
tomorrow and then I chose like
July 5th because it was the day
after July 4th which and it wasn't
tomorrow anyway and I knew I needed at least
a week to prepare stuff and
honestly it's still not really prepared
but it's
going well.
You gotta put it out sometime and congratulations on the
0.1
it's a big milestone and you can't wait for that 1.0
Yeah, sure.
There were 84
83 versions before that
or at least the build ID was
83 but you can go back and bun's repo and you'll see
a lot of versions
you can see the first one with the macros too
and I actually did
a
there's like
a lot of screenshots
of two of like.
What's the old adage?
Just like you're supposed to release it before it's ready
or whatever just like make sure you get it out there
Yeah
Yeah, wouldn't want bun to die on a hard drive
One question about the name though
was it just because of bundling?
Where does bun come from?
So
this brand has a bunny named bun
what?
Okay
I was like, at first I was like no, I'm not going to date
this after your bunny
that I thought about it was like oh, that's actually like
pretty good name
So then originally it was like bun like a bunny
and then my friend
got this
made this logo that was
like a bow
and then I was like okay, I guess it's bread now
Then you have the bun bun command
which I think is amazing
Yeah
But it's also confusing is the problem
I like it but it's confusing
but because I think
when you repeat they have to say bun bun
People are like
wait, I run the same command twice
or I type the name twice
like
it's very hard to explain in documentation
and then people are like what does that actually do
it just sounds like meaningless words
but I think it quickly makes sense once you run it
it also kind of needs more
needs to be done a little bit differently
I have a lot of thoughts on like
with the bundling form
I want to do like single file deploys
I think that's going to be a nice thing
and so that's going to all that stuff
is going to change a bit
Well I think you should add a command
bun bun bun that prints out a bunny
I mean that could be dude
that could be that's doable
that could be done because
it has to be a file after that
so then it would otherwise air
so it would be like a funny easter egg
ok, my last tool tip for this week
is the player
this is actually on our third episode
we talked to some of my former co-workers
from Intuit
and it was about this project
and it just got open sourced the other day
so what the player is
is a way to author
like applications
or pages from a back end
that render natively on multiple platforms
so what that means basically
is you can return this
from a back end saying that you want
two pieces of text on a page
and then that gets sent down to your app
which can be a web app
a swift app or an android app
and those apps choose to render
that JSON
natively
why that's really cool
the biggest thing to me is that
say if you want to like create a new screen in your app
if you want to deploy that
through the normal iOS process
you have to go through a whole new app store release
you have to get it approved
could take a long time
if you're using something like this
all you have to do is return JSON
that your application understands
and then voila you have a new page in your app
so if you've ever wanted something like this
many people probably haven't
but I'd give it a good look
because me and my co-workers had been working on this
for like 4 or 5 years
so it's come a very long way
and it's very very battle tested
that's really awesome
yeah don't like...
wasn't it AirBnB or somebody big
was doing that same sort of thing
it's like views driven by data
yeah there's a few like
JSON net was like the first big one
but I don't think that exists anymore
yeah AirBnB has one
but yeah it's a good option
so my last tool tip of the day
I've been working on my website
and I had Obsidian Notes
Obsidian which is this note taking app
I had Obsidian Notes embedded into my site
and I was paying for the subscription thing
and I disabled that
because I wanted to do some custom stuff
with rendering etc etc
rendering Obsidian Notes
there's a lot of stuff that goes into it
and I found this library
it's called Perlite
I'm not sure exactly how to pronounce that
P-E-R-L-I-T-E
anyway so it
sort of does what it says on the tin
it renders Obsidian Notes
so it's a library where you give it your Obsidian Markdown
and give it the metadata
you can... there's an extra plugin
that you can use to like collect all the metadata
for what all your files are linked together
and yeah it just renders everything out on the web
so if you want to post your own Obsidian Notes
in a custom way
this is a great way to do that
without taking on the complexity of re-implementing
the front-end of Obsidian
which I assure you is non-trivial
Yeah, especially when you start getting to the graph rendering
Oh yeah, for sure
Okay, that's it for our tool tips for this week
Thanks for coming on, Jared
this was a much lower level conversation
than I think Justin and I were anticipating happening
but it was super interesting
Is that cool?
Very welcome and very very interesting
Yeah, yeah, I had fun
Yeah, thanks so much for coming on
and just, I mean
I can't even express how impressed I am
at the project and the sheer amount of work
that you've put into it
and also just appreciative
because so you made that comment earlier
about how you focused really heavily
on a micro-optimization to text encoding
and then the Dino folks was like
oh crap, you know, we gotta like make our stuff faster
that's the sort of things like you know
the rising tide, let's all boat
so the effort that you're doing here
benefits the entire ecosystem
whether people are using bone or not
and from everyone in the ecosystem
I just say, you know, thanks for all your hard work
we greatly appreciate it
yeah, and good luck on the future
Thanks
Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres par Sous-titres

Episode suivant:


Les infos glanées

Je suis une fonctionnalité encore en dévelopement

Signaler une erreur

devtools.fm:DeveloperTools,OpenSource,SoftwareDevelopment

A podcast about developer tools and the people who make them. Join us as we embark on a journey to explore modern developer tooling and interview the people who make it possible. We love talking to the creators front-end frameworks (React, Solid, Svelte, Vue, Angular, etc), JavaScript and TypeScript runtimes (Node, Deno, Bun), Languages (Unison, Elixor, Rust, Zig), web tech (WASM, Web Containers, WebGPU, WebGL), database providers (Turso, Planetscale, Supabase, EdgeDB), and platforms (SST, AWS, Vercel, Netlify, Fly.io).
Tags
Card title

Lien du podcast

[{'term': 'Technology', 'label': None, 'scheme': 'http://www.itunes.com/'}]

Go somewhere