VPS

Node version manager: nhiều bản Node trên một máy

Thanh Nguyễn Đăng 9 phút đọc 6 khối lệnh

Node version manager: nhiều bản Node trên một máy
Mục lục bài viết
  1. Cài và dùng cơ bản
  2. Ghi phiên bản trong repo
  3. Tự đổi bản khi vào thư mục
  4. Trên máy chủ chạy dịch vụ thật
  5. Vài điều dễ vấp
  6. Ghi phiên bản trong dự án, việc quan trọng nhất
  7. Bảng cách cài trên máy chủ chạy thật
  8. Đổi phiên bản là mất gói cài toàn cục
  9. Câu hỏi thường gặp
  10. Bài viết liên quan

Trả lời nhanh: Node version manager cho phép cài nhiều bản Node trên cùng một máy và chuyển qua lại bằng một lệnh. Cần tới nó khi bạn có dự án cũ kẹt ở bản thấp còn dự án mới chạy bản cao. Ba việc đáng làm ngay: đặt file ghi phiên bản trong mỗi repo để cả đội dùng đúng bản, bật tự đổi bản theo thư mục để khỏi phải nhớ, và trên máy chủ chạy dịch vụ thật thì đừng phụ thuộc vào công cụ này mà hãy chỉ đường dẫn tuyệt đối.

Cảnh quen thuộc với người làm nhiều dự án: mở dự án cũ, chạy lệnh cài gói, và nhận về một lỗi khó hiểu chỉ vì bản Node trên máy quá mới. Trình quản lý phiên bản giải quyết dứt điểm, và nó là một trong những công cụ đáng cài đầu tiên trên máy làm việc.

Cài và dùng cơ bản

TerminalCài và dùng cơ bảnbash
# Cai cong cucurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash# Mo phien terminal moi de nap cau hinh # Cai va dung mot bannvm install 22nvm use 22 # Dat ban mac dinh cho moi phien moinvm alias default 22 # Xem cac ban dang convm ls

Sau khi cài, lệnh chạy Node sẽ trỏ tới bản đang chọn của phiên hiện tại. Mở phiên mới thì quay về bản mặc định, đây là điểm khiến người mới bối rối khi thấy bản khác với lúc nãy.

Về chọn bản: dùng bản hỗ trợ dài hạn cho dự án thật, số phiên bản chính là số chẵn. Bản lẻ dành cho thử nghiệm và ngừng hỗ trợ sớm, không nên dùng cho hệ thống chạy thật.

Ghi phiên bản trong repo

Đặt một file nhỏ ở gốc dự án ghi đúng bản cần dùng:

TerminalGhi phiên bản trong repobash
# .nvmrc22.11.0

Từ đó ai vào thư mục cũng chạy được một lệnh để chuyển sang đúng bản. Lợi ích thật nằm ở chỗ khác: bạn có một nguồn sự thật duy nhất về bản Node của dự án, và hệ thống tự động hóa cũng đọc được file này.

Ghi cả trong file mô tả gói để công cụ báo lỗi sớm nếu ai đó chạy bản sai:

File cấu hìnhGhi phiên bản trong repojson
{  "engines": { "node": ">=22 <23" }}

Hai chỗ này nên khớp nhau. Chúng cùng nói một điều nhưng phục vụ hai đối tượng: file thứ nhất cho công cụ quản lý phiên bản, file thứ hai cho trình quản lý gói và cho người đọc.

Tự đổi bản khi vào thư mục

Nhớ chạy lệnh chuyển bản mỗi lần vào dự án là việc kiểu gì cũng có lần quên. Thêm đoạn này vào cấu hình shell để nó tự làm:

TerminalTự đổi bản khi vào thư mụcbash
# Cuoi file .zshrc, tu doi ban Node khi vao thu muc co .nvmrcautoload -U add-zsh-hooktu_doi_node() {  if [ -f .nvmrc ]; then    nvm use --silent  fi}add-zsh-hook chpwd tu_doi_nodetu_doi_node

Đoạn cấu hình này nên nằm trong repo dotfiles theo bài dotfiles, và nó đi cùng bộ cấu hình shell trong bài Zsh và Oh My Zsh.

Một lưu ý về tốc độ: công cụ này làm phiên terminal mở chậm hơn một chút vì phải nạp thêm mã. Nếu bạn thấy khó chịu, có những lựa chọn thay thế viết bằng ngôn ngữ biên dịch, nhanh hơn hẳn và tương thích với cùng file ghi phiên bản.

Trên máy chủ chạy dịch vụ thật

Đây là chỗ nhiều người vấp. Trình quản lý phiên bản hoạt động bằng cách sửa biến đường dẫn của shell đăng nhập. Nhưng dịch vụ hệ thống không chạy qua shell đăng nhập của bạn, nên nó không thấy bản Node bạn đã chọn, và dịch vụ sẽ chạy bằng bản mặc định của hệ thống hoặc báo không tìm thấy lệnh.

Cách đúng là chỉ đường dẫn tuyệt đối trong file khai báo dịch vụ:

File cấu hìnhTrên máy chủ chạy dịch vụ thậttoml
[Service]ExecStart=/home/ung-dung/.nvm/versions/node/v22.11.0/bin/node /var/www/app/index.js

