Giới thiệu thư viện hono.dev - Tạo máy chủ API dễ dàng trên serverless

Giới thiệu thư viện hono.dev - Tạo máy chủ API dễ dàng trên serverless

Tin ngắn hàng ngày dành cho bạn
  • Hơn 1 tuần nay mình không đăng bài, không phải không có gì để viết mà đang tìm cách để phân phối nội dung có giá trị hơn trong thời đại AI đang bùng nổ mạnh mẽ như thế này.

    Như từ hồi đầu năm đã chia sẻ, số lượng người truy cập vào trang blog của mình đang dần ít đi. Khi xem thống kê, lượng người dùng trong 6 tháng đầu năm 2025 đã giảm 30% so với cùng kì năm ngoái, 15% so với 6 tháng cuối năm 2024. Như vậy một sự thật là người dùng đang rời bỏ dần đi. Nguyên nhân do đâu?

    Mình nghĩ lý do lớn nhất là thói quen của người dùng đã thay đổi. Họ tìm thấy blog chủ yếu qua các công cụ tìm kiếm, trong đó lớn nhất là Google. Gần 1/2 số lượng người dùng quay trở lại blog mà không cần thông qua bước tìm kiếm. Đó là một tín hiệu đáng mừng nhưng vẫn không đủ để tăng lượng người dùng mới. Chưa kể giờ đây, Google đã ra mắt tính năng AI Search Labs - tức là AI hiển thị luôn nội dung tổng hợp khi người dùng tìm kiếm, điều đó càng khiến cho khả năng người dùng truy cập vào trang web thấp hơn. Một điều thú vị là khi Search Labs được giới thiệu, thì các bài viết bằng tiếng Anh đã soán ngôi trong bảng xếp hạng truy cập nhiều nhất.

    Một bài viết của mình thường rất dài, có khi lên đến cả 2000 chữ. Mà để viết ra được một bài như thế tốn nhiều thời gian. Nhiều bài viết ra chẳng có ai đọc là điều bình thường. Mình biết và chấp nhận vì không phải ai cũng gặp phải vấn đề đang nói đến. Viết đối với mình như một cách để rèn luyện sự kiên nhẫn và cả tư duy. Viết ra mà giúp được cả ai đó là một điều tuyệt vời.

    Vậy nên mình đang nghĩ sẽ tập trung vào nội dung ngắn và trung bình để viết được nhiều hơn. Nội dung dài chỉ khi muốn viết chi tiết hoặc đi sâu về một chủ đề nào đó. Nên là đang tìm cách thiết kế lại trang blog. Mọi người cùng chờ nha 😄

    » Xem thêm
  • CloudFlare đã giới thiệu tính năng pay per crawl để tính phí cho mỗi lần AI "cào" dữ liệu trên trang web của bạn. Là sao ta 🤔?

    Mục đích của SEO là giúp các công cụ tìm kiếm nhìn thấy trang web. Khi người dùng tìm kiếm nội dung mà có liên quan thì nó hiển thị trang web của bạn ra kết quả tìm kiếm. Điều này gần như là đôi bên cùng có lợi khi Google giúp nhiều người biết đến trang web hơn, còn Google thì được nhiều người dùng hơn.

    Bây giờ cuộc chơi với các AI Agents thì lại khác. AI Agents phải chủ động đi tìm kiếm nguồn thông tin và tiện thể "cào" luôn dữ liệu của bạn về, rồi xào nấu hay làm gì đó mà chúng ta cũng chẳng thể biết được. Vậy đây gần như là cuộc chơi chỉ mang lại lợi ích cho 1 bên 🤔!?

    Nước đi của CloudFlare là bắt AI Agents phải trả tiền cho mỗi lần lấy dữ liệu từ trang web của bạn. Nếu không trả tiền thì tôi không cho ông đọc dữ liệu của tôi. Kiểu vậy. Hãy chờ thêm một thời gian nữa xem sao 🤓.

    » Xem thêm
  • Lúc khái niệm "Vibe Code" bùng nổ mình cũng tò và tìm hiểu xem nó là gì. Hoá ra là chỉ cách lập trình mới: Lập trình viên ra lệnh và để cho LLM tự viết mã. Sau đó là hàng loạt các bài viết nói về cách họ đã xây dựng ứng dụng mà không cần phải viết một dòng mã nào, hoặc 100% là do AI viết...

    Mình không có ý kiến gì vì mỗi người một sở thích. Nhưng nếu tiếp xúc với nhiều thông tin như vậy thì ít nhiều thế hệ lập trình viên mới sẽ "ám ảnh". Khi làm việc với ngôn ngữ lập trình, chúng ta đang tiếp xúc ở bề nổi rồi. Đằng sau đó còn nhiều lớp khác che giấu sự phức tạp. Ví dụ biết viết JavaScript nhưng có biết nó chạy như thế nào không 🤔? Trên thực tế bạn chẳng cần phải biết nó chạy như thế nào mà chỉ cần biết cú pháp là viết được chương trình chạy ngon ơ.

    LLMs giờ đây lại thêm một lớp ảo hoá cho việc viết mã. Tức là nơi chúng ta không cần trực tiếp viết mà là ra lệnh. Làm việc sẽ nhanh hơn nhưng khi gặp vấn đề thì nhiều khả năng phải vận dụng kiến thức của tầng thấp hơn để giải quyết.

    Mình dùng Cursor, nhưng tính năng thích nhất và dùng nhiều nhất là Autocomplete & Suggestions. Thi thoảng cũng dùng Agents để bảo nó viết tiếp đoạn mã đang dở, thường thì nó làm rất tốt. Hoặc khi gặp lỗi thì hỏi, có lúc giải quyết được, lúc thì không. Nhìn chung nó đang làm thay nhiệm vụ của Google & Stack Overflow, giúp tiết kiệm thời gian 😆

    LLMs như một cuốn bách khoa toàn thư rất khủng khiếp. Hỏi gì cũng biết, cũng trả lời được nhưng có một sự thật là nó chỉ là mô hình đoán chữ (đoán tokens). Thế nên nếu vấn đề phổ biến thì nó sẽ làm rất tốt, nhưng vấn đề ít phổ biến hơn thì nó lại rất tệ, hoặc thậm chí là đưa ra thông tin sai lệch, nhiễu... Tóm lại, cần phải biết cách khai thác thông tin, mà để biết thì buộc người dùng phải có một lượng kiến thức nhất định, tránh rơi vào cái bẫy thiên kiến uy quyền (tin tưởng tuyệt đối vào ai đó) hoặc thiên kiến xác nhận (xác nhận niềm tin sẵn có bằng cách chỉ tìm bằng chứng xác nhận niềm tin đó).

    Tại thấy bài viết này nên lại nổi hứng viết vài dòng 🤓 Why I'm Dialing Back My LLM Usage

    » Xem thêm

