Ryan Dahl, pencipta Node.js, telah menghabiskan satu setengah tahun terakhir mengerjakan proyek
Deno . Ini adalah runtime JavaScript baru yang harus memperbaiki masalah yang ada di Node.js.
Jangan salah sangka. Platform Node.js adalah lingkungan sisi server yang hebat untuk menjalankan JavaScript. Ini berutang popularitasnya terutama pada ekosistem besar, dan, pada kenyataannya, dukungan untuk JavaScript. Namun, Ryan Dahl mengakui bahwa sesuatu tentang Node.js harus menjadi perhatiannya. Ini, khususnya, tentang keamanan, tentang modul, dan tentang manajemen ketergantungan.
Dalam pembelaannya, orang bisa mengatakan bahwa dia tidak bisa mengetahui seberapa populer platform Node.js dalam waktu yang cukup singkat. Selain itu, pada tahun 2009, JavaScript masih terlihat seperti bahasa yang terbatas dan aneh, yang diejek oleh semua orang yang tidak malas. Perlu juga dicatat bahwa pada masa itu banyak fitur JavaScript yang umum hari ini tidak ada.
Apa itu Deno dan apa saja fitur utama dari platform ini?
Deno adalah runtime aman TypeScript yang dibangun di atas mesin V8 JS yang dikembangkan oleh Google. Platform Deno dibuat menggunakan alat berikut:
- Karat (inti Deno ditulis dalam Karat dan inti Node dalam C ++).
- Tokio (loop acara ditulis dalam Karat).
- TypeScript (Deno, tanpa pengaturan tambahan, mendukung JavaScript dan TypeScript).
- V8 (mesin JS Google yang digunakan di browser Chrome, Node.js, dan proyek lainnya).
Mari kita bicara tentang peluang apa yang ditawarkan platform Deno kepada kita.
Keamanan (Izin)
Di antara fitur paling penting dari Deno, yang diberi perhatian khusus, keselamatan dapat dicatat.
Tidak seperti Node, Deno, secara default, mengeksekusi kode dalam kotak pasir. Ini berarti bahwa runtime tidak memiliki akses ke entitas dan kemampuan berikut:
- Sistem file.
- Jaringan
- Eksekusi skrip lain.
- Variabel lingkungan.
Lihatlah bagaimana sistem izin Deno bekerja. Pertimbangkan skrip berikut:
(async () => { const encoder = new TextEncoder(); const data = encoder.encode('Hello world\n'); await Deno.writeFile('hello.txt', data); await Deno.writeFile('hello2.txt', data); })();
Script ini membuat sepasang file teks -
hello2.txt
dan
hello2.txt
. Teks
Hello world
ditempatkan dalam file-file ini. Kode dieksekusi di kotak pasir. Karena itu, ia tidak memiliki akses ke sistem file.
Juga, perhatikan fakta bahwa di sini kita menggunakan ruang nama
Deno
, daripada merujuk pada sesuatu seperti modul
fs
, seperti yang kita lakukan di Node. Ruang nama
Deno
menyediakan pengembang dengan banyak fungsi pembantu dasar. Tapi kami, menggunakan namespace, kehilangan kompatibilitas kode dengan browser. Kami akan membicarakan ini di bawah ini.
Script ini dapat dijalankan dengan perintah berikut:
deno run write-hello.ts
Setelah itu, kita akan melihat notifikasi dengan konten berikut:
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
Bahkan, kita mungkin melihat ini dua kali selama masing-masing panggilan. Tentu saja, jika kami menjawab pertanyaan sistem dengan memilih opsi
allow always
, kedua kalinya kami tidak akan menerima pemberitahuan ini.
Jika kita memilih salah satu opsi
deny
, kesalahan
PermissionDenied
akan
PermissionDenied
. Proses skrip kemudian akan selesai, karena tidak ada kode untuk menangani kesalahan di dalamnya.
Script dapat dijalankan seperti ini:
deno run --allow-write write-hello.ts
Kami tidak akan melihat pemberitahuan apa pun, kedua file akan dibuat.
Selain flag
--allow-write
, yang memengaruhi pekerjaan dengan sistem file, Anda dapat menggunakan flag lain saat menjalankan skrip. Ini adalah
--allow-net
,
--allow-env
dan
--allow-run
. Mereka masing-masing membuka akses skrip ke jaringan, ke lingkungan, dan ke peluncuran subproses.
Modul
Deno, seperti browser, memuat modul dengan URL. Pada awalnya, banyak orang bingung dengan apa yang mereka lihat dalam perintah impor kode server dengan URL. Tapi ini, pada kenyataannya, masuk akal. Tunggu sebentar - dan Anda akan memahaminya sendiri.
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Di sini Anda mungkin memiliki pertanyaan tentang apa yang istimewa tentang mengimpor paket dengan URL? Jawaban untuk pertanyaan ini sederhana: melalui penggunaan URL, paket Deno dapat didistribusikan tanpa menggunakan registry pusat seperti npm. Npm memiliki
banyak masalah belakangan ini.
Mengelola impor kode melalui URL memungkinkan pembuat paket untuk meng-host kode mereka di mana pun mereka mau. Ini adalah desentralisasi dalam segala kejayaannya. Tidak ada lagi
package.json
dan
node_modules
.
Saat kami meluncurkan aplikasi, Deno memuat semua modul yang diimpor dan menyimpannya. Setelah mereka di-cache, Deno tidak akan memuatnya kembali kecuali kami secara eksplisit meminta mereka untuk
--reload
menggunakan flag
--reload
.
Mengenai sistem ini bekerja dengan modul, beberapa pertanyaan penting dapat diajukan.
Bagaimana jika sumber daya tempat kode modul berada tidak dapat diakses?
Kode modul tidak disimpan dalam registri terpusat. Sumber daya web yang meng-host kode ini mungkin tidak tersedia karena berbagai alasan. Selama proses pengembangan, atau, lebih buruk lagi, membawa proyek ke produksi, berisiko berharap bahwa hosting modul akan selalu tersedia.
Seperti yang telah disebutkan, Deno cache modul yang dimuat. Karena cache disimpan pada disk lokal, pencipta Deno merekomendasikan untuk memprosesnya menggunakan sistem kontrol versi (mis. Git) dan memasukkannya ke dalam repositori proyek. Dengan pendekatan ini, bahkan ketika sumber daya tempat kode disimpan tidak dapat diakses, semua pengembang proyek akan mempertahankan akses ke versi modul yang diunduh.
Deno menyimpan cache di folder yang ditentukan oleh variabel lingkungan
$DENO_DIR
. Jika kami tidak mengonfigurasi variabel ini, Deno akan menyimpan cache di direktori sistem standar untuk cache.
$DENO_DIR
dapat diatur sehingga akan menunjuk ke beberapa folder di repositori lokal kami. Folder ini dapat diproses menggunakan sistem kontrol versi Anda.
▍Apakah saya harus terus-menerus mengimpor modul dengan URL?
Memasukkan URL panjang secara teratur bisa cepat bosan. Untungnya, Deno memberi kita dua cara untuk membuat tugas ini lebih mudah.
Cara pertama adalah menggunakan kemampuan untuk mengekspor kembali modul yang diimpor dari file lokal. Misalnya, mungkin terlihat seperti ini:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
Misalkan file di mana perintah di atas berada disebut
local-test-utils.ts
. Sekarang, jika kita membutuhkan fungsi
test
atau fungsi
assertEqual
, kita dapat mengimpornya seperti ini:
import { test, assertEquals } from './local-test-utils.ts';
Akibatnya, ternyata tidak masalah apakah modul itu dimuat oleh URL atau tidak.
Opsi kedua adalah membuat peta impor dalam bentuk file JSON:
{ "imports": { "http/": "https://deno.land/std/http/" } }
Saat menggunakan file yang serupa, perintah impor mungkin terlihat seperti ini:
import { serve } from "http/server.ts";
Agar skema ini berfungsi, Anda perlu memberi tahu sistem tentang penggunaan peta
--importmap
dalam proyek, menggunakan flag
--importmap
saat menjalankan skrip:
deno run --importmap=import_map.json hello_server.ts
▍ Bagaimana mengatur versi modul?
Kontrol versi paket adalah tanggung jawab mereka. Dari sudut pandang klien, memilih versi paket yang tepat seperti menambahkannya ke URL:
https://unpkg.com/liltest@0.0.5/dist/liltest.js
.
Kompatibilitas Browser
Platform Deno mengupayakan kompatibilitas kodenya dengan browser. Dari sudut pandang teknis, ketika kita menggunakan modul-ES, kita tidak berkewajiban untuk menggunakan beberapa alat perakitan, seperti webpack, yang menyediakan kemampuan untuk menjalankan aplikasi di browser.
Namun, alat-alat seperti Babel mengkonversi kode JS modern ke kode yang sesuai dengan ES5. Akibatnya, kode ini dapat dieksekusi bahkan di browser yang tidak baru yang tidak mendukung kemampuan JavaScript modern. Tetapi pendekatan ini juga memiliki minus, yang terdiri dari kenyataan bahwa kumpulan proyek web tumbuh karena fakta bahwa mereka mendapatkan banyak kode tambahan.
Sebenarnya - kami membuat keputusan tentang tujuan proyek kami. Kami memilih alat yang tepat.
Dukungan TypeScript
Deno menyederhanakan penggunaan TypeScript, menghilangkan kebutuhan pengembang untuk mengkonfigurasi apa pun untuk menjalankan kode TS. Tetapi program Deno juga dapat ditulis dalam JavaScript tanpa masalah.
Ringkasan
Deno, lingkungan runtime baru untuk TypeScript dan JavaScript, adalah proyek menarik yang telah menunjukkan keberlanjutan untuk beberapa waktu sekarang. Namun, sebelum dapat dianggap siap untuk diproduksi, ia masih memiliki jalan panjang.
Pendekatan desentralisasi untuk bekerja dengan modul, diimplementasikan di Deno, bertujuan membebaskan ekosistem JavaScript dari repositori terpusat paket, yang saat ini adalah npm.
Ryan Dahl mengatakan dia berharap untuk merilis Deno 1.0 di akhir musim panas. Jika Anda tertarik pada masa depan proyek ini - perhatikan
repositori -nya.
Pembaca yang budiman! Apa pendapat Anda tentang Deno?
