Tổng hợp thư viện hỗ trợ xây dựng ứng dụng CLI cho Node.js

Tổng hợp thư viện hỗ trợ xây dựng ứng dụng CLI cho Node.js

Tin ngắn hàng ngày dành cho bạn
  • Chà, quả là một bước tiến mới khi Microsoft vừa thông báo cập nhật cho mô hình Magma của họ. Cho những ai chưa biết thì đây là một mô hình dành cho AI agents, được thiết kế để xử lý các tương tác phức tạp trên cả môi trường ảo và thực.

    Để làm được điều đó, Magma được trang bị khả năng hiểu biết và dự đoán hành vi như con người. Magma có thể nhìn thấy, phân tích các thành phần và dự đoán công dụng cũng như các bước tiếp theo có thể xảy ra để hoàn thành một nhiệm vụ. Mình lấy ví dụ bạn sai khiến Magma vào Youtube, tìm kiếm một kênh nào đó rồi theo dõi. Cái này hoàn toàn có thể làm được bằng một số agent đã có từ trước, nhưng bản thân Magma là một agent rồi và nó biết được nó nên làm bước nào tiếp theo thay vì chúng ta phải viết mã để chỉ bảo từng bước cụ thể. Nghe hấp dẫn nhỉ.

    Chưa hết, Magma còn có thể "nhìn" theo thời gian thực, phân tích sự việc mà nó nhìn thấy để đưa ra hành động. Tưởng tượng ứng dụng vào công nghệ Robot thì sẽ thế nào? Chúng ta không cần viết mã từng li từng tí nữa mà chỉ cần ra lệnh bằng văn bản, bằng giọng nói thôi.

    Magma hiện chưa công bố mã nguồn, nhiều thông tin cho rằng cuối tháng này phiên bản đầu tiên sẽ được phát hành. Chúng ta cùng chờ xem nó ra sao nhé!

    » Xem thêm
  • Cũng giống như 12 Days of OpenAI - một chuỗi sự kiện diễn ra trong 12 ngày liên tiếp của OpenAI, mỗi ngày họ sẽ giới thiệu một công cụ "đột phá", và cứ như thế.

    DeepSeek đã bắt "trend" ngay sau đó với chuỗi 202502 Open-Source Week diễn ra ngay trong tuần sau. Mỗi ngày họ sẽ công bố một công cụ mã nguồn mở, trái được hoàn toàn với tính "Open" của AI. Chúng ta hãy chờ xem họ mang đến những dự án thú vị nào nhé 🤓. Chắc sẽ hấp dẫn lắm đây vì ai cũng biết từ lúc ra mô hình R1, Deepseek đã chiếm trọn tin tức nổi bật trên toàn thế giới.

    » Xem thêm
  • Grok 3 beta vừa ra mắt và cho mọi người dùng thử miễn phí có giới hạn số lần trong ngày (tài khoản trả phí hình như được dùng nhiều hơn). Trong đó có 2 tính năng nổi bật là Think và DeepSearch.

    Think thì chắc ai cũng biết hoặc dùng ở một số mô hình suy luận như ở ChatGPT rồi. Còn DeepSearch thì mới hơn, gõ điều bạn muốn vào thì nó sẽ tự lên mạng tìm kiếm thông tin rồi tổng hợp lại kết quả mà nó tìm thấy được. Khá hay nhưng chắc để tham khảo hoặc muốn tổng hợp thông tin nhanh chóng thôi chứ vẫn nên tự mình tìm kiếm thông tin 😅

    » Xem thêm

Vấn đề

Xin chào các độc giả của 2coffee.dev. Không biết là trong đây có ai đã và đang sử dụng ứng dụng dòng lệnh (CLI) không? Nếu có, tại sao bạn lại lựa chọn thay vì sử dụng ứng dụng có giao diện (GUI)? Nếu như nhớ không nhầm, tôi đã có một vài bài viết nói về quá trình làm một số ứng dụng dành riêng cho mình. Thành thật đối với tôi mà nói, có rất nhiều trường hợp CLI tỏ ra hữu ích hơn hẳn.

