Deno 2: Kompatibilitas Node.js dan npm untuk Proyek Lama

Foto oleh Rahul Mishra on Unsplash
Sering kali bisa. Deno 2 membaca package.json, menghormati dependensi dan script-nya, serta membuat direktori node_modules bila diperlukan. Sebagian besar aplikasi Node berbasis ESM berjalan di bawah Deno tanpa perubahan kode, meski paket yang bergantung pada internal Node yang dalam atau addon native sebaiknya diuji dulu.
Prefiks npm: mengimpor paket apa pun dari registry npm langsung dari kode sumber. Prefiks node: mengimpor modul bawaan Node seperti fs dan process. Prefiks jsr: mengimpor dari JSR, registry native TypeScript. Deno 2 meresolusi ketiganya tanpa langkah build.
Ya. Deno 2 menambahkan dukungan kelas satu untuk keduanya. Ia membaca bidang package.json seperti dependencies, scripts, type, dan engines, serta mengisi folder node_modules ketika perkakas Anda membutuhkannya. Inilah inti kompatibilitas mundurnya dengan Node.js dan npm.
Satu binari deno mencakup formatter (deno fmt), linter (deno lint), test runner (deno test, yang juga menjalankan rangkaian node:test), manajemen dependensi (deno add, deno install), task runner (deno task), dan compiler (deno compile) yang menghasilkan berkas eksekusi mandiri.
Ya. Mulai Deno 2.1, proyek ini mengapalkan rilis dukungan jangka panjang. Perbaikan bug kritis di-backport selama enam bulan, dan cabang LTS baru dibuat setiap enam bulan, memberi tim ritme pembaruan yang dapat diprediksi bersama pustaka standar yang diaudit di JSR.

