
Chào các 'con giời' của thầy Creyt! Hôm nay, chúng ta sẽ 'đập hộp' một thứ mà nghe qua thì tưởng đơn giản, nhưng lại cực kỳ quan trọng để giữ cho dự án của chúng ta luôn 'phong độ' và 'đỉnh của chóp'. Đó chính là Yarn upgrade. Nghe cái tên đã thấy mùi 'nâng cấp' rồi đúng không? Cứ như bạn đang 'độ' lại con xe cà tàng của mình thành một siêu phẩm vậy.
Tưởng tượng thế này nhé: Project Node.js của bạn giống như một căn biệt thự hoành tráng. Mỗi cái thư viện (dependency) mà bạn cài vào, ví dụ như React, Express, Lodash... nó giống như một món đồ nội thất, một thiết bị điện tử trong nhà vậy. Căn nhà của bạn có thể đẹp, nhưng nếu mấy món đồ đó cũ rích, lỗi thời, hay thậm chí là có 'lỗ hổng bảo mật' (như cái tủ lạnh đời Tống hay cái TV CRT màn hình cong), thì sao mà 'sang' được, đúng không?
Thế thì, yarn upgrade chính là 'đội quân' chuyên nghiệp được bạn thuê về để 'dọn dẹp' và 'nâng cấp' toàn bộ đồ đạc trong nhà. Nó sẽ rà soát từng món đồ (từng dependency) và xem xét: 'À, cái này có phiên bản mới hơn không? Phiên bản mới này có tương thích với những món đồ khác trong nhà không?'. Nếu có, nó sẽ 'thay mới' ngay lập tức, nhưng vẫn đảm bảo mọi thứ hoạt động trơn tru như cũ, hoặc thậm chí tốt hơn.
Cụ thể hơn, yarn upgrade sẽ đọc file package.json của bạn. Trong đó, mỗi dependency sẽ có một 'phạm vi phiên bản' (version range) được định nghĩa, ví dụ ^4.17.21 cho Lodash. Cái dấu ^ này giống như bạn nói: 'Tao muốn phiên bản mới nhất của Lodash, nhưng phải là phiên bản tương thích ngược với 4.x.x nhé. Đừng có nhảy lên 5.x.x làm hỏng hết mọi thứ!'. yarn upgrade sẽ tìm kiếm phiên bản mới nhất trong phạm vi đó và cập nhật chúng.
Khác với yarn install chỉ đơn thuần cài đặt những gì đã được ghi trong yarn.lock (giống như bạn đã có danh sách đồ đạc và chỉ việc lắp ráp), yarn upgrade thì chủ động đi tìm và mang về những món đồ mới hơn, tốt hơn (trong giới hạn cho phép). Còn yarn add thì là bạn mua thêm một món đồ hoàn toàn mới vào nhà.
Tại sao phải "nâng cấp"?
Tại sao phải làm cái trò này? Đơn giản thôi:
- Bảo mật: Các thư viện cũ thường có lỗ hổng bảo mật. Nâng cấp giúp vá những lỗ hổng đó, tránh bị 'hacker ghé thăm'.
- Hiệu năng: Các phiên bản mới thường được tối ưu, chạy nhanh hơn, mượt hơn.
- Tính năng mới: Đôi khi, các thư viện cập nhật thêm tính năng hay ho mà bạn đang thèm khát.
- Sửa lỗi: Fix bug là chuyện thường ngày ở huyện, và các bản cập nhật thường mang theo những bản vá lỗi quan trọng.