Vấn đề

Express.js chắc hẳn là một thư viện mà bất kỳ lập trình viên JavaScript/Node.js đều biết. Nó giúp chúng ta xây dựng một máy chủ API theo tiêu chuẩn REST một cách nhanh chóng. Bên cạnh đó là rất nhiều thư viện hay middleware được tạo ra để tương thích và dễ dàng tích hợp vào trong các dự án sử dụng express.js, làm cho nó ngày càng trở nên phổ biến, cũng như được nhiều người biết đến.

Bắt đầu với express.js cũng không hề khó. Chỉ cần qua vài bước cài đặt thư viện và viết một ít mã, rồi sử dụng lệnh node để khởi động máy chủ. Quá trình deploy cũng không khó khăn hơn là mấy. Đẩy mã lên git, từ máy chủ "pull" về, sử dụng một công cụ quản lý tiến trình như pm2 khởi động lên thế là xong.

Đấy là một quy trình gần như là điều hiển nhiên để áp dụng trong trường hợp viết và triển khai một máy chủ Node. Kể cả sau này đi làm việc ở nhiều công ty, cái công đoạn "push" mã lên git, "pull" về máy chủ rồi "pm2 restart" mà tôi gọi vui là quy trình 3P để vận hành máy chủ.

Cho đến một ngày, bất chợt anh CTO nhắc đến Cloudflare Workers, một dạng của serverless. Nào là nó làm được cái này, làm được cái kia... mỗi ngày một ít và khiến tôi trở nên tò mò. Thi thoảng mỗi khi anh nhắc lại lên mạng đọc nhưng thú thật nó thật là khó hiểu. Mặc dù ai cũng biết khái niệm về serverless nhưng tính ứng dụng của nó trong thực tế là như thế nào thì lại không biết.

Cái gì được nhắc đến nhiều lần thì cũng gây được sự chú ý. Tôi bắt đầu đọc các bài viết về serverless một cách nghiêm túc hơn, nhưng cũng chỉ là đọc trên cơ sở lý thuyết. Còn không biết cách để triển khai mã lên cái gọi là serverless thì phải làm như thế nào. Bởi vì serverless là không có máy chủ, vậy thì push - pull - pm2 restart lúc này được thực hiện ở đâu?

À hoá ra có hẳn một quy trình riêng dành cho việc deploy mọi thứ lên serverless. Thậm chí quá trình này còn đơn giản hơn nhiều so với cách 3P truyền thống. Tất cả những chỉ cần làm chỉ là chạy một lệnh deploy ở dưới máy của mình. Khi đó tất cả mã nguồn sẽ được tải lên máy chủ serverless và sẵn sàng để được chạy ngay lập tức.

Trong phạm vi bài viết này, tôi sẽ tạm thời không đề cập đến quá trình triển khai mã lên máy chủ serverless. Mà trước tiên cần phải biết đến một thư viện giúp chúng ta xây dựng API trên serverless. Tại sao ư? Tại vì express.js và các thư viện tương tự khác không thể chạy được trên nhiều máy chủ serverless.

