Migrando do esbuild para o rspack em Funções AWS Lambda
Nos últimos anos, o ecossistema de ferramentas para desenvolvimento em JavaScript e TypeScript tem evoluído rapidamente, oferecendo opções cada vez mais eficientes para construir e otimizar aplicações. Uma dessas ferramentas que tem ganhado destaque é o rspack
, um bundler moderno baseado em Rust que combina desempenho excepcional com compatibilidade com o Webpack, permitindo aproveitar plugins e configurações já conhecidas no mercado.
Recentemente, ao trabalhar em uma função AWS Lambda utilizando o AWS SAM, decidi migrar o processo de build do esbuild
para o rspack
. Essa mudança não foi motivada por limitações do esbuild
, que continua sendo uma excelente escolha, mas sim pela busca por padronização e flexibilidade em meus projetos.
Neste tutorial, compartilho o passo a passo dessa migração, desde a instalação do rspack
até a configuração do AWS SAM para utilizar um Makefile personalizado. O objetivo é fornecer um guia prático para quem deseja explorar essa ferramenta em seus próprios projetos, seja para funções Lambda ou outras aplicações baseadas em Node.js.
Substituindo o esbuild pelo rspack
A primeira etapa da migração é substituir o esbuild
pelo rspack
no projeto
yarn add -D @rspack/cli @rspack/core terser-webpack-plugin
yarn remove esbuild
Para facilitar o processo de build, adicionaremos um script ao package.json
. Esse script será responsável por executar o comando de build do rspack
sempre que necessário:
"scripts": {
...
...
"build": "rspack build",
...
...
},
Com isso, você poderá rodar yarn build
para gerar o bundle da função Lambda diretamente a partir do terminal, simplificando o fluxo de trabalho.
Configurando o rspack
O próximo passo é criar o arquivo de configuração do rspack
, o rspack.config.cjs
. Esse arquivo define como o código será empacotado, incluindo entradas, saídas, regras de processamento e otimizações.
const path = require('path');
const minify = require('terser-webpack-plugin');
module.exports = {
mode: 'production',
target: 'node',
entry: './app.ts',
resolve: {
extensions: ['.ts', '.js']
},
module: {
rules: [
{
test: /\.ts$/,
exclude: [/node_modules/],
loader: 'builtin:swc-loader',
options: {
jsc: {
parser: {
syntax: 'typescript',
},
},
},
type: 'javascript/auto',
},
],
},
output: {
filename: 'app.js',
path: path.resolve(__dirname, 'dist'),
library: {
type: 'commonjs',
}
},
optimization: {
minimize: true,
minimizer: [new minify()],
}
};
Atualizando o AWS SAM
No arquivo template.yaml
do AWS SAM, precisamos ajustar a configuração da função Lambda para usar um Makefile personalizado em vez do esbuild
. Isso nos dá maior controle sobre o processo de build.
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
- CodeUri: hello-world/
+ CodeUri: src/ # deve apontar para o diretório do Makefile
Handler: app.lambdaHandler
Runtime: nodejs20.x
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api
Properties:
Path: /increment
Method: post
Metadata:
+ BuildMethod: makefile
- BuildMethod: esbuild
- BuildProperties:
- Minify: true
- Target: es2020
- Sourcemap: true
- EntryPoints:
- - app.ts
Criando o Makefile
Finalmente, criamos um Makefile
para definir o processo de build. O Makefile é uma ferramenta que permite automatizar tarefas, como instalação de dependências, execução de scripts e cópia de arquivos.
build-VisitCounterFunction:
yarn install --force && yarn build
cp dist/app.js $(ARTIFACTS_DIR) # variável gerida pelo AWS SAM