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.
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:
- 9 tip tối ưu code Nodejs dành cho lập trình viên
- Xử lý ERROR trong NodeJS sao cho đúng?
- So sánh Golang và NodeJS: Nên chọn nền tảng nào cho dự án của bạn?
Xem thêm Việc làm IT hấp dẫn trên TopDev
- F Framework nào tốt nhất cho dự án của bạn? – Checklist chi tiết
- K Kinh nghiệm xử lý responsive table hiệu quả
- S Stackoverflow là gì? Bí kíp tận dụng Stack Overflow hiệu quả
- 7 7 kinh nghiệm hữu ích khi làm việc với GIT trong dự án
- B Bài tập Python từ cơ bản đến nâng cao (có lời giải)
- B Bảo mật API là gì? Một số nguyên tắc và kỹ thuật cần biết
- H Hướng dẫn cài đặt và tự học lập trình Python cơ bản từ A-Z
- C Chinh Phục Phân Tích Dữ Liệu Với Pandas Trong Python: Hướng Dẫn Từng Bước
- D Display CSS là gì? Cách khai báo và sử dụng thuộc tính display trong CSS
- C Compiler là gì? Công việc cụ thể của một trình biên dịch