NVM là gì? Cách sử dụng và thủ thuật với Node Version Manager

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Điều khiến bạn cảm thấy “sợ hãi” khi làm việc với Node.js là gì? Đối với tôi, chắc đó là maintain một mã nguồn Node.js/JavaScript đời đầu, hay có nghĩa là một dự án đã được viết từ rất lâu trước đó, đang sử dụng một phiên bản Node rất thấp mới có thể chạy được.

Không có gì khó hiểu khi tôi hay thậm chí nhiều bạn đọc cũng có cảm giác tương tự. Có rất nhiều lý do để đưa ra như cú pháp lỗi thời, tổ chức mã không trật tự, thư viện bị ngừng hỗ trợ hoặc thậm chí là không còn tài liệu nữa… thử nghĩ mà xem, một thư viện mà ta chưa từng dùng trước đó bỗng nhiên không còn dấu vết của tài liệu nữa thì biết dựa vào đâu mà viết tiếp đây? Chưa kể khi gặp vấn đề trên một thư viện đã “archive” thì đúng là không còn ai để mà hỏi nữa.

Nhưng cuộc sống mà, chúng ta không thể nào lảng tránh mãi được, bảo trì thì vẫn cứ phải bảo trì, khổ một nỗi máy tôi đang sử dụng phiên bản Node 18 “hiện đại”, mà lại phải chạy một con “app” yêu cầu Node < 8 thì phải làm sao? Gỡ ra, cài lại rồi lại gỡ ra, cài lại… cứ thế khi muốn sử dụng một phiên bản khác? Đùa chứ tất nhiên là không cần phải làm như vậy rồi. Tôi cá là nhiều người đã biết đến công cụ nvm – Node Version Manager giúp dễ dàng chuyển qua lại các phiên bản Node khác nhau chỉ với một vài lệnh đơn giản.

Thật ra không chỉ có nvm mới làm được việc này, có nhiều công cụ giúp chúng ta quản lý phiên bản của Node như fnm hay asdf. Nhưng tùy vào sở thích của mỗi người mà họ tự chọn cho mình được cái thích hợp nhất. Ví dụ như tôi đang sử dụng nvm, và vì thế, ngày hôm nay, tôi xin phép chia sẻ một vài cách cũng như thủ thuật sử dụng nó.

NVM là gì?

NVM (Node Version Manager) là một công cụ giúp quản lý các phiên bản của Node.js trên máy tính của bạn. Nó cho phép bạn dễ dàng cài đặt, chuyển đổi và quản lý các phiên bản khác nhau của Node.js trên cùng một hệ thống. Điều này rất hữu ích khi bạn làm việc trên các dự án khác nhau yêu cầu các phiên bản Node.js khác nhau.

Cài đặt nvm rất đơn giản, nó hỗ trợ cả 3 nền tảng Mac, Linux và Windows. Ví dụ tôi đang dùng Mac và sử dụng luôn công cụ brew để cài đặt:

$ brew install nvm

Cũng cần lưu ý, phải thêm hai dòng cấu hình này vào ~/.profile hoặc ~/.zshrc nếu đang sử dụng zsh:

    export NVM_DIR="$HOME/.nvm"
    [ -s "$HOMEBREW_PREFIX/opt/nvm/nvm.sh" ] && \. "$HOMEBREW_PREFIX/opt/nvm/nvm.sh" # This loads nvm
    [ -s "$HOMEBREW_PREFIX/opt/nvm/etc/bash_completion.d/nvm" ] && \. "$HOMEBREW_PREFIX/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion

Hoặc nếu bạn dùng Linux:

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash

Còn Windows? Hơi khác một chút, chúng ta cần tải và cài đặt tại nvm-windows.

  NodeJS version manager: Quản lý đa phiên bản NodeJS trên máy tính

  7 sai lầm thường gặp khi học Nodejs

Cách sử dụng và thủ thuật

Tư tưởng sử dụng nvm cũng rất đơn giản, “install version -> switch version -> run”.

# tải về version 18
$ nvm install 18

# xem danh sách version đã cài
$ nvm ls
       v16.18.1
->     v18.17.1

# chọn phiên bản 16
$ nvm use 16

# chạy
$ node index.js

Ngay sau khi chọn phiên bản 16, phiên Terminal này được áp dụng cho Node 16, bạn có thể start các ứng dụng Node/JavaScript với phiên bản đã chọn.

Khi kết thúc phiên, chẳng hạn như tắt Terminal, lúc này Node sẽ trở về phiên bản mặc định, nếu muốn sử dụng lại Node 16, chúng ta cần gõ lại lệnh nvm use 16. Điều đó khá bất tiện và mất thời gian, để xem nvm đang sử dụng phiên bản nào là mặc định:

$ nvm alias default
default -> 18 (-> v18.17.1)

Như trên nó đang chọn 18 làm mặc định, nếu muốn chuyển sang 16, gõ:

$ nvm alias default 16
$ nvm alias default
default -> 16 (-> v16.18.1)

Tuy vậy, tôi đang có cỡ chục dự án, và mỗi dự án yêu cầu một phiên bản Node khác nhau, vậy sao mà tôi có thể nhớ chính xác hay chí ít là thông báo cho người khác biết nữa? Rất đơn giản, hãy tạo một tệp .nvmrc ngay trong thư mục gốc của dự án. Ví dụ:

$ echo "16" > .nvmrc

Lệnh trên tạo một file .nvmrc chứa con số 16. .nvmrc như một file cấu hình của nvm để cho mọi người biết phiên bản Node khuyến khích sử dụng trong dự án này là bao nhiêu. Sau đó chỉ cần gõ:

$ nvm use

Ngay lập tức nvm sẽ chuyển sang 16.

Chà, cũng thú vị đấy nhưng thế thì lại mất công gõ lệnh use mỗi khi mở dự án ra à? Àh…Ừm… dĩ nhiên là có cách để không phải gõ thủ công rồi. Chúng ta sẽ thêm một lệnh tự động phát hiện và sử dụng use một cách tự động.

Ví dụ, tôi đang dùng zsh, mở file ~/.zshrc ra và thêm vào dòng này xuống cuối cùng:

$ vi ~/.zshrc
autoload -U add-zsh-hook

load-nvmrc() {
  local nvmrc_path
  nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version
    nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
      nvm use
    fi
  elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}

add-zsh-hook chpwd load-nvmrc
load-nvmrc

Lưu lại và cập nhật cấu hình:

$ source ~/.zshrc

Nếu bạn đọc không sử dụng zsh, có thể tham khảo thêm các cách khác tại Deeper Shell Integration.

Bây giờ hãy thử tắt đi mở lại VSCode và bật Terminal in-app lên xem Node đã tự động chuyển sang phiên bản cài đặt trong .nvmrc chưa.

Cuối cùng là một lưu ý về việc debug, nếu như bạn đã quen với phương pháp debug bằng break point. Có thể Text Editor hoặc IDE không biết được phiên bản Node mà bạn đang muốn sử dụng để chạy debug là bao nhiêu. Tùy vào công cụ mà bạn sử dụng có thể sẽ có cách cấu hình phiên bản Node ở đâu đó, nhưng với VSCode thì hiện tại tôi không thấy có. Vì thế, đơn giản nhất là thiết lập phiên bản mặc định cho Node bằng lệnh alias, tắt đi bật lại VSCode là được.

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev