Đã phát triển trình định dạng C, C++, Java sử dụng Clang trong môi trường Node.js.
(github.com/lumirlumir)Xin chào, tôi đã phát triển một trình định dạng C, C++, Java sử dụng Clang trong môi trường Node.js. Dự án này là một dự án mới được triển khai dựa trên gói clang-format của angular, vốn đã không còn được bảo trì nữa (đã bị deprecated).
Khoảng một hai tháng trước tôi cũng từng đăng một bài với nội dung tương tự, nhưng do độ ổn định của gói đã được cải thiện hơn nữa và có thêm các tính năng mới nên tôi viết lại bài này.
Hiện tại, nhờ nhiều người quan tâm và nhiều người dùng legacy hiện có đã chuyển sang sử dụng, số lượt tải hằng tuần đã vượt 10.000. Tôi thực sự rất cảm ơn.
Ngoài ra, gói này đã đạt full test coverage, và hiện cũng đã có một PR được mở để thay đổi cách sử dụng trong Node.js core từ dự án clang-format cũ của angular sang gói hiện tại, nên có lẽ bạn có thể yên tâm về độ ổn định khi sử dụng. (Tất nhiên, vẫn có thể còn những phần mà tôi chưa nhận ra...)
Gói này là một gói dựa trên clang-format của Clang, vốn nổi tiếng là trình biên dịch C của LLVM, dùng để xử lý định dạng mã cho các ngôn ngữ C, C++, Java. Có thể xem nó đảm nhiệm vai trò tương tự như Prettier, một trong những gói nổi tiếng nhất trong môi trường Node.js.
Tuy nhiên, vì Prettier không hỗ trợ định dạng cho các ngôn ngữ C, C++, Java nên khi cần xử lý định dạng cho các ngôn ngữ này, nhiều người thường dùng clang-format.
clang-format trong môi trường Node.js đặc biệt hữu ích khi cần viết cả mã JavaScript lẫn mã C/C++, như trong quá trình phát triển Node.js core. Với clang-format trước đây, bạn phải cài thêm các phụ thuộc để dùng gói này, nhưng với gói hiện tại thì không cần nữa.
Ngoài ra, gói clang-format cũ cũng có điểm khá bất tiện khi tích hợp vào workflow dùng Node.js và npm trong CI, nhưng với gói hiện tại, chỉ cần tải từ npm và thiết lập script là đủ, nên mang lại nhiều lợi ích trong môi trường CI.
Ngoài ra, khi được nâng cấp lên phiên bản 1.2.0, các tính năng mới cũng đã được bổ sung. Thay đổi cốt lõi là đã thêm gói git-clang-format.
Hãy lấy ví dụ một tình huống khi đang làm dự án C/C++ và nhận ra cần có định dạng mã, nên muốn đưa vào các gói như clang-format.
Ở các dự án quy mô nhỏ, việc chỉnh sửa hàng loạt định dạng mã rồi commit một lần có thể không gây nhiều vấn đề cho việc theo dõi lịch sử. Tuy nhiên, trong các dự án quy mô lớn, việc áp dụng định dạng mã thường buộc phải chỉnh sửa hàng loạt định dạng của mã hiện có, nên có nguy cơ làm lịch sử commit trở nên lộn xộn.
Lúc này, nếu lập trình viên chỉ sửa 100 dòng trong tổng số 1000 dòng mã, và khi commit chỉ kiểm tra định dạng cho 100 dòng đã sửa thì sao? Thứ nhất, vì chỉ cần áp dụng định dạng cho 100 dòng đã sửa nên không cần phải sửa lại toàn bộ 1000 dòng, nhờ đó việc theo dõi lịch sử commit sẽ thuận tiện hơn. Thứ hai, trong quá trình phát triển, cứ mỗi lần mã được commit thì số lượng đoạn mã đã được áp dụng định dạng sẽ dần tăng lên, nên theo thời gian định dạng mã sẽ trở nên nhất quán hơn.
Để làm điều này, người ta dùng gói git-clang-format. Tương tự như việc dùng lint-staged để chỉ kiểm tra các file đã được staged nhằm cải thiện tốc độ CI, gói này tiến thêm một bước nữa: chỉ kiểm tra các dòng mã tương ứng với phần thay đổi trong các file đã thay đổi để áp dụng kiểm tra định dạng mã. Công cụ này cũng được LLVM cung cấp sẵn mặc định, nên tôi đã đóng gói lại và phát hành.
Tài liệu chính thức đã mô tả chi tiết cách sử dụng, rất mong nhận được sự quan tâm của mọi người. (Tuy nhiên tài liệu chính thức là tiếng Anh.) Nếu có câu hỏi hoặc ý kiến khác, mong mọi người để lại bình luận. Cảm ơn mọi người đã đọc bài viết dài này.
Tài liệu chính thức: https://clang-format-node.lumir.page
Kho mã: https://github.com/lumirlumir/npm-clang-format-node
2 bình luận
Ủng hộ phát triển mã nguồn mở!
Cảm ơn bạn!!🙇♂️