Là một lập trình viên, tôi tin chắc rằng ai cũng đã nghĩ đến việc tận dụng những dòng code để "sai khiến" nó làm một việc gì đó tự động. Lấy ví dụ như là một đoạn mã JavaScript được một lập trình viên nào đó viết ra, để tính tổng số tiền mà bạn đã "nướng" vào một sàn thương mại điện tử nào đó, thay vì phải ngồi cộng từng đơn hàng trong danh sách kéo mãi không biết bao giờ mới hết.
Việc tự động hóa mang lại nhiều lợi ích, dễ thấy nhất đó là tiết kiệm thời gian và giảm sai sót cho một tiến trình lặp đi lặp lại. Mặt khác, nếu thấy đoạn mã mà mình viết ra có thể chia sẻ được cho người khác thì đúng là một công đôi việc.
Tôi cũng hay tạo ra những dòng mã như vậy, nhưng thay vì đếm giá trị đơn hàng thì chúng lại tập trung giải quyết một vấn đề hay gặp phải trong công việc hơn. Lấy ví dụ như là một đoạn mã giúp đồng bộ hóa dữ liệu giữ hai máy chủ production với development của trang blog này. Bởi vì đôi khi cần thử nghiệm tính năng mới trên dữ liệu thật cho an toàn trước khi đưa nó vào môi trường "sản xuất".
Tôi thường lưu trữ các mã này vào một nơi nào đó, ví dụ như trong ứng dụng ghi chú của hệ điều hành, để nó được đồng bộ đến tất cả nơi tôi làm việc, và sau này có gặp một vấn đề gì đó thì sẽ mở ra, "copy" lại và "paste" vào cho nó chạy. Thật sáng suốt!
Đấy chỉ là một ví dụ đơn giản cho cách tự động hóa công việc lặp đi lặp lại. Vài tuần trước, khi tôi đang tập trung tối ưu hóa hình ảnh cho blog thì vấn đề trở nên rắc rối hơn. Nếu cứ "copy" rồi "paste", chỉnh sửa lại nội dung cho nó chạy, thì lại tốn nhiều thời gian hơn. Tôi chợt phát hiện những đoạn mã như thế lại chỉ phù hợp với những công việc có tần suất sử dụng thấp, dụ như 1 ngày chỉ sử dụng 1 lần thôi, hmm.. kiểu như thế.
Nói đến đây thì có lẽ bạn đọc cũng đang hình dung ra cách giải quyết vấn đề cho mình. Tôi biết là có nhiều cách để làm, riêng tôi thì chọn cách tạo ra một ứng dụng CLI làm tất cả công việc trên.
Giao diện dòng lệnh (CLI) là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành của mình thông qua bàn phím. Một cơ chế trái ngược với CLI là giao diện người dùng đồ họa (GUI).
Điểm mạnh của GUI là điều hướng một cách trực quan, như bấm vào các biểu tượng và hình ảnh để sử dụng phần mềm, ứng dụng đó. Tuy nhiên, GUI không hiệu quả đối với các tác vụ quản trị hệ thống, đặc biệt là với môi trường ảo hoặc từ xa.
Với CLI, bạn có thể nhập các lệnh văn bản để định cấu hình, điều hướng hoặc chạy các chương trình trên bất kỳ máy chủ hoặc hệ thống máy tính nào. Tóm lại là CLI tập trung vào tính năng và tốc độ sử dụng.
CLI khá là rộng lớn khi nhắc đến, nhưng trong phạm vi bài viết này, thì tôi chỉ muốn nói đến khả năng ứng dụng CLI trong các ứng dụng phần mềm. Hiểu đơn giản CLI là các ứng dụng bằng dòng lệnh mà chúng ta gõ gõ hàng ngày trong Terminal, khi đó cd
, ls
, pwd
... cũng có thể coi là các ứng dụng phần mềm để giúp chúng ta thực hiện một chức năng nào đó.
Quay trở lại với bài toán tối ưu hóa hình ảnh mà tôi có một bài viết Tối ưu hóa hiển thị hình ảnh bằng blur placeholder và lazyload. Có nhiều bước cần làm để tạo ra một hình ảnh sử dụng được trong bài viết của blog. Nhưng tựu chung lại thì có hai hành động chính:
Thứ nhất là định dạng lại hình ảnh về dạng webp
, điều chỉnh chất lượng hình ảnh và cắt hình để cho ra kích thước mong muốn.
Thứ hai là tải tất cả hình ảnh vừa tạo ra lên R2, đồng thời lấy được tất cả liên kết đến chúng.
Nếu áp dụng phương pháp "copy paste" như ở đầu bài thì có phần rườm rà. Như vậy, để quản lý tập trung và tiết kiệm thời gian gõ phím, thì tạo ra một ứng dụng CLI trong trường hợp này là hết sức hợp lý.
Tưởng tượng, ứng dụng của tôi có tên là img
, khi muốn tạo ra tất cả hình ảnh đã được tối ưu hóa, chỉ cần chạy:
$ img all path/to/file
Với path/to/file
là đường dẫn đến ảnh gốc. Sau khi chạy xong, hình ảnh mới được tạo ra sẽ lưu vào path/to/new/file
. Lúc này, tôi tạo thêm một lệnh upload
nữa cho hành động tải ảnh lên R2:
$ img upload path/to/new/file
Hoàn hảo, mọi thứ hoạt động. Nhưng chưa hết, một điểm cộng của CLI đó là nó hỗ trợ tham số (args) và các cờ (flag), dựa vào flag, chúng ta còn có thể tạo ra nhiều trường hợp (options) xử lý phong phú hơn nữa.
Ví dụ, tôi muốn ngay sau khi tất cả hình ảnh được tạo ra thì tải lên R2 luôn thay vì tốn thêm một lệnh upload
nữa thì viết thêm mã xử lý cho cờ --upload
hoặc viết tắt là -u
:
$ img all path/to/file --upload
# hoặc
$ img all path/to/file -u
Dĩ nhiên trên đây chỉ là giả thuyết, ứng dụng CLI có thể làm được nhiều hơn tùy vào cách của mỗi người. Vì thế bạn có thể thoải mái biến tấu các lệnh và các cờ theo sở thích của mình, nhưng với một lưu ý là nó phải rõ ràng và dễ nhớ, dễ sử dụng.
Ứng dụng CLI không giới hạn ở bất kỳ ngôn ngữ nào, nếu bạn đang làm Golang, hãy tìm kiếm thư viện hỗ trợ tạo CLI cho Go. Tương tự, tôi làm Node.js thì oclif giúp tôi làm điều này. Ngoài oclif ra thì còn nhiều thư viện giúp bạn tạo ra được ứng dụng CLI, hãy dành thời gian tham khảo chúng, nếu thấy cú pháp thân thiện, dễ sử dụng thì hãy chọn. Tham khảo thêm nhiều thư viện khác tại Command-line utilities | awesome-nodejs Public | Github.
oclif tương đối đơn giản để bắt đầu. Chỉ cần làm theo hướng dẫn Introduction | oclif docs là ngay lập tức chúng ta đã có một "lệnh" của riêng mình.
$ npx oclif generate mynewcli
? npm package name (mynewcli): mynewcli
$ cd mynewcli
$ ./bin/dev.js hello world
hello world! (./src/commands/hello/world.ts)
oclif hỗ trợ tạo tự động một lệnh mới (CLI Generator), Flag/Argument parsing, Testing, Autocomplete và nhiều tính năng khác. Bạn đọc tham khảo thêm tại Features | oclif docs.
CLI là một cơ chế phần mềm bạn sử dụng để tương tác với hệ điều hành, phạm vi của CLI tương đối rộng nhưng trong phạm vi bài viết này, chúng ta tìm hiểu việc ứng dụng CLI để tạo ra một phần mềm cho riêng mình.
Nếu như trước đây, cách tôi thường làm là lưu lại các đoạn mã thường dùng để khi cần chỉ việc "copy paste" để chạy chúng thì việc tạo ra CLI sẽ đơn giản hóa quá trình này, đồng thời giúp tiết kiệm thời gian sử dụng.
oclif là một thư viện giúp tạo CLI đơn giản bằng Node.js. Ngoài ra nếu bạn đang sử dụng một ngôn ngữ nào khác thì hãy tìm kiếm một thư viện phù hợp cho mình nhé!
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!
Đăng ký nhận thông báo bài viết mới
Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.
Bình luận (1)