Nhớ lại những ngày đầu mới từ Windows sang Linux, cụ thể là Ubuntu. Tôi đã chửi thầm không biết bao nhiêu lần về cái hệ điều hành trời đánh này. Giao diện thì xấu, khó dùng, đã thế cái gì cũng bắt gõ lệnh, bao nhiêu dòng như thế thì ai mà nhớ hết được chứ? Cứ như Windows có phải tốt không. Giao diện thì trực quan mà lại còn dễ dùng. Chỉ cần nhìn là biết bấm vào đâu, cần là thấy ngay.

Đúng ghét của nào, trời trao của đấy. Đến cuối cùng mình lại "nghiện" cái cách gõ lệnh này từ bao giờ không hay. Nghiện thì cũng phải có lý do của nó, nó giúp mình tiếp cận vấn đề một cách nhanh hơn. Thay vì di chuột, thì giờ đây mình chỉ cần gõ, mà gõ thì nhanh hơn nhiều rồi. Chưa kể rất nhiều phần mềm được cung cấp dưới dạng CLI, từ đó lại cho ra đời các công cụ quản lý, giúp chúng ta dễ dàng cài đặt ứng dụng yêu thích chỉ bằng một câu lệnh duy nhất.

Đó cũng là nguồn cảm hứng để tôi tiếp cận cách giải quyết vấn đề bằng CLI. Đa phần là giúp cho việc quản lý trang blog. Thời gian đầu mới bắt tay vào tìm hiểu, quá nhiều thứ mới lạ và còn chưa biết. Phải vừa làm vừa học mất rất nhiều thời gian. Hiểu được tâm lý đó, ngày hôm nay tôi sẽ tổng hợp lại một số thư viện mà mình biết trong quá trình học trước đó. Những thư viện không chỉ giúp bạn tạo ra ứng dụng chất lượng mà còn hấp dẫn hơn với người dùng.

À! Tất cả đều là thư viện của Node.js. Nếu bạn đang sử dụng nền tảng khác như Go, Rust... thì tôi tin chắc rằng sẽ có những thư viện tương tự. Bạn đọc chỉ cần tìm kiếm dựa trên ý tưởng của các thư viện bên dưới đây thôi.

Bắt đầu nào!

Bộ khung

Đầu tiên phải nói đến bộ khung, đây là nơi cấu trúc nên ứng dụng CLI của bạn. Hãy tưởng tượng bộ khung giúp định hình, cấu trúc mã, tính năng sao cho phù hợp với tính chất của CLI.

Để ý, chúng ta thường thấy ứng dụng dòng lệnh hay có kiểu dùng như thế này:

$ mycli image --resize 512:512 /path/to/image

Với mycli là tên ứng dụng, image gần như là một chức năng, và các cờ (flag) --resize thường được dùng để chỉ định thêm các trường thuộc tính. Cuối cùng là /path/to/image trỏ đến dữ liệu cần xử lý.

Nếu quen với Node.js, bạn sẽ thấy cli khá tương đồng với lệnh chạy node, trong khi các tham số theo sau dễ dàng nắm bắt được thông qua biến process.argv.

$ node index.js image --resize 512:512 /path/to/image
// console.log(process.argv); ['node', 'index.js', 'image', '--resize', '512:512', '/path/to/image']

Hay nói cách khác, chỉ cần phân tích process.argv là đã đủ điều kiện để phân loại và gọi các hàm tương ứng với các tham số được sử dụng. Khi đó, ứng dụng chẳng khác gì một CLI.

yargscommander là hai thư viện nền tảng để giúp chúng ta phân tích tham số như đã nói ở trên. Chúng cung cấp các hàm hết sức nguyên thuỷ để làm tiền đề cho các thư viện khác.

oclif là một ví dụ. Công cụ này giúp chúng ta tạo ra các ứng dụng CLI mạnh mẽ bằng cách tối ưu hoá quy trình làm việc. oclif định nghĩa ra hết mọi thứ, từ cấu trúc thư mục cho đến những câu lệnh trợ giúp tạo ra (generate) tính năng mới. Việc bạn cần đó là tập trung vào viết logic. Qua một bước "build", oclif cho ra một ứng dụng CLI hoàn chỉnh bao gồm cả hướng dẫn sử dụng mà bạn không phải làm thêm nhiều bước.

Tệp cấu hình

Trong ứng dụng, ngoài những cấu hình mặc định hay cấu hình gắn chặt ở trong mã, thì đôi khi vẫn cần cấu hình từ phía người dùng.

