Pesquisa de site

node.js - Existe uma maneira de remover facilmente as devDependencies do bundle final com esbuild


Estou usando o esbuild para empacotar minhas funções Lambda. No entanto, ao gerar o build delas para realizar o deployment, recebo um alerta de que o pacote é muito grande, como na imagem abaixo.

Arquivo muito grande

Encontrei na documentação uma maneira de remover certos pacotes com a flag --external:. No entanto, eu tenho muitas lambdas, e para cada lambda eu teria que adicionar essa flag no meu script de build sempre que houver um novo pacote de devDependencie. Eu gostaria de saber se existe uma maneira mais prática e fácil de resolver isso?

script de construção:

for function in $(ls functions/typescript); do
  esbuild functions/typescript/$function/index.ts --platform=node --bundle --minify --external:@types/aws-lambda --external:@types/aws-sdk --external:@types/node-forge --external:@types/pem --external:aws-sdk --outfile=functions/__compiled__/$function/index.js
done

P.S: lembrando que nem todas as lambdas vão precisar desses pacotes devDependencies

Editar1:

package.json

{
    "name": "clinicSettings",
    "version": "1.0.0",
    "main": "index.js",
    "license": "MIT",
    "dependencies": {
        "aws-lambda": "^1.0.7",
        "lambda-utils": "private-repo",
        "node-forge": "^1.3.1",
        "pem": "^1.14.6",
        "squel": "^5.13.0"
    },
    "devDependencies": {
        "@types/aws-lambda": "^8.10.101",
        "@types/aws-sdk": "^2.7.0",
        "@types/node-forge": "^1.0.4",
        "@types/pem": "^1.9.6",
        "aws-sdk": "^2.1177.0"
    }
}

Resposta #1

Acho que você já pode excluir todos os @types, pois eles devem ser automaticamente removidos pelo transpiler do TypeScript. Então, não deve sobrar muita coisa, principalmente o AWS SDK, que é uma boa prática excluir do bundle, como você fez. Portanto, na maioria das vezes, você só precisará fazer --external:@aws-sdk/* ou --external:aws-sdk, dependendo de qual SDK e versão do Node você está usando. Pode haver alguns outros casos para excluir, por exemplo, se você usar postgres --external:pg-native (você precisará descobrir por conta própria).

Quanto ao --platform=node, não tenho certeza se você precisa dele, mas isso você deve verificar ou testar. Até agora eu não o uso e parece funcionar.