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

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Deepseek chưa qua thì Moonshot AI Kimi k1.5 đã tới. Không biết là ai khè ai nữa nên thôi mình cứ để mấy cái ảnh ở đây cho mọi người đánh giá.

    Ảnh đầu là mô hình suy luận, ảnh sau là mô hình đoán chữ. Còn cái cột màu xanh lét ngoài cùng bên trái thì mọi người cũng biết là ai rồi đấy 🫣

    » Xem thêm
  • Ngủ dậy cái, sáng ra thấy mọi người đang xôn xao về mô hình Reasoning R1 của nhà Deepseek.

    Chà, nó có gì mà hót vậy? Có nhiều đấy chứ! Đầu tiên là nguồn mở, sau đó là hiệu năng quảng cáo ngang ngửa o1 của OpenAI, thứ ba là có nhiều tuỳ chọn tham số từ 1.5B đến 70B tha hồ lựa chọn hoặc nghiên cứu.

    » Xem thêm
  • Lên luôn cho nóng 🔥🔥🔥

    Một hướng dẫn cực hay và chi tiết về jj - Jujutsu - như mình đã chi sẻ trước đó jujutsu-tutorial

    » 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

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...
Bấm hoặc cuộn mạnh để sang bài mới