Câu 1Khi bạn gõ npm install react trong thư mục my-app, package tải về nằm ở đâu?
Quản lý package là gì — npm install cài những gì và cài vào đâu
Bài viết này nằm trong khóa Kiến thức nền tảng về CNTT, xây dựng từ đầu những kiến thức CNTT thực tế tối thiểu mà bạn cần để lập trình và vibe coding.
Khi bạn gõ npm install react, trong my-app xuất hiện thư mục node_modules và package.json có thêm một dòng. Các sơ đồ lần theo những gì một dòng đó tạo ra.
Bài viết này nói về quản lý package.
Đây là cơ chế chỉ định tên để tải một thư viện bên ngoài về bằng một dòng như npm install, rồi đặt nó vào một chỗ cố định.
Bạn chỉ gõ một dòng bên trái, còn hai mục bên phải là phần được thêm vào.
Thứ tăng thêm chỉ là thư mục node_modules và một dòng trong package.json, còn app.js bạn tự viết không đổi một ký tự nào.
Package là gì — thư viện bên ngoài mà bạn chỉ định tên để tải về
Thư viện bên ngoài được gói lại thành dạng tải về được theo tên thì gọi là package (package. Thư viện bên ngoài được gói lại thành dạng có thể chỉ định tên để tải về), còn con số cho biết nội dung tại thời điểm đó là phiên bản (version).
Khi muốn hiển thị ngày tháng cho dễ đọc trong ứng dụng đặt chỗ my-app, bạn tự viết phần xử lý đó cũng được, nhưng nó cũng được phát hành sẵn dưới dạng package.
Bên trái, mọi dòng bạn viết đều là của bạn; bên phải, bạn chỉ gọi thứ đã tải về bằng một dòng.
- Chuỗi bạn chỉ định khi tải về
- Xác định đúng một thứ trong kho package
- Mỗi lần sửa đổi lại thêm một số mới
- Các số cũ vẫn còn đó
- Chính chương trình chạy khi được gọi
- Bạn không tự sửa những file này
- Phần mà chỉ mình react thì không chạy được sẽ liệt kê ở đây
- Chúng đi kèm khi bạn tải react về
Thứ bạn chỉ định khi tải về chỉ là cái tên ở trên cùng.
Chính "tên của các package khác mà nó cần" ở dưới cùng mới làm số thư mục tăng lên về sau.
Package là thư viện bên ngoài mà bạn tải về được bằng tên
Package là chương trình do người khác viết, được đặt tên và đưa về dạng phát hành được.
Chỉ định tên là bạn mang được nội dung của nó về máy tính của mình, còn phiên bản là con số để phân biệt các lần sửa đổi trong cùng một cái tên.
Khi bạn gõ npm install react, trong my-app xuất hiện những gì
Thứ chỉ định tên để tải về là công cụ quản lý package (package manager. Chương trình tải package về và đặt vào một chỗ cố định), và bản của JavaScript là npm.
Cách gõ chỉ là một dòng trong terminal, và cả hai dòng đều phải gõ bên trong my-app.
# Chuyển vào thư mục my-app rồi mới gõ
cd my-app
# Tải về một package có tên react
npm install react
# Tải về cùng lúc mọi tên đang liệt kê trong file danh sách
npm install
Các package đã tải về sẽ nằm trong node_modules (thư mục npm tạo bên trong my-app để chứa các package đã tải về).
- app.js — mã nguồn xử lý việc đặt chỗ
- package.json — file liệt kê các tên cần tải về
- Mã nguồn của package đã tải về
- Thứ bạn gọi chính là nội dung này
- Mỗi tên tạo ra một thư mục
- Nếu nó không cần gì thì phần này không tăng
File bạn tự viết và thư mục npm tạo nằm tách nhau trong cùng my-app.
Vẫn là một dòng đó, nhưng kết quả thay đổi theo cách gõ và theo việc tên có bị gõ sai hay không.
| Dòng bạn đã gõ | npm làm gì | Kết quả trong my-app |
|---|---|---|
| npm install react | Tải về tên đó và các phụ thuộc của nó | node_modules có thêm thư mục |
| npm install | Tải cùng lúc mọi tên trong package.json | Toàn bộ node_modules được tạo ra |
| npm install reactttt | Tìm nhưng không thấy | 404 Not Found, không thêm gì cả |
Như dòng thứ ba, nếu cái tên gõ sai không có trong kho package thì không có gì được cài.
Nếu tên gõ sai lại tình cờ có thật thì một thứ khác sẽ được cài vào, nên bạn hãy chép tên từ trang chính thức.
Các package mà react cần, rồi các package mà những cái đó cần, đều tới cùng.
Việc bạn không phải tự tra ra từng cái rồi tải về lần lượt chính là lý do dùng công cụ quản lý package.
Tải về một package không có nghĩa là node_modules chỉ có một thư mục.
Kho package là một máy tính khác nằm bên kia Internet.
Chỗ duy nhất đặt package đã tải về là node_modules trong thư mục my-app.
app.js bạn viết sẽ gọi các package trong đó ra dùng.
Thứ bạn tải về sẽ vào node_modules
Thứ bạn tải về sẽ vào thư mục node_modules được tạo bên trong my-app.
app.js bạn tự viết không đổi, còn số thư mục nhiều hơn số bạn nêu tên là vì thứ mà package đã tải về cần cũng đi kèm theo.
package.json — file danh sách liệt kê tên các package bạn đã tải về
Nội dung node_modules là do npm tạo ra, bạn không tự sửa.
Thứ bạn quản lý chỉ là một file duy nhất liệt kê những cái tên đã tải về.
Đó là file danh sách (trong JavaScript là package.json. File ghi tên các package mà ứng dụng cần để chạy được), và từng cái tên liệt kê ở đó gọi là phụ thuộc (dependency. Package mà code của bạn cần để chạy được).
{
"name": "my-app",
"dependencies": {
"react": "^19.0.0",
"express": "^5.1.0"
}
}
Hai mục liệt kê dưới dependencies là các phụ thuộc của my-app này.
Phía bên phải là chỉ định phiên bản cần tải về; các con số ở đây chỉ để làm ví dụ, thực tế phiên bản tại thời điểm bạn tải sẽ được ghi vào.
Dấu ^ ở đầu là ký hiệu "cho phép cả những phiên bản mới tương thích với số đang ghi".
Ngoài phụ thuộc, package.json còn ghi vài thứ khác.
- Tên của chính ứng dụng này
- Ở đây ghi my-app
- Liệt kê tên các package cần để chạy
- npm install đọc phần này
- Tải react về thì thêm một dòng
- Chỗ đặt tên ngắn cho những lệnh bạn hay gõ
- Được gọi kiểu npm run start
Thứ npm install đọc là phần dependencies ở giữa.
Cùng một thứ nhưng có ba cách gọi, tùy bạn nhìn từ đâu.
Nhờ có file danh sách, bạn không phải đưa node_modules cho ai cả.
| Thứ đã đưa sang máy khác | Khi họ gõ npm install | my-app có chạy không |
|---|---|---|
| app.js và package.json | Tải về mọi tên trong danh sách | Có đủ đúng bộ đó và chạy được |
| Chỉ app.js | Không biết phải tải những tên nào | Lời gọi báo lỗi |
| app.js và node_modules | Không gõ thì nội dung vẫn có sẵn | Chạy được, nhưng phải đưa hàng trăm thư mục |
Thứ bạn đưa là app.js và package.json, còn người kia chỉ gõ npm install một lần.
npm chỉ đọc dependencies trong package.json, tải các tên liệt kê ở đó từ kho package về rồi dựng lại node_modules.
Bạn không cần đưa nguyên node_modules đi.
Chỉ cần danh sách tên là dựng lại được nội dung
package.json là file liệt kê tên các package mà my-app này cần để chạy được.
npm install đọc file này rồi tải cùng lúc mọi cái tên, nên node_modules lúc nào cũng dựng lại được và không cần đưa cho ai.
Python cũng vậy — pip và requirements.txt, môi trường ảo tách chỗ đặt package
Tới đây chúng ta đã xem bằng các tên của JavaScript.
Trong Python tên gọi khác đi, nhưng việc đang làm thì như nhau.
Thứ tải về là pip, còn file danh sách liệt kê tên là requirements.txt.
Vì vai trò như nhau nên khi đã nắm một bên, bạn đọc bên kia cũng theo đúng cách đó.
Chỉ một điều khác là chỗ đặt: nếu chưa tạo môi trường ảo thì pip sẽ cài vào cả máy tính.
Thứ bạn tạo ra để tránh điều này là môi trường ảo (virtual environment. Cơ chế tạo ra một thư mục làm chỗ đặt package riêng cho ứng dụng đó).
- node_modules — các phụ thuộc nằm trong này
- Ứng dụng khác không nhìn thấy
- Có node_modules riêng của nó
- Cùng tên nhưng khác phiên bản cũng không đụng nhau
- site-packages chỉ có một cho cả máy tính
- Ứng dụng khác đòi phiên bản khác thì đụng nhau
Khi thư mục tách riêng theo từng ứng dụng, các phiên bản khác nhau của cùng một tên nằm cạnh nhau mà không đụng nhau.
Các bản hướng dẫn bắt bạn tạo môi trường ảo trước tiên là để tạo ra chỗ tách đó.
Ngôn ngữ khác nhau, nhưng ba vai trò vẫn như nhau
Ngôn ngữ nào cũng có một chương trình tải về, một file danh sách liệt kê tên, và một chỗ chứa những thứ đã tải về.
Trong JavaScript đó là npm, package.json và node_modules; trong Python là pip và requirements.txt, và riêng Python thì nếu không tạo môi trường ảo, chỗ đặt sẽ là cả máy tính.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Khi chạy chính my-app đó trên một máy tính khác, vì sao bạn không cần đưa node_modules sang?
Câu 3Vì sao chỉ tải về một package mà node_modules lại có thể có nhiều hơn một thư mục?