Skip to main content
BlogSoftware Development

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

Deno 2 membaca package.json dan node_modules, mengimpor paket npm dan JSR secara langsung, serta menyediakan satu CLI untuk fmt, lint, test, dan compile. Inilah alasan ia kini benar-benar bisa menggantikan Node.

Matthews Wong

Software Engineer

Juli 20269 menit baca
Deno 2: Kompatibilitas Node.js dan npm untuk Proyek Lama

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.

package.json dan node_modules kini kelas satu

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.js

Deno 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.

Specifier npm, node, dan jsr berdampingan

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.

Satu CLI menggantikan seluruh toolchain

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 binary

deno 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.

Workspace dan monorepo hibrida

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:

  • Meresolusi dependensi antar paket anggota berdasarkan nama scoped-nya.
  • Menjalankan tes, pemformatan, dan linting di setiap anggota dengan satu perintah.
  • Memublikasikan anggota tertentu ke JSR sementara yang lain tetap di npm.

Stabilitas jangka panjang kini janji eksplisit

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.

Deno 2 versus Node.js sekilas

AspekDeno 2Node.js
package.json dan node_modulesDibaca native, node_modules opsionalWajib dan sentral bagi resolusi
TypeScriptMenjalankan .ts langsung, tanpa buildButuh loader, tsc, atau bundler
PerkakasFormatter, linter, tes, compile bawaanDirakit dari paket npm terpisah
Sumber paketSpecifier npm, node, dan jsrRegistry npm, plus JSR lewat node_modules
PerizinanAman secara default, flag eksplisitAkses penuh secara default

Jadi, haruskah Anda beralih?

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.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Bisakah saya menjalankan proyek Node.js yang sudah ada di Deno 2 tanpa perubahan?

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.

Apa perbedaan specifier npm:, node:, dan jsr: di Deno 2?

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.

Apakah Deno 2 mendukung node_modules dan package.json?

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.

Perkakas apa saja yang sudah tertanam di CLI Deno 2?

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.

Apakah Deno 2 menawarkan dukungan jangka panjang untuk stabilitas?

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.