hono.dev

hono.dev là một thư viện tương tự express.js, nó cung cấp giải pháp để xây dựng API. Nhưng tại sao lại cần hono? Thì hãy nhìn vào hướng dẫn tạo một endpoint đơn giản dưới đây của Cloudflare Workers:

export default {  
  async fetch(request, env, ctx) {  
    return new Response("Hello World!");  
  },  
};  

Đoạn mã này sẽ phản hồi lại cụm từ "Hello World!". Nếu muốn thêm một method POST thì cần phải kiểm tra thêm điều kiện:


export default {  
  async fetch(request, env, ctx) {  
    if (request.method === "GET") {  
      return new Response("Hello World!");  
    } else if (request.method === "POST") {  
      const data = await request.json();  
      return new Response(`Hello, ${data.name}!`);  
    }  
  },  
};  

Quá rườm rà và phức tạp, một máy chủ API không đơn giản chỉ như thế, mà nó còn là tập hợp của hàng chục, hàng trăm endpoint khác nhau. Đây là lúc hono phát huy tác dụng.

import { Hono } from 'hono'  
const app = new Hono()  

app.get('/', (c) => c.text('Hello World!'))  
app.post('/', (c) => c.text(`Hello ${(await c.req.body()).name}`))  

export default app  

Thật nhanh gọn phải không!

Hono.dev khá giống với express.js hoặc koa.js. Hono tập trung vào sự đơn giản, router và cả middleware. Sử dụng hono khá tương đồng với các thư viện REST API mà bạn đang sử dụng lâu nay.

Ví dụ một middleware đơn giản để đo thời gian xử lý của request:

app.use(async (c, next) => {  
  const start = Date.now()  
  await next()  
  const end = Date.now()  
  c.res.headers.set('X-Response-Time', `${end - start}`)  
});  

Hono rất nhẹ, chỉ 14kb cho gói hono/tiny khiến nó lý tưởng cho môi trường có nhiều hạn chế như serverless. Với cách triển khai ứng dụng trên máy chủ thông thường, kích thước gói hoặc kích thước thư viện không thành vấn đề vì tài nguyên hệ thống dồi dào, dễ nâng cấp. Nhưng trong môi trường serverless thì không được như thế, tài nguyên hạn hẹp nên việc tìm kiếm các thư viện nhanh và nhẹ là điều hết sức cần thiết.

Có thể bạn đã nghe đến cụm từ universal module và adapter, chúng thường được dùng để chỉ một modules có thể hoạt động trong nhiều môi trường khác nhau. Từ máy chủ, trình duyệt hay thậm chí là trong cả môi trường serverless. Để làm được điều đó, universal module tận dụng những API mà môi trường hỗ trợ để thích nghi, hoặc tạo ra các adapter để chúng ta chủ động lựa chọn. Thậm chí nếu cấu trúc dự án đủ tốt thì không cần phải sửa quá nhiều mã để chạy trong các môi trường khác nhau.

Hono hỗ trợ nhiều adapter và điều đó làm cho nó hoàn hảo trong môi trường serverless. Một vài cái tên nổi bật có thể kể đến như là Cloudflare Workers, Vercel, Netlify, AWS Lambda... hay thậm chí là cả Service Worker ở trong trình duyệt.

Ví dụ một đoạn mã chạy tốt trong môi trường Cloudflare Worker dưới đây:

import { Hono } from 'hono'  
const app = new Hono()  

app.get('/', (c) => {  
  return c.text('Hello Hono!') 
})  

export default app  

Thì để chuyển sang môi trường serverless của Netlify thì cần thay đổi Adatper:

import { Hono } from 'jsr:@hono/hono'  
import { handle } from 'jsr:@hono/hono/netlify'  

const app = new Hono()  
app.get('/', (c) => {  
  return c.text('Hello Hono!')  
})

export default handle(app)  

Lưu ý vì môi trường serverless có cách triển khai khác nhau cho nên cách tốt nhất để lựa chọn được cách cấu hình phù hợp với từng môi trường là tham khảo tài liệu của Hono.

Tài liệu của Hono cũng hết sức đơn giản và ngắn gọn, chỉ cần đọc vài lượt là có thể bắt đầu dựng ngay một dự án. Các Middleware "cây nhà lá vườn" liên tục được bổ sung để làm tăng thêm trải nghiệm cho các nhà phát triển, không cần phải phát minh lại bánh xe nữa. Ngoài ra, Hono cũng đang nhận được sự quan tâm của cộng đồng khi có tốc độ tăng trưởng trên Github rất ấn tượng.

Đây là một bài viết ngắn giới thiệu về Hono và cả những gì nó làm được. Trong bài viết sau, chúng ta sẽ cùng nhau triển khai từ đầu đến cuối một máy chủ API lên Cloudflare Workers nhé!

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...