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
npm
vànode_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
, foldernode_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ợ monorepo và workspace, 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:
@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ằngdeno 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.
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
.
deno install --entrypoint main.ts
- deno vendor: đã thay thế bằng tùy chọn
"vendor": true
trongdeno.json
.
{
"vendor": true
}
- --allow-none: thay bằng --permit-no-files.
deno test --permit-no-files
- --ts: Thay thế bằng --ext=ts.
deno run --ext=ts script.ts
- --trace-ops: Đã thay thế bằng --trace-leaks.
deno test --trace-leaks
- --unstable: Đã được thay thế bằng các cờ unstable cụ thể hơn như --unstable-kv.
deno run --unstable-kv kv.ts
3.7 Thay đổi về API
- Deno.Buffer: sử dụng Buffer từ Thư viện Chuẩn.
import { Buffer } from "jsr:@std/io/buffer";
const buffer = new Buffer();
- Deno.close(): sử dụng phương thức .close() của resource.
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.
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 | Có | Có | Có |
Tốc độ | Rất nhanh (đặc biệt ở I/O) | Nhanh | Tốt |
WebAssembly | Có | Có | Có |
Hỗ trợ API Web | Có | Có | 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 |
6. Hướng dẫn cài đặt Deno
Bạn có thể chạy lệnh sau để cài đặt:
// 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:
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
:
console.log("200Lab Chào, Deno!");
Để chạy file index.ts
, bạn chỉ cần chạy lệnh sau trong terminal:
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:
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
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:
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ả.
{
"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:
deno task start
Format code với lệnh
deno task format
Để kiểm tra lỗi với lệnh
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
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read
Test-Driven Development (TDD) là gì? Hướng dẫn thực hành TDD
Nov 13, 2024 • 6 min read