Banner contendo o logotipo do Nullstack, do TypeScript e do Babel e a mascote do Nullstack, Nulla-chan, feliz por você estar lendo este postMascote Nulla-chan criada por Bianca Zanette (Bilkaya)

- 7 min de leitura

Tags: nullstack, open-source

Nullstack + Babel: Renovando o antigo compilador

BabelAbrir em nova aba esteve presente desde os primórdios da web moderna traduzindo sintaxes diversas do JavaScript, como de versões novas (ex: ES2020), para aquela padronizada e suportada pelo maior número de navegadores (ex: ES5). E até hoje isso tem espaço respeitado nas propostas da própria linguagem do JS (ex: do expressionsAbrir em nova aba).

Sendo tão salvador, pode-se imaginar que existiram fortes razões para propor a implementação do novo compilador SWCAbrir em nova aba no Nullstack. E sim, como eu mesmo fui o principal idealizador disso, posso afirmar: De performance e leveza à simplicidade de algo baseado em RustAbrir em nova aba, projetos como SWC representam uma grande mudança em como se desenvolve a web.

"Então se o SWC muda a web e virou o compilador padrão, por que voltar? Se decida!" Ok! Leia mais sobre as razões do nullstack-adapt-babel existir na seção Propósito.

✨ A documentação a seguir é uma tradução do README do projetoAbrir em nova aba

O nullstack-adapt-babel substitue totalmente o compilador do Nullstack (atualmente SWCAbrir em nova aba + swc-plugin-nullstackAbrir em nova aba) pelo Babel e seu dourado/antigo sistema de pluginsAbrir em nova aba/presetsAbrir em nova aba.

Como usar

Este script pode ser usado de duas maneiras:

  • No modo "automático" você só precisa usar com npxAbrir em nova aba antes de seus scripts Nullstack, como:
"scripts": {
  "start": "npx nullstack-adapt-babel && nullstack start",
  "build": "npx nullstack-adapt-babel && nullstack build"
}

Isso imediatamente faz essas coisas que podem ser totalmente desativadas dessas maneiras

// webpack.config.js
const useBabel = require('nullstack-adapt-babel')
const configs = require('nullstack/webpack.config')

module.exports = useBabel(configs)

No modo manual você pode configurar o Babel com plugins/presets

O que isso faz em detalhes

Quando usado no modo automático com npx:

Procura o nullstack/webpack.config.js original e substitui o seu module.exports da seguinte forma:

- module.exports = [server, client]
+ module.exports = require('/full/path/to/nullstack-adapt-babel')([server, client])

Fazendo este pacote ser chamado diretamente a cada execução do Nullstack, atualizando a configuração do Webpack em sua fonte, então tudo é feito exatamente como no modo manual.

Quando usado no modo manual com webpack.config.js customizado:

Procura o carregador (loader do Webpack) do compilador original e faz com que ele nunca seja executado:

- function swc(options, other) {
+ function swc(options, other) {return {};

Isso é obrigatório para um ambiente como StackBlitzAbrir em nova aba que não suporta nem a menção do SWC

💡 Quer mergulhar no código? Tudo começa aquiAbrir em nova aba

Como desativar toda a mágica

A cada execução isso procura por uma chave NULLSTACK_DEFAULT_CONFIG em seu .env, como:

NULLSTACK_DEFAULT_CONFIG=true

Usando se existir, caso contrário, procura pelo mesmo em uma chave nullstack-adapt-babel em seu package.json:

"nullstack-adapt-babel": {
  "NULLSTACK_DEFAULT_CONFIG": true
}

Usar esse valor desfará tudo e deixará que o Nullstack funcione com seu compilador padrão.

Como usar plugins/presets

Opções customizadas podem ser passadas no 2º argumento da função, permitindo configurar seus próprios plugins/presets:

// webpack.config.js
const useBabel = require('nullstack-adapt-babel')
const configs = require('nullstack/webpack.config')

module.exports = useBabel(configs, {
  babel: {
    plugins: [
      ['babel-plugin-transform-remove-console', { exclude: ['info'] }],
      '@babel/plugin-proposal-throw-expressions'
    ],
    presets: [['@babel/preset-flow', { allowDeclareFields: true }]]
  }
})

Atualmente, os plugins/presets customizados são apenas anexados ao original

Atualmente, o nosso @babel/parser apenas suporta os plugins doExpressions e throwExpressions, como escrito aquiAbrir em nova aba, contribua com esse arquivo se desejar adicionar mais opções!

Propósito

Alguém pode perguntar _"Nullstack tendo um compilador SWC rápido, por que alguém voltaria ao futuro passado?", e compreensível, tipo, eu mesmo estou me perguntando isso agora finalmente documentando tudo isso 😅

Não apenas rápido, a beleza daquilo até me seduziu a aprender um pouco de RustAbrir em nova aba e contribuir com nosso próprio plugin do SWCAbrir em nova aba

Então, sim, há algum raciocínio em trazer de volta os dias de Babel, além de dar a liberdade dos plugins/presets para o usuário e gostar de experimentos, queríamos usar uma plataforma como StackBlitzAbrir em nova aba que atualmente não suporta os binários do SWC.

Então este pacote possibilita projetos como estes:

Projetos de exemplo