Semantic Versioning (SemVer) là gì? Hiểu rõ các con số trong package.json
Khi mở file package.json trong bất kỳ dự án React hay Node.js nào, bạn sẽ dễ dàng bắt gặp những dòng code khai báo thư viện kiểu như thế này:
JSON
"dependencies": {
"react": "^18.2.0",
"express": "~4.18.2"
}
Những con số 18.2.0 hay 4.18.2 không phải được đặt ngẫu nhiên. Chúng tuân theo một bộ quy tắc có tên là Semantic Versioning (gọi tắt là SemVer - Phiên bản theo ngữ nghĩa). Việc hiểu rõ SemVer không chỉ giúp bạn quản lý thư viện tốt hơn mà còn tránh được những lỗi "chết người" khi update code.
1. Cấu trúc của Semantic Versioning
Theo chuẩn SemVer, một phiên bản phần mềm sẽ có cấu trúc gồm 3 phần chính, được ngăn cách bởi dấu chấm:
MAJOR.MINOR.PATCH (Ví dụ: 1.4.2)
Trong đó:
MAJOR (Phiên bản chính - 1): Được tăng lên khi có những thay đổi lớn, làm thay đổi hoặc phá vỡ cấu trúc cũ (Breaking Changes). Code cũ của bạn có thể sẽ bị lỗi nếu cập nhật phiên bản này mà không chỉnh sửa lại.
MINOR (Phiên bản phụ - 4): Được tăng lên khi thêm các tính năng mới (Features) nhưng vẫn đảm bảo tương thích ngược (Backward Compatible). Code hiện tại của bạn vẫn hoạt động bình thường khi update lên bản này.
PATCH (Bản vá - 2): Được tăng lên khi chỉ sửa lỗi (Bug fixes) của phiên bản hiện tại. Hoàn toàn an toàn để cập nhật.
Ví dụ: Thư viện của bạn đang ở phiên bản 2.1.0.
Nếu bạn fix một lỗi bảo mật nhỏ -> Update thành
2.1.1Nếu bạn thêm một hàm API mới nhưng không ảnh hưởng API cũ -> Update thành
2.2.0(Lúc này Patch quay về 0).Nếu bạn đập đi xây lại toàn bộ cấu trúc thư viện, code cũ không dùng được nữa -> Update thành
3.0.0(Minor và Patch quay về 0).
2. Các hậu tố phụ (Pre-release & Build Metadata)
Đôi khi, bạn sẽ thấy các phiên bản có thêm chữ cái phía sau, ví dụ như 1.0.0-alpha.1 hoặc 18.0.0-rc.3. Đây là các phiên bản phát hành trước (Pre-release).
alpha: Phiên bản sơ khai, dùng trong nội bộ team dev, chưa ổn định và còn nhiều lỗi.
beta: Phiên bản thử nghiệm rộng rãi hơn, dành cho cộng đồng test thử tính năng mới.
rc (Release Candidate): Phiên bản "ứng cử viên", gần như hoàn thiện và giống hệt bản chính thức, chỉ chờ xác nhận cuối cùng để tung ra.
3. Ý nghĩa của các ký tự đặc biệt trong package.json
Khi chạy lệnh npm install, NPM tự động thêm các ký tự như ^ (Caret) hoặc ~ (Tilde) vào trước số version. Đây là luật để NPM biết mức độ tự động cập nhật thư viện của bạn.
Dấu ngã ~ (Tilde)
Chỉ cho phép cập nhật tự động PATCH (sửa lỗi).
Ví dụ:
"~4.18.2"sẽ tự động cập nhật lên4.18.3,4.18.4... nhưng sẽ dừng lại và KHÔNG bao giờ lên4.19.0. Đảm bảo an toàn tuyệt đối.
Dấu mũ ^ (Caret)
Chỉ cho phép cập nhật tự động MINOR và PATCH (tính năng mới & sửa lỗi), tuyệt đối không tự động lên MAJOR để tránh Breaking Changes.
Ví dụ:
"^18.2.0"sẽ tự động cho phép tải về18.2.1,18.3.0,18.9.9... nhưng sẽ chặn không cho lên19.0.0. (Đây là mặc định của NPM hiện tại).
4. Tóm lại
Hiểu và áp dụng đúng Semantic Versioning là kỹ năng bắt buộc của một Developer khi làm việc với hệ sinh thái mã nguồn mở. Nó giống như một "bản cam kết" giữa người viết thư viện và người sử dụng, giúp quá trình nâng cấp ứng dụng trở nên dự đoán được và an toàn hơn rất nhiều.