0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

🚀 Tại sao không nên xóa file package-lock.json?

Đăng vào 7 tháng trước

• 5 phút đọc

🚀 Giải mã phụ thuộc npm: Bí ẩn lớn của package-lock

Là các lập trình viên, chúng ta đều đã trải qua những khoảnh khắc khó xử: một đồng nghiệp chạy lệnh npm install và đột nhiên ứng dụng của họ bị hỏng, trong khi nó vẫn hoạt động trên máy của tôi™. Đó là một câu chuyện kinh dị kinh điển trong lập trình. Kẻ phản diện? Thường là một bước ngoặt bất ngờ trong việc giải quyết phiên bản phụ thuộc, đến từ việc không tôn trọng file package-lock.json.

Hãy cùng lật tấm màn và giải quyết bí ẩn này một lần và mãi mãi. 👇


📦 Cơ bản về Semver: Câu chuyện của ba ký hiệu (^, ~, và cái im lặng)

Hãy nghĩ về các phụ thuộc của bạn như một dịch vụ đăng ký cho mã. Số phiên bản là gói đăng ký của bạn.

  • Phiên bản chính xác ("express": "4.17.1"): Bạn đang đăng ký một gói cố định. Không có thay đổi gì cả. Bạn sẽ luôn nhận được 4.17.1 và không gì khác. Đây là cách ổn định nhất, nhưng bạn sẽ bỏ lỡ các bản vá bảo mật và sửa lỗi trừ khi bạn tự mình cập nhật.

  • Tilde ~ (Cập nhật bản vá) 🩹

    Copy
    "express": "~4.17.1"

    Đây giống như một gói "phiên bản phụ giống nhau, nhưng cho tôi bản sửa lỗi mới nhất". Bạn sẽ nhận được bất kỳ phiên bản bản vá mới nào, nhưng vẫn giữ trong gia đình 4.17.x. Vì vậy, 4.17.1 có thể cập nhật lên 4.17.3, nhưng sẽ không bao giờ nhảy lên 4.18.0.

  • Caret ^ (Cập nhật phụ + Bản vá) 🚀

    Copy
    "express": "^4.17.1"

    Đây là gói "mới nhất và tốt nhất, nhưng trong cùng một phiên bản chính". Bạn nhận được tất cả các tính năng và sửa lỗi mới miễn là chúng không phá vỡ tính tương thích. 4.17.1 có thể cập nhật lên 4.18.2 hoặc 4.19.0, nhưng nó sẽ không bao giờ nhảy lên một 5.0.0 đáng sợ (có thể có những thay đổi phá vỡ).

Vì vậy, hãy nhớ:

  • ~ = "Sửa lỗi cho tôi!"
  • ^ = "Đưa tôi đến phiên bản phụ tiếp theo!"

🔒 package-lock.json: ADN của Dự án của bạn

Khi bạn chạy npm install, npm sẽ tạo một bức ảnh chụp toàn bộ cây phụ thuộc của bạn, bao gồm tất cả các phiên bản lồng nhau. Bức ảnh này được lưu trong file package-lock.json.

Hãy tưởng tượng package.json là danh sách mua sắm của bạn: "Tôi cần sữa (^1.0.0) và bánh mì (~2.0.0)".
File package-lock.jsonbiên lai từ chuyến đi mua sắm gần đây nhất của bạn: "Tôi đã mua Sữa@1.2.5 từ thương hiệu này, và Bánh mì@2.0.3 từ thương hiệu khác."

  • Với package-lock.json: Tất cả mọi người trong nhóm của bạn đều nhận được cùng một món hàng từ chuyến đi mua sắm cuối cùng. Tính nhất quán và ổn định được đảm bảo.

  • Không có package-lock.json: Mỗi lần bạn đến cửa hàng, bạn sẽ nhận được "sữa mới nhất" và "bánh mì mới nhất," có thể là các thương hiệu khác nhau (các phiên bản khác nhau) so với những gì đồng nghiệp của bạn đã nhận. Đây là nơi "nó hoạt động trên máy của tôi" xuất hiện.


👻 Một Kịch bản Ví dụ: Mẹo về Phụ thuộc Biến mất

Giả sử bạn có package.json như sau:

Copy
{
  "dependencies": {
    "A": "^1.0.0",
    "B": "^2.0.0"
  }
}

Cài đặt đầu tiên:
Bạn chạy npm install. Tại thời điểm đó, A@1.0.0 cần một phụ thuộc gọi là X, mà giải quyết thành X@1.0.5. Phụ thuộc khác của bạn, B@2.0.0, cũng cần X, nhưng nó lại giải quyết thành X@2.0.3.

Cây phụ thuộc của bạn trông như thế này:

Copy
A → X@1.0.5
B → X@2.0.3

Một tuần sau (Bí ẩn bắt đầu):
Các phiên bản mới của X được phát hành: X@1.0.6X@2.0.4.

Nếu bạn xóa package-lock.json và chạy lại npm install, npm sẽ bỏ qua "biên lai" của bạn và lấy các món hàng mới nhất theo "danh sách mua sắm" của bạn (package.json).

Cây mới của bạn:

Copy
A → X@1.0.6
B → X@2.0.4

Cùng package.json, kết quả khác nhau! Ứng dụng có thể bị hỏng vì một phiên bản mới của X đã giới thiệu một lỗi hoặc một thay đổi phá vỡ. Đây là lý do tại sao xóa file lock là một hành động mạo hiểm của lập trình viên.


🤝 Quy tắc vàng: Giữ sự ổn định, Giữ sự nhất quán

  1. Luôn luôn commit package-lock.json vào repo của bạn. Đây là dấu hiệu bí mật đảm bảo rằng mọi người trong nhóm đều đồng ý với nhau.
  2. Sử dụng npm ci trong các pipeline CI/CD. ci có nghĩa là "cài đặt sạch." Nó giống như một chỉ huy: nó cài đặt chính xác những gì có trong file lock và thất bại nếu hai cái không khớp. Không có bất ngờ, không có trò đùa.
  3. Đối xử với package.jsonpackage-lock.json như một đơn vị duy nhất. Chúng là âm và dương, kế hoạch và kết quả.

🎯 Tóm tắt: Lời phán quyết cuối cùng

  • ^ → "Tôi muốn những tính năng mới nhất không phá vỡ."
  • ~ → "Tôi chỉ muốn các bản sửa lỗi cho phiên bản cụ thể này."
  • package-lock.json → "Tôi muốn tái hiện cài đặt chính xác này trên bất kỳ máy nào, bất cứ lúc nào."
  • Xóa file lock → "Tôi thích sống mạo hiểm và muốn mạo hiểm phá vỡ ứng dụng của mình vì thú vui."

Vậy, việc xóa file package-lock liệu có khiến bạn trở nên ngầu không? Không thực sự. Nó chỉ biến bạn thành một đại lý hỗn loạn của sự không chắc chắn. Hãy giữ file lock của bạn. Sử dụng npm ci. Và bảo vệ bản thân khỏi cơn đau đầu vĩnh cửu của "nhưng nó đã hoạt động hôm qua!" 😅


Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào