Sempre vale deixar mais claro os nomes e definições para entendermos melhor alguma coisa. Eu particularmente nunca tinha mergulhado a fundo em tentar listar e diferenciar bundlers, build tools, compilers, transpilers, parsers e runtimes... Vamos tentar fazer isso agora
Não é muito nítida a diferenciação entre compiler e transpiler no mundo javascript, mas basicamente o que essas ferramentas fazem é transformar código de uma linguagem para outra linguagem. Os principais casos são (i.) converter versões do javascript (ES2022 por exemplo) para versões mais antigas (ES5); (ii.) JSX para Javascript; e (iii.) Typescript para Javascript.
Build tools / bundlers são ferramentas que conseguem transformar código de desenvolvimento para código de produção. Para isso, é necessário compilar todo o código de diferentes bibliotecas em um único arquivo, ou bundle. Além disso é feito também minificação, e muitas ferramentas trazem também um ambiente de desenvolvimento, com servidor e hot reloading.
Vou citar aqui dois que são mais "agnósticos", que não estão presos a um framework específico (o que acontece com Next ou create-react-app, por exemplo). Vite é, sem dúvida, o queridinho da comunidade 🙂
Um runtime é onde nosso código javascript vai efetivamente rodar. Não podemos pegar um código javascript e fazê-lo funcionar sem termos "onde" fazer funcionar. Geralmente os runtimes além de rodarem o javascript com uma engine (V8, Spidermonkey ou JavascriptCore) trazem algumas APIs/funcionalidades adicionais.
Um parser é quem vai transformar javascript em uma "árvore sintática" que é mais "legível" para a máquina. Por exemplo, o ESLint precisa fazer o "parse" do código para que consiga entender o que está acontecendo ali e consiga capturar erros. Mas ele não "roda" efetivamente o código.
Por exemplo, um parser vai transformar um simples 1 + 1
em algo como isso:
Node {
type: 'Program',
start: 0,
end: 5,
body: [
Node {
type: 'ExpressionStatement',
start: 0,
end: 5,
expression: Node {
type: 'BinaryExpression',
start: 0,
end: 5,
left: Node { type: 'Literal', start: 0, end: 1, value: 1, raw: '1' },
operator: '+',
right: Node { type: 'Literal', start: 4, end: 5, value: 1, raw: '1' }
}
}
],
sourceType: 'script'
}
Dois famosos parsers existentes é o Acorn e o Espree (do eslint).