Bài 2. Mô-đun, npm và package.json

Ứng dụng Node.js được chia thành mô-đun và dùng hàng triệu gói có sẵn trên npm. Bài này học ES Module và CommonJS, các mô-đun lõi, quản lý gói bằng npm, tệp package.json, scripts và lockfile.

45 phútCơ bản
Bạn sẽ học được
  • Viết và dùng ES Module (import/export)
  • Nhận biết CommonJS (require/module.exports)
  • Dùng mô-đun lõi node:fs, node:path, node:os
  • Quản lý gói: npm init, install, -D, scripts, npx, phiên bản semver

Một số khái niệm

Node.js hỗ trợ hai hệ mô-đun: ES Module (chuẩn của JavaScript, khuyên dùng) và CommonJS (cũ, vẫn gặp nhiều trong tài liệu). Đặt "type": "module" trong package.json để mọi tệp .js là ES Module. Mô-đun lõi nên ghi tiền tố node: để phân biệt với gói npm.

ES Module và CommonJS

// toan.js (ES Module)
export function tong(a, b) { return a + b; }
export const PI = 3.14159;
export default function chao(ten) { return 'Xin chào ' + ten; }

// app.js
import chao, { tong, PI } from './toan.js';
import { readFile } from 'node:fs/promises';
import path from 'node:path';
console.log(chao('An'), tong(2, 3), PI, path.join('a', 'b.txt'));
// CommonJS (cũ)
const fs = require('fs');
module.exports = { tong };

npm và package.json

npm init -y                  # tạo package.json
npm install express          # gói chạy ứng dụng (dependencies)
npm install -D nodemon eslint # gói chỉ dùng khi phát triển (devDependencies)
npm uninstall eslint
npm update                   # cập nhật trong phạm vi semver
npm outdated                 # xem gói cũ
npm audit                    # kiểm tra lỗ hổng bảo mật
npx cowsay "Xin chào"        # chạy công cụ không cần cài
{
  "name": "qlsv-api",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "dev": "node --watch --env-file=.env src/server.js",
    "start": "node src/server.js",
    "test": "node --test"
  },
  "dependencies": { "express": "^5.1.0" },
  "devDependencies": { "eslint": "^9.0.0" }
}
Ký hiệu phiên bảnÝ nghĩa
^5.1.0Chấp nhận 5.x.x mới hơn (không lên 6)
~5.1.0Chấp nhận 5.1.x
5.1.0Đúng phiên bản

Lockfile và node_modules

  • package-lock.json ghi chính xác phiên bản đã cài: commit lên Git để mọi người cài giống nhau.
  • node_modules/ rất lớn, tạo lại được bằng npm install (hoặc npm ci trên máy chủ): thêm vào .gitignore.
  • Trình quản lý gói khác: pnpm (nhanh, tiết kiệm ổ đĩa), yarn, bun.
Mẹo hay

Trước khi cài một gói lạ, xem số lượt tải tuần, ngày cập nhật gần nhất và kho mã nguồn trên npmjs.com để tránh gói bỏ hoang hoặc độc hại.

Lưu ý

Không trộn import và require trong cùng một tệp; dự án mới nên dùng thống nhất ES Module.

Thực hành
  1. Tạo dự án npm, viết mô-đun toan.js và dùng trong app.js.
  2. Cài gói dayjs, in ngày hôm nay dạng dd/mm/yyyy.
  3. Thêm script "dev" chạy với --watch.
  4. Chạy npm audit và đọc kết quả.
Tóm tắt bài học
  • ES Module: import/export, "type": "module".
  • Mô-đun lõi node:fs, node:path, node:os.
  • npm install, -D, scripts, npx; semver ^ ~.
  • Commit lockfile, bỏ qua node_modules.