Cách khác gọn hơn cho máy chỉ chạy một ứng dụng: cài Node từ kho phần mềm chính thức của hệ điều hành, khỏi dùng trình quản lý phiên bản. Máy chủ thường chỉ chạy một bản nên tiện ích chuyển đổi không có giá trị gì, trong khi nó thêm một lớp có thể hỏng.

Nếu bạn dùng trình quản lý tiến trình như trong bài PM2, hãy kiểm tra nó đang gọi bản Node nào, vì đây là nguồn của những lỗi chỉ xảy ra sau khi máy chủ khởi động lại.

Vài điều dễ vấp

Gói cài toàn cục biến mất khi đổi bản. Mỗi bản Node có thư mục gói riêng, nên công cụ bạn cài toàn cục ở bản 20 sẽ không có ở bản 22. Có lệnh chép sang khi cài bản mới, hoặc đơn giản là hạn chế cài toàn cục và dùng cơ chế chạy gói tạm thời.

Thư mục node_modules không chuyển được giữa các bản. Nếu dự án có gói biên dịch mã máy, đổi bản Node rồi chạy sẽ lỗi. Cách chữa là xóa thư mục đó và cài lại.

Bản mặc định không phải bản của dự án. Mở phiên mới là quay về bản mặc định, nên nếu không bật tự đổi thì rất dễ chạy nhầm.

Nhầm với trình quản lý gói. Trình quản lý phiên bản lo bản Node, còn việc cài gói nhanh hay chậm là chuyện của trình quản lý gói, một chủ đề riêng trong cụm này.

Ghi phiên bản trong dự án, việc quan trọng nhất

TerminalGhi phiên bản trong dự án, việc quan trọng nhấtbash
# Tao mot file ghi phien ban ngay trong thu muc du annode -v > .nvmrc # Sau do bat cu ai vao du an cung dung dung ban donvm use          # tu doc file .nvmrc # Ghi ca trong file mo ta goi, de cong cu bao loi khi sai ban# trong package.json, them muc engines voi truong node# dat khoang phien ban duoc phep, vi du tu 20 den duoi 21 # Kiem may chu dang chay ban naonode -v && npm -vwhich node

Không ghi phiên bản vào dự án là nguyên nhân của tình huống chạy được trên máy tôi mà không chạy trên máy anh. Ghi một dòng vào tệp là hết chuyện, và đây là việc mất mười giây.

Bảng cách cài trên máy chủ chạy thật

CáchPhù hợpGhi chú
Công cụ quản lý nhiều phiên bảnMáy phát triển, máy chạy tác vụTiện khi cần đổi qua lại
Cài trực tiếp một phiên bản cố địnhMáy chạy dịch vụ thậtÍt thứ phải quản lý, ổn định hơn
Chạy trong containerCả haiPhiên bản khóa trong ảnh, dựng lại được

Lưu ý quan trọng với máy chủ: công cụ quản lý phiên bản thường nạp qua tệp cấu hình của phiên đăng nhập, nên tiến trình chạy nền do hệ thống khởi động sẽ không thấy nó và dùng nhầm phiên bản. Với dịch vụ chạy nền, hãy ghi đường dẫn tuyệt đối tới tệp thực thi trong khai báo dịch vụ.

Đổi phiên bản là mất gói cài toàn cục

  • Đổi phiên bản là mất các gói cài toàn cục, vì mỗi phiên bản có thư mục gói riêng. Phải cài lại.
  • Công cụ quản lý phiên bản làm phiên dòng lệnh mở chậm hơn. Nếu thấy chậm, dùng cơ chế nạp trễ.
  • Trên máy chạy tác vụ tự động, khai báo phiên bản rõ ràng trong tệp cấu hình quy trình, đừng dựa vào phiên bản mặc định của máy.
  • Xóa các phiên bản cũ không dùng, mỗi bản chiếm vài trăm megabyte.

Câu hỏi thường gặp

Có nên dùng trình quản lý phiên bản trên máy chủ không?

Với máy dùng để phát triển thì nên. Với máy chỉ chạy một dịch vụ thật thì không cần, cài thẳng bản cần dùng từ kho phần mềm chính thức sẽ ít thứ hỏng hơn.

Vì sao dịch vụ báo không tìm thấy lệnh node?

Vì dịch vụ hệ thống không chạy qua shell đăng nhập nên không thấy đường dẫn mà công cụ này thiết lập. Hãy ghi đường dẫn tuyệt đối tới file thực thi trong khai báo dịch vụ.

Nên dùng bản Node nào cho dự án thật?

Bản hỗ trợ dài hạn, tức bản có số chính là số chẵn. Bản lẻ ngừng hỗ trợ sớm nên không phù hợp cho hệ thống chạy thật, dù nó có tính năng mới sớm hơn.

Đổi bản Node có phải cài lại thư viện không?

Có, nếu dự án dùng gói cần biên dịch mã máy. Cách an toàn là xóa thư mục thư viện rồi cài lại sau khi đổi bản, thay vì ngồi đoán lỗi khó hiểu lúc chạy.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.