Code Ví Dụ Minh Hoạ: Nâng Cấp "Đồ Đạc" Cho Project
Giờ thì 'thực chiến' một chút cho nó máu. Giả sử bạn có một project Node.js với file package.json trông như thế này. Để ý cái lodash và axios nhé, giả sử chúng ta đang dùng phiên bản hơi cũ một chút.
{
"name": "my-cool-project",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"axios": "^0.21.1",
"lodash": "^4.17.15",
"express": "^4.17.1"
}
}
Đầu tiên, để xem xem 'đồ đạc' trong nhà mình có món nào đã cũ rồi, bạn dùng lệnh yarn outdated.
yarn outdated
Kết quả có thể trông như thế này (phiên bản có thể khác tùy thời điểm bạn chạy):
Package Current Wanted Latest Workspace
axios 0.21.1 0.21.4 1.6.8
lodash 4.17.15 4.17.21 4.17.21
Ở đây, Current là phiên bản bạn đang dùng, Wanted là phiên bản mới nhất trong phạm vi ^ của bạn (ví dụ ^0.21.1 cho axios sẽ muốn lên 0.21.4). Còn Latest là phiên bản mới nhất tuyệt đối của thư viện đó, không cần biết ^ hay ~ gì cả.
Bây giờ, để 'nâng cấp' tất cả các dependency lên phiên bản Wanted (tức là phiên bản mới nhất mà vẫn tương thích ngược theo package.json của bạn), bạn chỉ cần gõ:
yarn upgrade
Sau khi chạy xong, file yarn.lock của bạn sẽ được cập nhật, và nếu bạn chạy yarn outdated lần nữa, bạn sẽ thấy axios và lodash đã được 'lên đời' lên các phiên bản Wanted tương ứng.
À, mà còn một biến thể nữa: yarn upgrade --latest. Thằng này thì 'máu chiến' hơn nhiều. Nó sẽ bỏ qua cái dấu ^ hay ~ trong package.json của bạn và cố gắng nâng cấp tất cả các dependency lên phiên bản Latest tuyệt đối. Giống như bạn ra lệnh: 'Thay hết đồ đạc mới nhất mà thị trường có, không cần biết có vừa với nhà không!'. Cái này rất mạnh, nhưng cũng tiềm ẩn rủi ro 'vỡ trận' nếu các phiên bản mới có breaking changes (thay đổi gây lỗi).
Mẹo Vặt & Best Practices Từ Thầy Creyt
Để trở thành một 'lão làng' trong việc 'độ' project, nhớ mấy mẹo này của thầy Creyt nhé:
- Chạy test ngay sau khi upgrade: Đây là 'kim chỉ nam' số 1. Nâng cấp xong là phải chạy bộ test (unit test, integration test) ngay lập tức để đảm bảo không có gì bị 'sứt mẻ'. Nếu không có test, bạn đang 'đánh bạc' với project của mình đấy.
- Hiểu SemVer (Semantic Versioning): Đây là 'bảng cửu chương' của dân dev.
MAJOR.MINOR.PATCH(ví dụ4.17.21).PATCH(21 -> 22): Sửa lỗi nhỏ, không ảnh hưởng gì. An toàn để upgrade.MINOR(17 -> 18): Thêm tính năng mới, nhưng vẫn tương thích ngược. Khá an toàn.MAJOR(4 -> 5): THAY ĐỔI LỚN, CÓ THỂ GÂY LỖI. Cần đọc kỹ changelog trước khi upgrade.- Cái dấu
^(caret) trongpackage.json(ví dụ^4.17.21) nghĩa là 'cho tao bất cứ phiên bản nào lớn hơn, miễn là cùng MAJOR version'. Tức là nó sẽ upgrade4.17.21lên4.18.0,4.99.0nhưng không lên5.0.0. - Dấu
~(tilde) thì 'nhát' hơn: 'cho tao bất cứ phiên bản nào lớn hơn, miễn là cùng MAJOR và MINOR version'. Tức là~4.17.21chỉ lên được4.17.22,4.17.99chứ không lên4.18.0.
- Dùng
yarn upgrade-interactive: Nếu bạn muốn 'có quyền chọn lựa' từng dependency một, hãy dùng lệnh này. Nó sẽ hiển thị danh sách các dependency có thể nâng cấp và cho bạn chọn cái nào muốn nâng, cái nào không. Cực kỳ tiện lợi cho các project lớn. - Commit
yarn.lock: Luôn luôn commit fileyarn.lockvào Git. Nó đảm bảo mọi thành viên trong team, hay cả môi trường production, đều dùng chính xác các phiên bản dependency giống nhau. - Đừng upgrade 'mù quáng' trên production: Tuyệt đối không bao giờ chạy
yarn upgradetrực tiếp trên server production mà không test kỹ lưỡng trên môi trường dev/staging trước. Đó là 'tự sát'. - Đọc Changelog: Khi nâng cấp các thư viện quan trọng, đặc biệt là khi có breaking changes (MAJOR version bump), hãy dành thời gian đọc
CHANGELOG.mdhoặc release notes của thư viện đó. Nó sẽ cứu bạn khỏi những cơn đau đầu không đáng có.
Ứng Dụng Thực Tế & Thử Nghiệm Từ Thầy Creyt
Thầy Creyt cá là bạn đã và đang dùng yarn upgrade mà không hề hay biết, hoặc nếu biết thì cũng chưa tận dụng hết sức mạnh của nó. Bất kỳ dự án Node.js nào, từ một trang web React/Vue/Angular nhỏ xíu, một API backend dùng Express/NestJS, cho đến những hệ thống lớn như các nền tảng thương mại điện tử, mạng xã hội, hay các công cụ phát triển phần mềm... tất cả đều cần đến việc quản lý và nâng cấp dependencies định kỳ.
Các ông lớn như Facebook (đã từng dùng Yarn rất nhiều), Google, Microsoft... đều có quy trình nghiêm ngặt để quản lý dependencies trong các dự án của họ. yarn upgrade là một phần không thể thiếu trong quy trình đó.
Thầy Creyt đã từng trải qua không biết bao nhiêu lần 'đau tim' vì dependency. Có lần, chỉ vì lười không upgrade định kỳ, đến lúc cần một tính năng mới trong thư viện A, thì phát hiện ra thư viện A bản mới lại yêu cầu thư viện B bản mới hơn, mà thư viện B bản mới lại có breaking change với thư viện C. Thế là thành một mớ bòng bong 'dependency hell'. Giải quyết mất cả tuần trời, tốn bao nhiêu tóc. Rút kinh nghiệm xương máu!
Vậy thì, khi nào nên 'rút súng' yarn upgrade ra?
- Bảo trì định kỳ: Cứ vài tuần hoặc mỗi tháng, hãy chạy
yarn upgradeđể làm mới các dependency an toàn. Giống như bạn 'bảo dưỡng xe' định kỳ vậy. - Trước khi bắt đầu một tính năng mới: Đảm bảo codebase của bạn đang ở trạng thái 'tươi mới' nhất trước khi thêm vào những thứ mới.
- Khi có thông báo về lỗ hổng bảo mật: Nếu có cảnh báo về lỗ hổng trong một dependency nào đó, hãy
upgradengay lập tức. - Khi một bug khó hiểu xuất hiện: Đôi khi, một bug 'trời ơi đất hỡi' lại đến từ một phiên bản dependency cũ có lỗi. Thử
upgradexem sao.
Còn khi nào thì nên dùng yarn upgrade --latest 'máu chiến' hơn?
- Khi bạn muốn nhảy lên một MAJOR version mới: Ví dụ, bạn muốn từ React 17 lên React 18. Lúc này, bạn biết chắc chắn sẽ có breaking changes và đã sẵn sàng để xử lý chúng.
- Khi bắt đầu một dự án mới: Để đảm bảo tất cả các dependency đều là phiên bản mới nhất từ đầu.
- Khi thư viện có bản vá lỗi quan trọng chỉ có ở MAJOR version mới: Nhưng hãy luôn nhớ,
upgrade --latestlà con dao hai lưỡi. Luôn luôn backup code, và chuẩn bị tinh thần để sửa lỗi!
Tóm lại, yarn upgrade là một công cụ cực kỳ mạnh mẽ để giữ cho project của bạn luôn 'khỏe mạnh' và 'thời thượng'. Đừng coi thường nó, hãy biến nó thành người bạn đồng hành tin cậy của bạn trên con đường chinh phục thế giới code nhé các 'con giời'!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!