Foto oleh Rahul Mishra on Unsplash
Ringkasan Utama
Deno 2, rilis Oktober 2024, menambahkan kompatibilitas penuh dengan Node.js dan npm. Ia membaca package.json dan node_modules, mengimpor paket lewat specifier npm dan jsr, serta menyatukan formatter, linter, test runner, dan compiler dalam satu CLI, sehingga menjadi pengganti yang layak untuk proyek Node yang sudah ada.
Selama bertahun-tahun jawaban jujur atas pertanyaan apakah Anda bisa menjalankan basis kode Node sungguhan di Deno adalah tidak. Runtime-nya elegan, aman secara default, dan native TypeScript, tetapi ia mengabaikan package.json, menolak folder node_modules, dan menuntut Anda menulis ulang impor menjadi berbasis URL. Itu tembok yang tidak akan didaki kebanyakan tim untuk aplikasi yang sudah tayang di produksi.
Deno 2, yang dirilis pada Oktober 2024, meruntuhkan tembok itu. Judul utama rilis ini adalah kompatibilitas mundur dengan Node.js dan npm: Anda bisa mengarahkan Deno ke proyek yang sudah ada dan ia langsung jalan. Tulisan ini membahas apa yang benar-benar berubah dan mengapa saya kini menganggap Deno sebagai opsi serius untuk kode yang bukan saya tulis dari nol.
Perubahan terbesar adalah Deno 2 memahami berkas yang sudah dimiliki proyek Node. Ia membaca package.json Anda, menghormati dependensi dan script-nya, serta akan membuat dan memakai direktori node_modules ketika perkakas Anda membutuhkannya. Tidak ada langkah konversi dan tidak ada manifes terpisah untuk dipelihara.
Dalam praktiknya Anda masuk ke repositori Node dan perintah yang sudah familier punya padanan langsung. deno install membaca package.json dan mengisi node_modules, sementara deno task menjalankan script yang sudah Anda definisikan di bidang scripts, sama seperti npm run.
# An existing Node project — nothing to rewrite
deno install # reads package.json, populates node_modules
deno task dev # runs the "dev" script from package.json
deno run --allow-net server.jsDeno juga menghormati bidang package.json seperti type untuk resolusi modul dan engines untuk batasan versi, serta mendukung registry privat lewat berkas .npmrc Anda yang sudah ada. Hasilnya, aplikasi Node berbasis ESM sering kali berjalan di bawah Deno tanpa perubahan kode sama sekali.
Deno 2 meresolusi tiga jenis impor tanpa perkakas build apa pun. Prefiks npm menarik paket mana pun dari lebih dari dua juta paket di registry npm langsung dari kode sumber Anda, mengunduhnya saat pertama kali jalan ke cache global. Prefiks node menjangkau bawaan Node seperti fs dan process, dan prefiks jsr menarik dari JSR, registry native TypeScript.
// npm packages — no install step required
import express from "npm:express@4";
import chalk from "npm:chalk@5";
// Node built-ins via the node: prefix
import { readFile } from "node:fs/promises";
import process from "node:process";
// JSR — the TypeScript-native registry
import { serveDir } from "jsr:@std/http/file-server";Anda tidak selalu perlu specifier npm. Begitu package.json mendaftarkan sebuah dependensi, Deno mengizinkan Anda mengimpornya dengan bare specifier biasa persis seperti Node, sehingga sebagian besar baris impor yang ada tetap bekerja tanpa disentuh.
Bagian yang paling saya hargai sebagai pemelihara adalah Deno mengapalkan toolchain lengkap dalam satu binari. Tidak ada Prettier, ESLint, Jest, dan bundler terpisah yang harus dirangkai dan dijaga tetap selaras. Perintah deno memformat, melinting, menguji, menambah dependensi, dan mengompilasi.
deno add npm:zod # add an npm dependency
deno add jsr:@std/assert # add a JSR dependency
deno fmt # format JS, TS, JSON, Markdown, HTML, CSS, YAML
deno lint # lint with Node-specific rules
deno test # runs Deno tests AND node:test suites
deno compile --output app main.ts # single self-contained binarydeno fmt kini memformat JavaScript, TypeScript, JSON, Markdown, HTML, CSS, dan YAML. deno lint menambahkan aturan khusus Node. deno test menjalankan baik tes Deno maupun rangkaian node:test. deno compile menghasilkan satu berkas eksekusi mandiri, dan deno task menjalankan script package.json Anda. Cukup satu dependensi untuk dipasang dan diperbarui, bukan selusin.
Deno 2 mendukung monorepo lewat bidang workspace di deno.json akar. Sebuah workspace adalah kumpulan folder anggota, dan yang penting tiap anggota bisa membawa deno.json atau package.json, sehingga Anda bisa mencampur paket native Deno dan native Node dalam satu repositori.
// deno.json at the repo root
{
"workspace": ["./api", "./web", "./packages/shared"]
}Model hibrida itulah yang membuat adopsi bertahap menjadi realistis. Anda bisa memigrasi satu paket dalam satu waktu alih-alih mengonversi seluruh monorepo dalam satu perubahan berisiko. Di seluruh workspace Deno dapat:
Hal lain yang diminta perusahaan adalah jaminan stabilitas, dan Deno 2 menjawabnya. Mulai Deno 2.1 proyek ini mengapalkan rilis dukungan jangka panjang: perbaikan bug kritis di-backport selama enam bulan, dan cabang LTS baru dibuat setiap enam bulan. Dipadu pustaka standar yang diaudit ketat dan diterbitkan di JSR, itu memberi tim ritme pembaruan yang dapat diprediksi.
Kompatibilitas tinggi tetapi belum total. Sebagian paket bergantung pada internal Node yang dalam atau addon native yang masih punya sisi kasar, jadi ujicobakan dulu layanan non-kritis dan jalankan seluruh test suite Anda di bawah Deno sebelum menaruh beban produksi.
| Aspek | Deno 2 | Node.js |
|---|---|---|
| package.json dan node_modules | Dibaca native, node_modules opsional | Wajib dan sentral bagi resolusi |
| TypeScript | Menjalankan .ts langsung, tanpa build | Butuh loader, tsc, atau bundler |
| Perkakas | Formatter, linter, tes, compile bawaan | Dirakit dari paket npm terpisah |
| Sumber paket | Specifier npm, node, dan jsr | Registry npm, plus JSR lewat node_modules |
| Perizinan | Aman secara default, flag eksplisit | Akses penuh secara default |
Deno 2 membingkai ulang pertanyaannya. Ini bukan lagi soal beralih atau bertahan, melainkan seberapa banyak tumpukan Node Anda yang ingin dipertahankan. Karena ia membaca package.json, memakai node_modules, dan mengimpor dari npm, Anda bisa mengadopsinya secara bertahap dan berbalik arah dengan murah bila tidak cocok.
Rekomendasi saya pragmatis: coba Deno pada satu layanan internal kecil atau paket baru di monorepo Anda. Jika deno fmt, deno lint, deno test, dan deno compile membuat Anda bisa menghapus setumpuk konfigurasi dan dependensi dev, penyederhanaan itu saja sudah layak dicoba, dan Anda tetap punya setiap jalan keluar kembali ke Node.