Facebook Pixel

Deno là gì? So sánh Deno 2, Bun và Nodejs

14 Oct, 2024

Tran Thuy Vy

Frontend Developer

Deno là một runtime JavaScript, TypeScript và WebAssembly, nhằm khắc phục những hạn chế trong Nodejs: bảo mật, quản lý gói và tích hợp TypeScrip

Deno là gì? So sánh Deno 2, Bun và Nodejs

Mục Lục

Nói về JavaScript Runtime, không thể không nhắc đến Node.js. Tuy nhiên, nó vẫn tồn tại một số hạn chế như bảo mật và quản lý thư viện. Để khắc phục điều này, Deno ra đời như một giải pháp hiện đại hơn, bảo mật và hỗ trợ TypeScript ngay từ đầu. Hãy cùng mình tìm hiểu lý do vì sao Deno lại được đánh giá cao như vậy.

1. Deno là gì?

Deno (/ˈdiːnoʊ/ - "dee-no") là một runtime JavaScript, TypeScript và WebAssembly được tạo ra nhằm khắc phục những hạn chế trong Nodejs, đặc biệt về bảo mật, quản lý gói và tích hợp TypeScript. Deno được xây dựng trên các nền tảng V8 (JavaScript engine), Rust (ngôn ngữ lập trình an toàn và hiệu suất cao), và Tokio (runtime bất đồng bộ mạnh mẽ).

2. Những đặc điểm nổi bật của Deno

  • Mặc định, Deno chặn quyền truy cập vào system, network, và enviroment, chỉ được truy cập khi được cấp phép.
  • Điểm nổi bật của Deno là tích hợp sẵn TypeScript, người dùng không cần tốn thời gian cài đặt và cấu hình phức tạp.
  • Thay vì phụ thuộc vào npmnode_modules, Deno sử dụng URL để nhập các module từ xa, mang lại sự linh hoạt.
  • Bạn cũng không cần phải sử dụng package.json để quản lý dependencies, giảm bớt sự ràng buộc trong quản lý dự án.
  • Deno hỗ trợ các API Web như Fetch, WebSockets, và WebAssembly, giúp việc phát triển web trở nên dễ dàng.

3. Những cải tiến đáng kể của Deno 2.x

3.1 Tương thích ngược với Nodejs và npm

  • Deno 2.x có khả năng tương thích ngược với Node.js và npm, cho phép bạn sử dụng Deno trong các dự án của Nodejs mà không cần phải thay đổi quá nhiều.
  • Bạn có thể sử dụng các công cụ như: deno install, deno fmt, và deno lint trực tiếp trong dự án Node.js mà không cần phụ thuộc vào các công cụ của Node.js như Prettier hay ESLint.
  • Deno 2 hiểu các tệp như package.json, folder node_modules, và cả npm workspaces, giúp việc chuyển đổi từ Node.js sang Deno trở nên đơn giản hơn.

3.2 Phát hành Long-Term Support (LTS)

  • Từ phiên bản Deno 2.1.0, Deno sẽ hỗ trợ LTS (Long-term support) được hỗ trợ trong 6 tháng, bao gồm các bản vá lỗi và cải thiện hiệu năng.
  • Giúp các dự án lớn ổn định và đảm bảo lâu dài.

3.3 Quản lý dependencies

  • Deno 2 cải thiện quản lý dependencies thông qua các công cụ mới như deno install, deno add, và deno remove.
  • Bạn có thể sử dụng deno.json cho các dự án Deno-first hoặc package.json cho các dự án Node.js-first, và thậm chí là hybrid (kết hợp cả hai).

3.4 Hỗ trợ monorepo, workspace và private registries

  • Deno 2 hỗ trợ monorepoworkspace, cho phép bạn quản lý cả các gói Deno-first và Node-first trong cùng một dự án.
  • Deno 2 cũng hỗ trợ private npm registries tương tự như Node.js bằng cách sử dụng .npmrc.

Ví dụ về file .npmrc cho private registry như này:

Bash
@mycompany:registry=http://mycompany.com:8111/
mycompany.com:8111/:_authToken=token

