Deno 2: Xây dựng REST API Không ‘node_modules’, Bảo mật tối đa và Tương thích Node.js

Development tutorial - IT technology blog
Development tutorial - IT technology blog

Nỗi ám ảnh mang tên “node_modules” và mớ hỗn độn cấu hình

Thử tưởng tượng: Bạn chỉ cần viết một con API đơn giản nhưng thư mục node_modules đã chiếm sạch 400MB ổ cứng. Mình từng refactor một dự án 50.000 dòng code. Chỉ riêng việc nâng cấp dependency và fix lỗi xung đột trong tsconfig.json đã ngốn sạch 3 ngày làm việc. Đó là chưa kể đến việc phải cài thêm eslint, prettier hay jest với hàng tá file config rườm rà.

Node.js rất mạnh nhưng đang gánh trên vai quá nhiều di sản cũ. Về bảo mật, Node.js mặc định cho phép mọi package truy cập ổ cứng hay biến môi trường mà không cần hỏi ý kiến. Trong bối cảnh các cuộc tấn công chuỗi cung ứng (supply chain attacks) tăng mạnh, đây thực sự là một lỗ hổng đáng lo ngại.

Deno 2 giải quyết những gì Node.js còn thiếu?

Ryan Dahl – cha đẻ của cả Node.js và Deno – đã thiết kế Deno 2 để sửa chữa những sai lầm trong quá khứ. Điểm sáng nhất là trải nghiệm “tất cả trong một”. Bạn không cần cài tsc để chạy TypeScript, cũng chẳng cần prettier để format code. Mọi thứ đã được tích hợp sẵn.

Đặc biệt, Deno 2 hiện đã tương thích cực tốt với hệ sinh thái npm. Bạn có thể lôi ngay express hay mongoose vào dự án mà không gặp bất kỳ rào cản nào. Tốc độ khởi động cũng nhanh hơn đáng kể nhờ lược bỏ các bước kiểm tra module phức tạp của Node.js.

Cài đặt Deno 2 cực nhanh

Quên các bước cài đặt phức tạp đi. Trên Linux hoặc macOS, bạn chỉ cần thực hiện duy nhất một lệnh:

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

deno --version để kiểm tra. Nếu thấy phiên bản 2.x, bạn đã sẵn sàng trải nghiệm runtime hiện đại nhất hiện nay.

Xây dựng REST API: Không config, không node_modules

Hãy tạo file server.ts. Chúng ta sẽ dùng TypeScript thuần túy mà không cần bất kỳ file cấu hình nào.

// server.ts
const kv = await Deno.openKv(); // Database key-value tích hợp sẵn

interface User {
  id: string;
  name: string;
}

Deno.serve(async (req) => {
  const url = new URL(req.url);
  const path = url.pathname;

  // Lấy danh sách User
  if (path === "/users" && req.method === "GET") {
    const users = [];
    for await (const res of kv.list({ prefix: ["users"] })) {
      users.push(res.value);
    }
    return Response.json(users);
  }

  // Thêm User mới
  if (path === "/users" && req.method === "POST") {
    const body = await req.json();
    const id = crypto.randomUUID();
    const newUser = { id, ...body };
    await kv.set(["users", id], newUser);
    return Response.json(newUser, { status: 201 });
  }

  return new Response("Not Found", { status: 404 });
});

Sự khác biệt nằm ở chỗ bạn không cần chạy npm install. Deno tự động quản lý và cache module một cách thông minh, giúp thư mục dự án luôn sạch sẽ.

Cơ chế bảo mật Sandboxing: Quyền lực nằm trong tay bạn

Đây là tính năng mình tâm đắc nhất. Nếu bạn chạy lệnh deno run server.ts, Deno sẽ chặn lại ngay vì bạn chưa cấp quyền truy cập mạng. Để API hoạt động, bạn phải chỉ định rõ ràng:

deno run --allow-net --allow-read --allow-write server.ts

Cách tiếp cận “explicit permissions” này cực kỳ an toàn. Nếu một thư viện bên thứ ba chứa mã độc muốn đánh cắp dữ liệu, Deno sẽ khóa chặt hành vi đó trừ khi bạn cho phép.

Sử dụng thư viện npm trong Deno 2

Deno 2 xóa bỏ rào cản thiếu hụt thư viện bằng prefix npm:. Nếu bạn vẫn muốn dùng Express cho quen tay, hãy xem ví dụ dưới đây:

import express from "npm:express@5";
const app = express();

app.get("/", (req, res) => {
  res.send("Express đang chạy mượt mà trên Deno 2!");
});

app.listen(3000);

Hệ thống tự động tải Express về cache. Không package.json rắc rối, không tốn dung lượng ổ cứng cho mỗi dự án riêng lẻ.

Kinh nghiệm thực tế: Khi nào nên chuyển sang Deno 2?

Nếu bạn đang xây dựng microservice mới hoặc viết các công cụ CLI, Deno 2 là lựa chọn hàng đầu. Việc loại bỏ file config giúp tốc độ prototype tăng gấp đôi. Tuy nhiên, với các dự án cũ phụ thuộc sâu vào thư viện C++ native của Node.js, bạn nên kiểm tra kỹ tính tương thích trước khi chuyển đổi.

Bài học lớn nhất mình rút ra là: Công nghệ tốt nhất là công nghệ giúp bạn tập trung vào logic thay vì hạ tầng. Deno 2 chính là minh chứng cho điều đó. Nó giúp giảm thời gian build từ 3 phút xuống còn 30 giây trong nhiều dự án thực tế của mình.

Tối ưu hóa quy trình với Deno Task

Thay vì dùng scripts trong package.json, Deno sử dụng file deno.json gọn gàng hơn:

{
  "tasks": {
    "dev": "deno run --allow-net --watch server.ts",
    "start": "deno run --allow-net server.ts"
  }
}

Chỉ cần gõ deno task dev, server sẽ tự động reload khi bạn thay đổi code. Cực kỳ tiện lợi!

Kết luận: Hãy bắt đầu từ những script nhỏ

Đừng vội vàng chuyển đổi toàn bộ hệ thống khổng lồ sang Deno ngay lập tức. Hãy thử nghiệm với các script automation hoặc một service phụ trợ nhỏ. Bạn sẽ thấy nhẹ nhõm khi thoát khỏi mớ hỗn độn node_modules. Với phiên bản 2, rào cản gia nhập gần như bằng không. Hãy thử cài đặt ngay hôm nay!

Share: