Deno là gì? Có phải là sự thay thế hoàn hảo cho Node?

Dạo gần đây có vẻ như Deno đang trở thành 1 chủ đề khá hot trên các blog về công nghệ. Mình tự hỏi Deno là gì mà có sức hút đến vậy? Là một lựa chọn để thay thế Node ư? Nên mình đã dành thời gian để tìm hiểu và sẽ giải thích về Deno trong blog lần này!

Lịch sử và những câu chuyện đăng sau Deno

Vào năm 2018, Ryan Dahl (Cha đẻ của Node) Trong một buổi thuyết trình về “10 Things I Regret About Node.js”, anh ấy đã thông báo về một JavaScript & TypeScript Runtime hoàn toàn mới có tên là Deno.

2 năm sau, vào 5/2020, Deno 1.0 đã được chính thức release. Một JavaScript & TypeScript Runtime hoàn toàn mới được xây dựng trên V8, Rust, và Tokio.
Với những Feature Highlights như (Mình trích nguyên văn trong docs của Deno):

  • Secure by default. No file, network, or environment access (unless explicitly enabled).
  • Supports TypeScript out of the box.
  • Ships a single executable (deno).
  • Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt).
  • Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno.
  • Scripts can be bundled into a single JavaScript file.

Sự thật thú vị: Deno là 1 phép đảo chữ của Node. 

Giờ hãy cũng tìm hiểu kĩ hơn sự khác nhau giữa Deno và Node nhé!

Vấn đề bảo mật

Một chỉ trích phổ biến về NodeJS là khi một nodejs app đang chạy nó có thể dễ dàng truy cập viêc đọc, ghi filesystem, gửi các request ra bên ngoài hay truy cập những biến môi trường,… Điều này có mặt lợi là các nhà phát triển có thể tự do phát triển ứng dụng của mình. Nhưng đây cũng là một security risk nếu không cẩn thận.

Thay vào đó, Deno sẽ giới hạn quyền truy cập của ứng dụng. Muốn thay đổi giới hạn này phải sử dụng các command-line arguments.
Ví dụ mình có file security.ts muốn ghi 1 đoạn text vào các file hello.txt như sau:

const encoder = new TextEncoder();
const data = encoder.encode("Hello world\n");
Deno.writeFileSync("hello1.txt", data);  // overwrite "hello1.txt" or create it
Deno.writeFileSync("hello2.txt", data, {create: true});
Deno.writeFileSync("hello3.txt", data, {mode: 0o777});  // set permissions on new file
Deno.writeFileSync("hello4.txt", data, {append: true});  // add data to the end of the file

Nếu chỉ chạy thông thường mà không cấp quyền cho ứng dụng với câu lệnh:

deno run security.ts

Sẽ có một security exception hiện ra:

error: Uncaught PermissionDenied: write access to "hello1.txt", run again with the --allow-write flag

Để giải quyết vấn đề này, bạn phải thêm cờ –allow-write khi chạy ứng dụng:

deno run --allow-write security.ts

Điều tuyệt vời là chúng ta chỉ cấp quyền ghi file cho app, và nó không thể truy cập được vào mạng nếu chưa được quyền, sử dụng cờ sau –allow-net để allow truy cập mạng.

Tích hợp TypeScript

Các bạn không nhìn nhầm đâu, Deno tích hợp sẵn TypeScript mà không phải cài đặt thêm công cụ bên ngoài nào cả. Hỗ trợ song song cả .ts.js khi viết code. Và thực thi vô cùng đơn giản với câu lệnh deno run. (Tìm hiểu thêm về việc Tại sao chúng ta nên sử dụng TypeScript)

Điều này sẽ tiết kiệm bước compile. Nếu như dùng Node JS, trước khi bạn khởi động server, bạn phải thực hiện compile TypeScript code sang Javascript sau đó Node JS sẽ sử dụng các file Javascript.

Bạn cũng có thể override configuration mặc định của Deno bằng tham số -c (hoặc –config). Những tham số mặc định của Deno bạn có thể xem thêm tại đây.

deno run -c tsconfig.json [your-script.ts]

Đã bao nhiêu lần bạn thấy những meme này trên internet:
node modules - Heaviest Objects In The Universe - devRant

node_modules không chỉ là một folder khổng lồ. Mà nó còn tiềm ẩn 1 nguy cơ vô cùng lớn về security (Tìm hiểu thêm). Để giải quyết vấn đề ở trên, Deno import các thư viện thông qua URL.
Các thư viện nếu chưa có được download về và cache lại để sử dụng cho những lần tiếp theo.

Thực sự vô cùng đơn giản khi khởi tạo một project mới. Bạn sẽ không còn mất nhiều thời gian chỉ để npm install như khi bạn khởi tạo một Node JS project. Vậy sẽ không tận dụng được các thư viện tiện ích từ npm như trên Node?

Đây là ưu điểm hay nhược điểm so với Node JS? Mình nghĩ nó có 2 mặt:

  • Ưu điểm: khi giảm sự cồng kềnh của node_modules trên Node JS.
  • Nhược điểm: số lượng thư viện mặc định vẫn còn chưa nhiều, chưa đa dạng bằng Node. Sẽ cần 1 thời gian nữa để cộng đồng contribute để ngày một tốt lên. Để giải quyết nhược điểm này thì Deno cũng cho phép bạn import các thư viện từ node_modules cũng như có 1 compatibility layer cho các thư viện chuẩn của NodeJS Nhưng việc này không được khuyến khích sử dụng.

 

Tài liệu tham khảo:

Add a Comment

Scroll Up