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.

Một dòng npm install react đặt những gì vào đâu
npm install reactnpm tải vềtừ kho packagenode_modules cóthêm một thư mụcpackage.json cóthêm một dòngapp.js khôngthay đổi
Dòng ở bên trái chuyển sang npm ở giữa, và kết quả để lại ở hai chỗ bên phải. app.js bạn tự viết không thay đổi.

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.

Hiển thị ngày tháng: tự viết so với tải về
Muốn hiển thịngày tháng dễ đọcTự viếtDùng packageViết hàng chục dòng,tự sửa lỗiChỉ định tên để tải về,gọi bằng một dòngCùng một hiển thịhiện trên màn hình
Từ trên xuống dưới, luồng tách làm hai rồi cuối cùng gộp lại về cùng một chỗ. Thứ khác nhau là lượng bạn phải viết, còn màn hình hiện ra thì như nhau.

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.

Những gì nằm trong một package tên là react
Package react
Tên
  • Chuỗi bạn chỉ định khi tải về
  • Xác định đúng một thứ trong kho package
Phiên bản
  • Mỗi lần sửa đổi lại thêm một số mới
  • Các số cũ vẫn còn đó
File mã nguồ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
Tên của các package khác mà nó cần
  • 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ề
Khung ngoài là một package, react. Thứ bạn chỉ định khi tải về là tên và phiên bản, còn các file bên trong đi kèm theo cùng.

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ề).

Bên trong my-app: thứ bạn viết và thứ npm tạo ra
my-app (thư mục của ứng dụng đặt chỗ)
File bạn tự viết
  • 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ề
node_modules (do npm tạo)
react
  • Mã nguồn của package đã tải về
  • Thứ bạn gọi chính là nội dung này
Các package mà thứ đã tải về cần tới
  • 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
Khung ngoài là thư mục my-app. Khung trên chứa các file bạn viết, khung dưới là thư mục do npm tạo và do npm sửa.

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 reactTải về tên đó và các phụ thuộc của nónode_modules có thêm thư mục
npm installTải cùng lúc mọi tên trong package.jsonToàn bộ node_modules được tạo ra
npm install reacttttTìm nhưng không thấy404 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.

Vì sao tải về một package lại làm tăng nhiều thư mục
npm install expressexpressCác package màexpress cầnCác package màchúng cầnCác package xahơn nữaHàng chục thư mụctrong node_modules
Luồng lan từ trên xuống dưới rồi cuối cùng gộp lại làm một. Thứ mà package đã tải về cần, rồi thứ mà những cái đó cần, đều đi kèm theo. Với package không cần gì như react, thư mục vẫn chỉ có một.

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.

Những gì được liệt kê trong package.json
package.json
name
  • Tên của chính ứng dụng này
  • Ở đây ghi my-app
dependencies
  • 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
scripts
  • Chỗ đặt tên ngắn cho những lệnh bạn hay gõ
  • Được gọi kiểu npm run start
Khung ngoài là một file package.json. Thứ npm install đọc là phần dependencies ở giữa.

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.

Cùng một thứ nhưng tên gọi đổi theo chỗ bạn nhìn
==Trong kho packagePackageĐược đặt kèmtên và phiên bảnTrong package.jsonPhụ thuộcLiệt kê như cái tênmy-app cần để chạyTrong app.jsThư viện bên ngoàiChương trình bạngọi ra để dùng
Bên trái là chỗ bạn đang nhìn, ở giữa là tên gọi tại đó, bên phải là cách nó được xử lý tại đó. Ba thứ nối bằng đường đôi là cùng một thứ.

Nhờ có file danh sách, bạn không phải đưa node_modules cho ai cả.

Thứ đã đưa sang máy khácKhi họ gõ npm installmy-app có chạy không
app.js và package.jsonTải về mọi tên trong danh sáchCó đủ đúng bộ đó và chạy được
Chỉ app.jsKhông biết phải tải những tên nàoLời gọi báo lỗi
app.js và node_modulesKhông gõ thì nội dung vẫn có sẵnChạ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ứ giữ cùng vai trò trong JavaScript và Python
===JavaScriptnpmpackage.jsonnode_modulesPythonpiprequirements.txtsite-packagesVai tròChỉ định tênđể tải vềLiệt kê sẵncác tên cần tảiChỗ chứa nhữngthứ đã tải về
Hàng trên là JavaScript, hàng giữa là tên bên Python, hàng dưới là vai trò. Hai thứ nối bằng đường đôi chỉ khác tên, còn vai trò 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 đó).

Chỗ đặt package, tách riêng theo từng ứng dụng
Máy tính của bạn
my-app (ứng dụng đặt chỗ)
  • node_modules — các phụ thuộc nằm trong này
  • Ứng dụng khác không nhìn thấy
other-app (một ứng dụng khác)
  • 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
Ứng dụng Python không tạo môi trường ảo
  • 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
Khung ngoài là máy tính của bạn. Hai mục trên có chỗ đặt package nằm trong thư mục của chính nó, chỉ mục dưới cùng dùng chung một chỗ cho cả máy tính.

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.

QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1Khi bạn gõ npm install react trong thư mục my-app, package tải về nằm ở đâu?

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?