Executando verificação de segurança...
28

Pare de instalar esses pacotes npm — o Node.js já faz isso por você 😱

Lembra quando tudo que você queria fazer no Node.js exigia instalar mais um pacote? Pois é… essa era tá ficando pra trás.
As versões mais recentes do Node trouxeram funções nativas incríveis que substituem libs superpopulares.
E o melhor? Sem precisar instalar nada.

Depois de anos montando ambientes e raspando dependências, ver o node_modules finalmente emagrecer é quase terapêutico.

Vem comigo descobrir tudo o que agora o Node faz sozinho!


🎯 TypeScript nativo

Desde o Node 22.6, dá pra rodar TypeScript direto, sem ts-node, tsx, nem build manual:

node --experimental-strip-types server.ts

E no Node 23+, nem precisa mais da flag!
Só lembra: isso só executa, não checa tipos. Ainda vale rodar tsc --noEmit pra validar.

interface User {
  id: string
  name: string
}

const createUser = (data: User) => data
const user = createUser({ id: '1', name: 'Alice' })
console.log(user)

🌐 node-fetch → fetch()

O fetch() agora é global no Node.js desde a versão 18.
Sem libs, sem import, sem sofrimento.

const response = await fetch('https://api.example.com/data')
const result = await response.json()
console.log(result)

🔑 uuid → crypto.randomUUID()

Adeus à lib com 2 bilhões de downloads por semana.
Agora o Node gera UUID com uma função nativa do módulo crypto:

import { randomUUID } from 'node:crypto'

const id = randomUUID()
console.log(id) // Exemplo: "b7e59a20-7d62-4dda-ae32-71a55ccf1c57"

📁 glob → fs.glob()

Quer listar arquivos com padrão?
O fs.glob() chegou no Node 22 pra isso.

import { glob } from 'node:fs/promises'

const arquivos = await glob('src/**/*.ts', {
  ignore: 'node_modules/**'
})
console.log(arquivos)

🧨 rimraf → fs.rm({ recursive: true })

Pra remover diretórios inteiros:

import { rm } from 'node:fs/promises'

await rm('dist', { recursive: true, force: true })
console.log('Pasta removida!')

📂 mkdirp → fs.mkdir({ recursive: true })

Criar pastas aninhadas ficou fácil:

import { mkdir } from 'node:fs/promises'

await mkdir('logs/app/errors', { recursive: true })
console.log('Diretórios criados com sucesso!')

⚙️ dotenv → --env-file

Você pode carregar variáveis de ambiente direto da CLI:

node --env-file=.env app.js
node --env-file=.env --env-file=.env.local app.ts

Arquivo .env:

PORT=3000
DATABASE_URL=mysql://root@localhost/test
console.log(process.env.PORT) // 3000

🔁 nodemon → --watch

Recarregue automaticamente sem instalar nada:

node --watch server.ts

E sim, dá pra combinar com TypeScript:

node --watch --experimental-strip-types server.ts

🧪 jest / mocha → Node Test Runner

O Node tem test runner nativo (desde a versão 20), com describe, it e asserts prontos pra uso:

import { describe, it } from 'node:test'
import assert from 'node:assert'

describe('soma()', () => {
  it('deve somar dois números', () => {
    const soma = (a: number, b: number) => a + b
    assert.strictEqual(soma(2, 3), 5)
  })
})

Rodar o teste:

node --test

🎨 chalk / kleur → util.styleText()

O novo util.styleText() dá cor e estilo pro terminal:

import { styleText } from 'node:util'

console.log(styleText('blue', 'Tudo certo!'))
console.log(styleText(['bold', 'red'], 'Deu ruim!'))

💨 readable-stream → módulos nativos do stream

Streams modernas com suporte a Promises:

import { pipeline } from 'node:stream/promises'
import { createReadStream, createWriteStream } from 'node:fs'

await pipeline(
  createReadStream('entrada.txt'),
  createWriteStream('saida.txt')
)

console.log('Arquivo copiado!')

🧱 better-sqlite3 / sqlite3 → node:sqlite (experimental)

Já pode brincar com banco SQLite sem instalar nada:

import { DatabaseSync } from 'node:sqlite'

const db = new DatabaseSync(':memory:')
db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
db.exec("INSERT INTO users (name) VALUES ('Alice')")

const rows = db.prepare('SELECT * FROM users').all()
console.log(rows)

⚡ Extra: config do TypeScript

Se quiser um tsconfig.json minimalista pra rodar nativo:

{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "noEmit": true,
    "target": "ES2022",
    "esModuleInterop": true
  }
}

🚀 Conclusão

O Node.js tá gigante.
O que antes exigia dezenas de libs, hoje roda nativo, mais rápido e mais bonito.
E com o TypeScript rodando direto no core, o ecossistema JavaScript tá ficando cada vez mais maduro.

Claro que libs como axios ou tsx ainda têm seu espaço — mas é hora de ver o quanto dá pra simplificar.

Então antes de rodar aquele npm install, pensa bem:
Será que o Node já não faz isso sozinho?

Teu futuro eu (e teu disk usage) vão te agradecer. 😎


🔥 Gostou do artigo?
Dá aquele UP, comenta o que achou e compartilha com a galera dev!
Vamos espalhar a palavra do node_modules magro! 💪

#NodeJS #TypeScript #Backend #JavaScript #CleanCode #DesenvolvimentoWeb #OpenSource

Carregando publicação patrocinada...
4
3

concordo.

acompanho o TabNews há um bom tempo, porém não tinha criado conta ainda, e ultimamente percebi essa queda de qualidade que está tendo.
muitos posts que são apenas slop de IA, conteúdo mega genérico, e afins, tá triste.

tive que criar uma conta pra concordar contigo haha

3
2

Muito legal essas apis nativas do nodejs. Atualmente estou dando bastante atênção para as novas runtimes como o bun. O bun vem trazendo ótimas soluções e apis nativas com muita performance, mas ele acaba pecando em um ponto... algumas apis presentes no nodejs são implementadas de maneira diferente no bun, nos fazendo passar mais tempo lendo documentação e consequentemente ficando no "território mais seguro", o nodejs. Isso dificulta um pouco fazer a transição do nodejs pro bun. Gostei muito do artigo! Parabéns!

2

Isso não é um ponto negativo. Se fizesse igual ao Node.js, teriamos a mesma coisa que o Node e perderia o sentindo.

Bun reescreveu justamente para melhorar a implementação e deixar mais otimizado aquilo que já usamos (e nem é tão complicado assim).

1