3.5 Hỗ trợ các framework phổ biến

  • Deno 2 hỗ trợ nhiều framework phổ biến như: Next.js, SvelteKit, Remix, Nuxt, TanStack, Qwik, và nhiều hơn nữa.
  • Hầu hết các dự án hiện tại có thể dễ dàng chuyển sang Deno với ít hoặc không cần thay đổi, chỉ cần thay thế npm run dev bằng deno task dev.
  • Deno sẽ cung cấp các thông báo lỗi, kèm theo các gợi ý để hướng dẫn bạn tìm ra giải pháp, bạn có thể sử dụng deno lint --fix để tự động sửa lỗi phổ biến.

3.6 Thay đổi CLI

Một số thay đổi quan trọng về CLI và API giữa Deno 1.x và Deno 2.x:

  • deno bundle: đã bị loại bỏ. Bạn nên sử dụng esbuild cùng với esbuild-deno-loader.
Typescript
import * as esbuild from "npm:esbuild";
import { denoPlugins } from "jsr:@luca/esbuild-deno-loader";

const result = await esbuild.build({
  plugins: [...denoPlugins()],
  entryPoints: ["https://deno.land/std@0.185.0/bytes/mod.ts"],
  outfile: "./dist/bytes.esm.js",
  bundle: true,
  format: "esm",
});

esbuild.stop();
  • deno cache: đã được gộp vào lệnh deno install với tùy chọn --entrypoint.
Bash
deno install --entrypoint main.ts		
  • deno vendor: đã thay thế bằng tùy chọn "vendor": true trong deno.json.
JSON
{
  "vendor": true
}
  • --allow-none: thay bằng --permit-no-files.
Bash
deno test --permit-no-files
  • --ts: Thay thế bằng --ext=ts.
Bash
deno run --ext=ts script.ts
  • --trace-ops: Đã thay thế bằng --trace-leaks.
Bash
deno test --trace-leaks
  • --unstable: Đã được thay thế bằng các cờ unstable cụ thể hơn như --unstable-kv.
Bash
deno run --unstable-kv kv.ts

3.7 Thay đổi về API

  • Deno.Buffer: sử dụng Buffer từ Thư viện Chuẩn.
Typescript
import { Buffer } from "jsr:@std/io/buffer";
const buffer = new Buffer();
  • Deno.close(): sử dụng phương thức .close() của resource.
Typescript
const file = await Deno.open("/foo/bar.txt");
file.close();
  • Deno.read(): Sử dụng phương thức .read() của resource thay vì Deno.read() truyền thống.
Typescript
const conn = await Deno.connect({ port: 80 });
await conn.read(buffer);

Từ những thay đổi được đưa ra ở trên, Deno 2 tập trung vào việc mang lại khả năng sử dụng ở quy mô lớn hơn, với các cải tiến về hiệu suất, tương thích với Nodejs và npm.

4. Ưu, nhược điểm của Deno

4.1 Ưu điểm của Deno

  • Ở chế độ mặc định, Deno yêu cầu cấp phép cụ thể cho việc truy cập các tài nguyên.
  • Với Deno bạn có thể sử dụng TypeScript ngay lập tức mà không cần cài đặt hay cấu hình thêm.
  • Hỗ trợ chạy WebAssembly một cách hiệu quả, tối ưu cho các ứng dụng cần hiệu năng cao.
  • Deno không sử dụng folder node_modules, giúp việc quản lý thư viện trở nên dễ dàng hơn và tiết kiệm dung lượng.
  • Deno sử dụng URL để tải các module, tránh việc quản lý phức tạp với npm.

4.2 Nhược điểm của Deno

  • Vì còn mới, hệ sinh thái Deno chưa thật sự đông đảo, việc tìm kiếm thư viện, sự hỗ trợ khó khăn hơn.
  • Dù đã hỗ trợ gói npm từ Deno 2, một số module npm vẫn có thể không hoạt động được như mong đợi.
  • Quản lý module qua URL có thể gây khó khăn cho những ai quen thuộc với npm và package.json truyền thống.

5. So sánh Deno, Bun và Nodejs