Ví dụ bạn cung cấp cho người dùng thiết lập đường dẫn input/output của tệp tin sau khi xử lý. Cần phải lưu lại tuỳ chọn này vào đâu đó để sử dụng cho lần sau. Dễ nhất là tạo ra một tệp văn bản rồi lưu tất tần tật thông tin vào đó. Hoặc chuyên nghiệp hơn, bạn có thể dùng thư viện cosmiconfig.

cosmiconfig là một thư viện tự động tìm nạp các tệp cấu hình vào ứng dụng. cosmiconfig hỗ trợ rất nhiều định dạng như là .json, .yaml, .yml... Sau khi nạp xong, cosmiconfig đưa tất cả giá trị vào một biến mà bạn có thể sử dụng trong ứng dụng của mình.

Input

Input là một phần không thể thiếu trong các ứng dụng CLI, ngoài việc nhận dữ liệu người dùng bằng cách truyền qua các cờ như --resize thì vẫn còn nhiều cách khác tối ưu hoá hơn.

inquirer là một thư viện cung cấp rất nhiều cách thức để nhận dữ liệu người dùng. Ví dụ như xuất hiện một ô nhập văn bản, các câu hỏi yes/no hoặc tuỳ chọn select... mỗi khi gõ xong lệnh nhất định.

Output

Bạn đã từng sử dụng một ứng dụng CLI nào mà khi tương tác với nó thể hiện ra các hiệu ứng "loading" trông rất thích mắt chưa. Hoặc các dòng chữ với nhiều màu sắc để làm nổi bật thông tin cần truyền tải. Có rất nhiều thư viện giúp chúng ta đạt được điều này.

ora là một thư viện tạo ra hiệu ứng "loading" đẹp mắt. Các hiệu ứng này thường được dùng để báo hiệu cho người dùng biết tiến trình đang xử lý và họ cần chờ đợi. ora cung cấp rất nhiều hình dạng "xoay xoay" khác nhau. Ngoài ra bạn có thể kết hợp thêm cả văn bản để tạo ra các dòng thông báo liên tục trên màn hình, cho biết tiến trình đang xử lý đến giai đoạn nào.

progress giúp bạn tạo ra hiệu ứng "downloading" bằng sự kết hợp của các ký tự ASCII.

Đôi khi bạn sẽ cần kẻ bảng để hiển thị thông tin cho đầu ra, cli-table3 rất thích hợp để làm điều này. Hoặc nếu đơn thuần chỉ muốn đóng nội dung vào các "hộp" thì boxen là một sự lựa chọn hoàn hảo.

Ngoài ra bạn có thể kết hợp thêm chalk để tạo kiểu cho văn bản. Đây là một thư viện tuyệt vời để đổi màu, thêm các hiệu ứng như "bold", "dim", "italic"... nhằm làm nổi bật nội dung. Hoặc nếu thích "bảy màu" thì gradient-string còn gì bằng.

Utils

Ngoài những thư viện chính ở trên ra, chúng ta vẫn còn rất nhiều thư viện tiện ích khác mà CLI có thể dùng.

open giúp chúng ta mở một cái gì đó lên như hình ảnh, địa chỉ web hay thập chí là một ứng dụng. Thư viện này tỏ ra hữu ích khi chúng ta cần sự trợ giúp của một ứng dụng bên ngoài mà bản thân CLI không làm được.

clipboardy giúp đọc dữ liệu từ clipboard hoặc đặt lệnh sao chép bất cứ thứ gì bạn muốn.

shelljs để chạy bất cứ chương trình dòng lệnh nào khác thông qua shell.

Và rất nhiều thư viện khác nữa mà tôi không thể liệt kê ra hết ở đây.

Tổng kết

Trên đây là tổng hợp lại một số thư viện trợ giúp làm một ứng dụng cli cho Node.js. Là một người yêu thích cli, tôi đã tìm hiểu và áp dụng kha kha thư viện hữu ích vào trong ứng dụng của mình. Còn bạn thì sao? Bạn có đang sử dụng thêm công cụ nào nữa không? Hãy để lại bình luận cho tôi và mọi người cùng biết nhé. Xin cảm ơn!

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào 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...