Đặc điểm Bun Deno Node.js
Ngôn ngữ hỗ trợ JavaScript, TypeScript JavaScript, TypeScript, WebAssembly JavaScript, TypeScript (qua công cụ bên ngoài)
Engine JavaScript JavaScriptCore V8 V8
Tích hợp TypeScript Có, không cần cấu hình Có, không cần cấu hình Không, cần cấu hình thêm
Bảo mật mặc định Không Có, phải yêu cầu quyền rõ ràng Không
Hỗ trợ npm
Tốc độ Rất nhanh (đặc biệt ở I/O) Nhanh Tốt
WebAssembly
Hỗ trợ API Web Không (dùng thư viện bên ngoài)
Module bundling Tích hợp sẵn Có, nhưng không phải mặc định Không (cần thêm bundler như Webpack)
Cộng đồng Đang phát triển Đang phát triển Rất lớn
so sánh deno bun nodejs

6. Hướng dẫn cài đặt Deno

Bạn có thể chạy lệnh sau để cài đặt:

Bash
// MacOS & Linux

curl -fsSL https://deno.land/install.sh | sh

// Windows

irm https://deno.land/install.ps1 | iex

Sau khi cài đặt xong, kiểm tra bằng cách chạy:

Bash
deno --version

7. Bắt đầu dự án mới với Deno

Sau khi đã cài đặt Deno, bạn có thể tạo và khởi chạy dự án Deno của riêng mình.

Deno hỗ trợ cả TypeScript và JavaScript. Bạn có thể chọn ngôn ngữ mà mình muốn, nhưng TypeScript thường được khuyến khích do được tích hợp sẵn.

Tạo file index.ts:

Typescript
console.log("200Lab Chào, Deno!");

Để chạy file index.ts, bạn chỉ cần chạy lệnh sau trong terminal:

Bash
deno run index.ts

Deno có một mô hình bảo mật mạnh mẽ. Ở mặc định, Deno sẽ không cho phép truy cập vào các tài nguyên hệ thống như file, mạng, hoặc môi trường mà không có sự cấp quyền rõ ràng từ bạn. Để cấp quyền, bạn phải sử dụng các cờ --allow-*.

Ví dụ, nếu như dự án của bạn cần truy cập mạng, bạn sẽ phải cấp quyền bằng cờ --allow-net:

Bash
deno run --allow-net index.ts

Ví dụ sử dụng thư viện chuẩn của Deno để tạo một server web đơn giản trong file server.ts

Typescript
import { serve } from "https://deno.land/std/http/server.ts";

const handler = (request: Request): Response => {
  return new Response("200Lab Chào, Deno HTTP Server!", { status: 200 });
};

console.log("Server running on http://localhost:8000");
await serve(handler, { port: 8000 });

Để chạy bạn thực hiện lệnh:

Bash
deno run --allow-net server.ts

Server sẽ chạy trên port 8000, và bạn có thể truy cập địa chỉ http://localhost:8000 từ browser

Bên cạnh đó, bạn cũng có thể quản lý các tác vụ phát triển (dev tasks) dễ dàng bằng cách sử dụng tệp deno.json. Đây là cách để định nghĩa và chạy các task một cách hiệu quả.

JSON
{
  "tasks": {
    "start": "deno run --allow-net server.ts",
    "format": "deno fmt",
    "lint": "deno lint"
  }
}

Khi định nghĩa file deno.json như trên, bạn có thể chạy server bằng lệnh:

Bash
deno task start

Format code với lệnh

Bash
deno task format

Để kiểm tra lỗi với lệnh

Bash
deno task lint

8. Kết luận

Deno là một runtime mạnh mẽ, an toàn, và dễ sử dụng cho các developer JavaScript và TypeScript. Với khả năng hỗ trợ TypeScript mặc định, mô hình bảo mật tiên tiến và các công cụ tích hợp sẵn như linting, formatting, Deno là lựa chọn tuyệt vời cho bạn nếu muốn xây dựng ứng dụng mà không cần quá nhiều cấu hình phức tạp.

Hy vọng với những kiến thức, hướng dẫn trên, bạn có thể dễ dàng khởi tạo và quản lý một dự án với Deno từ việc cài đặt, chạy server, đến quản lý dependencies.

Các bài viết liên quan:

Bài viết liên quan

Lập trình backend expressjs

xây dựng hệ thống microservices
  • Kiến trúc Hexagonal và ứng dụngal font-
  • TypeScript: OOP và nguyên lý SOLIDal font-
  • Event-Driven Architecture, Queue & PubSubal font-
  • Basic scalable System Designal font-

Đăng ký nhận thông báo

Đừng bỏ lỡ những bài viết thú vị từ 200Lab