Cách sử dụng module Node.js với npm và package.json
Do các tính năng như hiệu suất Đầu vào / Đầu ra (I / O) nhanh chóng và cú pháp JavaScript nổi tiếng của nó, Node.js đã nhanh chóng trở thành một môi trường thời gian chạy phổ biến để phát triển web back-end. Nhưng khi sự quan tâm ngày càng tăng, các ứng dụng lớn hơn được xây dựng và việc quản lý độ phức tạp của codebase và các phụ thuộc của nó trở nên khó khăn hơn. Node.js tổ chức sự phức tạp này bằng cách sử dụng các module , là các file JavaScript đơn lẻ nào chứa các hàm hoặc đối tượng được dùng bởi các chương trình hoặc module khác. Một tập hợp của một hoặc nhiều module thường được gọi là một gói và các gói này được tổ chức bởi các trình quản lý gói. Trình quản lý gói Node.js (npm) là trình quản lý gói mặc định và phổ biến nhất trong hệ sinh thái Node.js và chủ yếu được sử dụng để cài đặt và quản lý các module  bên ngoài trong dự án Node.js. Nó cũng thường được sử dụng để cài đặt một loạt các công cụ CLI và chạy các tập lệnh dự án. npm theo dõi các module  được cài đặt trong một dự án bằng file  package.json , nằm trong folder  của dự án và chứa:
- Tất cả các module cần thiết cho một dự án và các version đã cài đặt của chúng
- Tất cả metadata cho một dự án, chẳng hạn như tác giả, giấy phép, v.v.
- Các tập lệnh có thể được chạy để tự động hóa các việc trong dự án
 Khi bạn tạo các dự án Node.js phức tạp hơn, việc quản lý metadata  và các phần phụ thuộc của bạn bằng file  package.json sẽ cung cấp cho bạn các bản dựng dễ đoán hơn, vì tất cả các phần phụ thuộc bên ngoài đều được giữ nguyên. Tệp sẽ tự động theo dõi thông tin này; trong khi bạn có thể thay đổi file  trực tiếp để cập nhật metadata  của dự án, bạn sẽ hiếm khi cần phải tương tác trực tiếp với file  đó để quản lý các module .
 Trong hướng dẫn này, bạn sẽ quản lý các gói bằng npm. Bước đầu tiên sẽ là tạo và hiểu file  package.json . Sau đó, bạn sẽ sử dụng nó để theo dõi tất cả các module  bạn cài đặt trong dự án  của bạn . Cuối cùng, bạn sẽ liệt kê các thành phần phụ thuộc vào gói, cập nhật gói,  gỡ gói cài đặt  và thực hiện kiểm tra để tìm ra các lỗi bảo mật trong gói của bạn.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Node.js được cài đặt trên máy phát triển của bạn. Hướng dẫn này sử dụng version 10.17.0. Để cài đặt phần mềm này trên macOS hoặc Ubuntu 18.04, hãy làm theo các bước trong Cách cài đặt Node.js và Tạo Môi trường Phát triển Cục bộ trên macOS hoặc phần Cài đặt Sử dụng PPA của Cách Cài đặt Node.js trên Ubuntu 18.04 . Bằng cách cài đặt Node.js, bạn cũng sẽ cài đặt npm; hướng dẫn này sử dụng version 6.11.3.
 Bước 1 - Tạo file  package.json
  Ta  bắt đầu hướng dẫn này bằng cách  cài đặt  dự án mẫu — module  locator Node.js hư cấu lấy địa chỉ IP của  user  và trả về quốc gia xuất xứ. Bạn sẽ không viết mã module  trong hướng dẫn này. Tuy nhiên, các gói bạn quản lý sẽ có liên quan nếu bạn đang phát triển nó.
 Đầu tiên, bạn sẽ tạo một file  package.json để lưu trữ metadata  hữu ích về dự án và giúp bạn quản lý các module  Node.js phụ thuộc của dự án.Như hậu tố gợi ý, đây là một file  JSON (JavaScript Object Notation). JSON là một định dạng chuẩn được sử dụng để chia sẻ, dựa trên các đối tượng JavaScript và bao gồm dữ liệu được lưu trữ dưới dạng các cặp key-value . Nếu bạn muốn tìm hiểu thêm về JSON, hãy đọc bài viết Giới thiệu về JSON của  ta .
 Vì file  package.json chứa nhiều thuộc tính nên việc tạo theo cách thủ công có thể phức tạp mà không cần  copy paste  mẫu từ nơi khác. Để làm cho mọi thứ dễ dàng hơn, npm cung cấp lệnh init . Đây là một lệnh tương tác hỏi bạn một loạt câu hỏi và tạo file  package.json dựa trên câu trả lời của bạn.
 Sử dụng lệnh init
 Đầu tiên, hãy  cài đặt  một dự án để bạn có thể thực hành quản lý các module . Trong shell của bạn, hãy tạo một folder  mới có tên là locator :
- mkdir locator 
Sau đó chuyển vào folder mới:
- cd locator 
Bây giờ, khởi tạo dấu nhắc tương tác bằng lệnh :
- npm init 
Lưu ý : Nếu mã của bạn sẽ sử dụng Git để kiểm soát version , hãy tạo repository  Git trước và sau đó chạy npm init . Lệnh tự động hiểu rằng nó nằm trong folder  hỗ trợ Git. Nếu điều khiển từ xa Git được đặt, nó sẽ tự động điền vào các trường repository , bugs và homepage cho file  package.json của bạn. Nếu bạn khởi tạo repo sau khi tạo file  package.json , bạn sẽ phải thêm thông tin này vào chính mình. Để biết thêm về điều khiển version  Git, hãy xem loạt bài Giới thiệu về Git: Cài đặt, Sử dụng và Chi nhánh của  ta .
Bạn sẽ nhận được kết quả sau:
OutputThis utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults.  See `npm help json` for definitive documentation on these fields and exactly what they do.  Use `npm install <pkg>` afterwards to install a package and save it as a dependency in the package.json file.  Press ^C at any time to quit. package name: (locator) Trước tiên, bạn sẽ  được yêu cầu  nhập name của dự án mới  của bạn . Theo mặc định, lệnh giả định đó là tên của folder  bạn đang ở. Các giá trị mặc định cho mỗi thuộc tính được hiển thị trong dấu ngoặc đơn () . Vì giá trị mặc định cho name sẽ hoạt động cho hướng dẫn này, hãy nhấn ENTER để chấp nhận nó.
 Giá trị tiếp theo cần nhập là version . Cùng với name , trường này là bắt buộc nếu dự án của bạn sẽ được chia sẻ với những người khác trong  repository  npm.
 Lưu ý: Các gói Node.js phải tuân theo hướng dẫn Lập phiên bản ngữ nghĩa (semver). Do đó, số đầu tiên sẽ là số version  MAJOR chỉ thay đổi khi API thay đổi. Số thứ hai sẽ là version  MINOR thay đổi khi các tính năng được thêm vào. Số cuối cùng sẽ là version  PATCH thay đổi khi sửa lỗi.
 Nhấn ENTER để version  mặc định được chấp nhận.
 Trường tiếp theo là description — một chuỗi hữu ích để giải thích module  Node.js của bạn làm gì. Dự án locator hư cấu của  ta  sẽ lấy địa chỉ IP của  user  và trả về quốc gia xuất xứ. Một description phù hợp sẽ là Finds the country of origin of the incoming request , vì vậy hãy nhập  thông tin như  thế này và nhấn ENTER . description rất hữu ích khi mọi người đang tìm kiếm module  của bạn.
  Dấu nhắc  sau sẽ yêu cầu bạn entry point . Nếu ai đó cài đặt và requires module  của bạn, những gì bạn đặt trong entry point sẽ là phần đầu tiên của chương trình của bạn được tải. Giá trị cần phải là vị trí tương đối của file  JavaScript và sẽ được thêm vào thuộc tính main của package.json . Nhấn ENTER để giữ giá trị mặc định.
 Lưu ý : Hầu hết các module  đều có index.js làm điểm nhập chính. Đây là giá trị mặc định cho một package.json 's main bất động sản, đó là điểm xuất phát cho module NPM. Nếu không có package.json , Node.js sẽ cố gắng tải index.js theo mặc định.
 Tiếp theo,  bạn cần  một test command , một tập lệnh thực thi hoặc lệnh để chạy các bài kiểm tra dự án của bạn. Trong nhiều module  Node.js phổ biến, các bài kiểm tra được viết và thực thi bằng Mocha , Jest , Jasmine hoặc các khung kiểm tra khác. Vì thử nghiệm nằm ngoài phạm vi của bài viết này, hãy để trống tùy chọn này ngay bây giờ và nhấn ENTER để tiếp tục.
 Sau đó, lệnh init sẽ yêu cầu Kho lưu trữ GitHub của dự án. Bạn sẽ không sử dụng nó trong ví dụ này, vì vậy hãy để trống nó.
 Sau dấu nhắc repository , lệnh yêu cầu các keywords . Thuộc tính này là một mảng các chuỗi với các thuật ngữ hữu ích mà mọi người có thể sử dụng để tìm repository  của bạn. Tốt nhất bạn nên có một  group  từ nhỏ thực sự liên quan đến dự án của bạn để việc tìm kiếm có thể được  nhắm đến  nhiều hơn. Liệt kê các từ khóa này dưới dạng một chuỗi với dấu phẩy phân tách từng giá trị. Đối với dự án mẫu này, hãy nhập ip,geo,country tại dấu nhắc. package.json đã hoàn thành sẽ có ba mục trong mảng cho keywords .
 Trường tiếp theo trong  dấu nhắc  là author . Điều này rất hữu ích cho những  user  module  của bạn muốn liên hệ với bạn.Ví dụ: nếu ai đó phát hiện ra một khai thác trong module  của bạn, họ có thể sử dụng điều này để báo cáo sự cố và nhờ đó bạn có thể khắc phục. Trường author là một chuỗi có định dạng sau: " Name \< Email \> ( Website )" . Ví dụ: "Sammy \<sammy@your_domain\> (https://your_domain)" là một tác giả hợp lệ. Dữ liệu email và trang web là tùy chọn — tác giả hợp lệ có thể chỉ là một cái tên. Thêm chi tiết liên hệ của bạn  với quyền  là tác giả và xác nhận với ENTER .
 Cuối cùng, bạn sẽ  được yêu cầu  về license . Điều này xác định các quyền và giới hạn  hợp lệ  mà  user  sẽ có khi sử dụng module  của bạn. Nhiều module  Node.js là open-souce , vì vậy npm đặt mặc định thành ISC .
  Đến đây,  bạn sẽ xem xét các tùy chọn cấp phép  của bạn  và quyết định điều gì tốt nhất cho dự án của bạn. Để biết thêm thông tin về các loại giấy phép nguồn mở khác nhau, hãy xem danh sách giấy phép này từ Sáng kiến Nguồn mở . Nếu bạn không muốn cung cấp giấy phép cho một kho riêng, bạn có thể nhập UNLICENSED tại dấu nhắc. Đối với mẫu này, hãy sử dụng giấy phép ISC mặc định và nhấn ENTER để kết thúc quá trình này.
 Lệnh init bây giờ sẽ hiển thị file  package.json mà nó sẽ tạo.  Nó trông giống như sau :
OutputAbout to write to /home/sammy/locator/package.json:  {   "name": "locator",   "version": "1.0.0",   "description": "Finds the country of origin of the incoming request",   "main": "index.js",   "scripts": {     "test": "echo \"Error: no test specified\" && exit 1"   },   "keywords": [     "ip",     "geo",     "country"   ],   "author": "Sammy <sammy@your_domain> (https://your_domain)",   "license": "ISC" }   Is this OK? (yes) Khi thông tin  trùng với  những gì bạn thấy ở đây, hãy nhấn ENTER để hoàn tất quá trình này và tạo file  package.json . Với file  này, bạn có thể ghi lại các module  bạn cài đặt cho dự án  của bạn .
  Đến đây bạn  đã có file  package.json  của bạn , bạn có thể thử cài đặt các module  trong bước tiếp theo.
Bước 2 - Cài đặt module
Việc sử dụng thư viện bên ngoài để thực hiện các việc backend trong các dự án là điều phổ biến trong phát triển phần mềm. Điều này cho phép nhà phát triển tập trung vào logic nghiệp vụ và tạo ứng dụng nhanh chóng và hiệu quả hơn.
 Ví dụ: nếu module  locator mẫu của  ta  phải thực hiện yêu cầu API bên ngoài để lấy dữ liệu địa lý,  ta  có thể sử dụng thư viện HTTP để thực hiện tác vụ đó dễ dàng hơn. Vì mục tiêu chính của  ta  là trả lại dữ liệu địa lý thích hợp cho  user ,  ta  có thể cài đặt một gói làm cho các yêu cầu HTTP dễ dàng hơn cho  ta  thay vì viết lại mã này cho chính mình, một nhiệm vụ nằm ngoài phạm vi dự án của  ta .
 Hãy chạy qua ví dụ này. Trong ứng dụng locator  của bạn , bạn sẽ sử dụng thư viện axios , thư viện này sẽ giúp bạn thực hiện các yêu cầu HTTP. Cài đặt nó  bằng lệnh  thông tin sau vào shell của bạn:
- npm install axios --save 
Bạn bắt đầu lệnh này với npm install , lệnh này sẽ cài đặt gói (để ngắn gọn, bạn có thể sử dụng npm i ). Sau đó, bạn liệt kê các gói mà bạn muốn cài đặt, được phân tách bằng dấu cách. Trong trường hợp này, đây là axios . Cuối cùng, bạn kết thúc lệnh với tham số --save tùy chọn, chỉ định rằng axios sẽ được lưu dưới dạng phụ thuộc dự án.
Khi thư viện được cài đặt, bạn sẽ thấy kết quả tương tự như sau:
Output... + axios@0.19.0 added 5 packages from 8 contributors and audited 5 packages in 0.764s found 0 vulnerabilities Bây giờ, hãy mở file  package.json , sử dụng editor  mà bạn chọn. Hướng dẫn này sẽ sử dụng nano :
- nano package.json 
Bạn sẽ thấy một thuộc tính mới, như được đánh dấu trong phần sau:
{   "name": "locator",   "version": "1.0.0",   "description": "Finds the country of origin of the incoming request",   "main": "index.js",   "scripts": {     "test": "echo \"Error: no test specified\" && exit 1"   },   "keywords": [     "ip",     "geo",     "country"   ],   "author": "Sammy sammy@your_domain (https://your_domain)",   "license": "ISC",   "dependencies": {     "axios": "^0.19.0"   } } Tùy chọn --save yêu cầu npm cập nhật package.json với module  và version  vừa được cài đặt. Điều này thật tuyệt vì các nhà phát triển khác đang làm việc trong các dự án của bạn có thể dễ dàng thấy được những phụ thuộc bên ngoài nào là cần thiết.
 Lưu ý : Bạn có thể nhận thấy ^ trước số version  cho phụ thuộc axios . Nhớ lại rằng lập version  ngữ nghĩa bao gồm ba chữ số: MAJOR , MINOR và PATCH . Ký hiệu ^ biểu thị rằng bất kỳ version  MINOR hoặc PATCH nào cao hơn sẽ đáp ứng ràng buộc version  này. Nếu bạn thấy ~ ở đầu số version , thì chỉ những version  PATCH cao hơn mới thỏa mãn ràng buộc.
 Khi bạn xem xong package.json , hãy thoát khỏi file .
Sự phụ thuộc phát triển
Các gói được sử dụng để phát triển một dự án nhưng không dùng để xây dựng hoặc chạy nó trong quá trình production được gọi là gói phụ thuộc phát triển . Chúng không cần thiết để module hoặc ứng dụng của bạn hoạt động trong quá trình production , nhưng có thể hữu ích trong khi viết mã.
Ví dụ: các nhà phát triển thường sử dụng các đoạn mã đảm bảo mã của họ tuân theo các phương pháp hay nhất và giữ phong cách nhất quán. Mặc dù điều này hữu ích cho sự phát triển, điều này chỉ làm tăng thêm kích thước của bản phân phối mà không mang lại lợi ích hữu hình khi triển khai trong production .
Cài đặt linter làm phụ thuộc phát triển cho dự án của bạn. Hãy thử điều này trong shell của bạn:
- npm i eslint@6.0.0 --save-dev 
Trong lệnh này, bạn đã sử dụng cờ --save-dev . Điều này sẽ tiết kiệm eslint như một phụ thuộc chỉ cần thiết để phát triển. Cũng  lưu ý  bạn đã thêm @6.0.0 vào tên người phụ thuộc  của bạn . Khi các module  được cập nhật, chúng được gắn thẻ với một version . @ npm biết để tìm một thẻ cụ thể của module  mà bạn đang cài đặt. Nếu không có thẻ được chỉ định, npm sẽ cài đặt version  được gắn thẻ mới nhất. Mở lại package.json :
- nano package.json 
Điều này sẽ hiển thị như sau:
{   "name": "locator",   "version": "1.0.0",   "description": "Finds the country of origin of the incoming request",   "main": "index.js",   "scripts": {     "test": "echo \"Error: no test specified\" && exit 1"   },   "keywords": [     "ip",     "geo",     "country"   ],   "author": "Sammy sammy@your_domain (https://your_domain)",   "license": "ISC",   "dependencies": {     "axios": "^0.19.0"   },   "devDependencies": {     "eslint": "^6.0.0"   } } eslint đã được lưu dưới dạng devDependencies , cùng với số version  bạn đã chỉ định trước đó. Thoát khỏi package.json .
 Tệp được tạo tự động: node_modules và package-lock.json
 Khi bạn lần đầu tiên cài đặt một gói vào dự án Node.js, npm tự động tạo folder  node_modules để lưu trữ các module  cần thiết cho dự án của bạn và file  package-lock.json mà bạn đã kiểm tra trước đó.
 Xác nhận chúng có trong folder  làm việc của bạn. Trong shell của bạn, nhập ls và nhấn ENTER . Bạn sẽ quan sát kết quả sau:
Outputnode_modules    package.json    package-lock.json Thư mục node_modules chứa mọi phụ thuộc được cài đặt cho dự án của bạn. Trong hầu hết các trường hợp, bạn không nên chuyển folder  này vào repository  được kiểm soát theo version   của bạn . Khi bạn cài đặt nhiều phụ thuộc hơn, kích thước của folder  này sẽ nhanh chóng tăng lên. Hơn nữa, file  package-lock.json lưu giữ bản ghi các version  chính xác được cài đặt theo cách ngắn gọn hơn, do đó, việc bao gồm node_modules là không cần thiết.
 Trong khi file  package.json liệt kê các phần phụ thuộc cho  ta  biết các version  phù hợp sẽ được cài đặt cho dự án, file  package-lock.json theo dõi tất cả các thay đổi trong package.json hoặc node_modules và cho  ta  biết version  chính xác của gói đã cài đặt . Bạn thường  commit  điều này với repository  được kiểm soát theo version  của bạn thay vì node_modules , vì đó là một bản trình bày rõ ràng hơn về tất cả các phụ thuộc của bạn.
Đang cài đặt từ package.json
 Với các file  package.json và package-lock.json , bạn có thể nhanh chóng  cài đặt  các phụ thuộc dự án giống nhau trước khi bắt đầu phát triển một dự án mới. Để chứng minh điều này, hãy di chuyển lên một cấp trong cây folder  của bạn và tạo một folder  mới có tên cloned_locator ở cùng cấp folder  với locator :
- cd .. 
- mkdir cloned_locator 
Chuyển vào folder mới của bạn:
- cd cloned_locator 
Bây giờ sao chép các file  package.json và package-lock.json từ locator sang cloned_locator :
- cp ../locator/package.json ../locator/package-lock.json . 
Để cài đặt các module cần thiết cho dự án này, hãy nhập:
- npm i 
npm sẽ kiểm tra file  package-lock.json để cài đặt các module . Nếu không có file  khóa nào khả dụng, nó sẽ đọc từ file  package.json để xác định cài đặt. Việc cài đặt từ package-lock.json thường nhanh hơn, vì file  khóa chứa version  chính xác của các module  và các phụ thuộc của chúng,  nghĩa là  npm không phải mất thời gian tìm ra version  phù hợp để cài đặt.
 Khi triển khai production , bạn  có thể cần  bỏ qua các phần phụ thuộc phát triển. Nhớ lại rằng các phần phụ thuộc phát triển được lưu trữ trong phần devDependencies của package.json và không ảnh hưởng đến việc chạy ứng dụng của bạn. Khi cài đặt các module  như một phần của quy trình CI / CD để triển khai ứng dụng của bạn, hãy bỏ qua các phần phụ thuộc của nhà phát triển  bằng lệnh: 
- npm i --production 
Cờ --production bỏ qua phần devDependencies trong khi cài đặt. Hiện tại, hãy gắn bó với quá trình phát triển của bạn.
 Trước khi chuyển sang phần tiếp theo, hãy quay lại folder  locator :
- cd ../locator 
Cài đặt global
  Lúc này,  bạn đã cài đặt các module  npm cho dự án locator . npm cũng cho phép bạn cài đặt các gói  trên phạm vi global  . Điều này  nghĩa là  gói có sẵn cho  user  của bạn trong hệ thống rộng hơn, giống như bất kỳ lệnh shell nào khác. Khả năng này hữu ích cho nhiều module  Node.js là công cụ CLI.
 Ví dụ: bạn  có thể cần  viết blog về dự án locator mà bạn hiện đang làm. Để làm như vậy, bạn có thể sử dụng một thư viện như Hexo để tạo và quản lý blog trang web tĩnh  của bạn . Cài đặt Hexo CLI  trên phạm vi global  như thế này:
- npm i hexo-cli -g 
Để cài đặt một gói  trên phạm vi global , bạn gắn cờ -g vào lệnh.
 Lưu ý : Nếu bạn gặp lỗi quyền khi cố gắng cài đặt gói này  trên phạm vi global , hệ thống của bạn có thể yêu cầu  quyền   user  cấp cao để chạy lệnh. Hãy thử lại với sudo npm i hexo-cli -g .
Kiểm tra xem gói đã được cài đặt thành công hay chưa bằng lệnh :
- hexo --version 
Bạn sẽ thấy kết quả tương tự như:
Outputhexo-cli: 2.0.0 os: Linux 4.15.0-64-generic linux x64 http_parser: 2.7.1 node: 10.14.0 v8: 7.6.303.29-node.16 uv: 1.31.0 zlib: 1.2.11 ares: 1.15.0 modules: 72 nghttp2: 1.39.2 openssl: 1.1.1c brotli: 1.0.7 napi: 4 llhttp: 1.1.4 icu: 64.2 unicode: 12.1 cldr: 35.1 tz: 2019a  Lúc này,  bạn đã học cách cài đặt module  với npm. Bạn có thể cài đặt các gói cho một dự án local , dưới dạng phụ thuộc production  hoặc phát triển. Bạn cũng có thể cài đặt các gói dựa trên các file  package.json hoặc package-lock.json , cho phép bạn phát triển với các phụ thuộc giống như các file  khác của bạn. Cuối cùng, bạn có thể sử dụng cờ -g để cài đặt các gói  trên phạm vi global , vì vậy bạn có thể truy cập chúng  dù  bạn có đang tham gia dự án Node.js hay không.
Đến đây bạn có thể cài đặt các module , trong phần tiếp theo bạn sẽ thực hành các kỹ thuật để quản trị các phần phụ thuộc của bạn .
Bước 3 - Quản lý module
Một trình quản lý gói hoàn chỉnh có thể làm được nhiều việc hơn là cài đặt các module . npm có sẵn hơn 20 lệnh liên quan đến quản lý phụ thuộc. Trong bước này, bạn sẽ:
- Liệt kê các module bạn đã cài đặt.
- Cập nhật module lên version mới hơn.
- Gỡ cài đặt các module bạn không cần nữa.
- Thực hiện kiểm tra bảo mật trên các module của bạn để tìm và sửa các lỗi bảo mật.
 Trong khi các ví dụ này sẽ được thực hiện trong folder  locator của bạn, tất cả các lệnh này có thể được chạy  trên phạm vi global  bằng cách thêm cờ -g vào cuối chúng, giống như bạn đã làm khi cài đặt  trên phạm vi global .
Mô-đun danh sách
 Nếu bạn muốn biết module  nào được cài đặt trong một dự án, sẽ dễ dàng hơn nếu bạn sử dụng list hoặc ls thay vì đọc trực tiếp package.json . Để thực hiện việc này, hãy nhập:
- npm ls 
Bạn sẽ thấy kết quả như thế này:
Output├─┬ axios@0.19.0 │ ├─┬ follow-redirects@1.5.10 │ │ └─┬ debug@3.1.0 │ │   └── ms@2.0.0 │ └── is-buffer@2.0.3 └─┬ eslint@6.0.0   ├─┬ @babel/code-frame@7.5.5   │ └─┬ @babel/highlight@7.5.0   │   ├── chalk@2.4.2 deduped   │   ├── esutils@2.0.3 deduped   │   └── js-tokens@4.0.0   ├─┬ ajv@6.10.2   │ ├── fast-deep-equal@2.0.1   │ ├── fast-json-stable-stringify@2.0.0   │ ├── json-schema-traverse@0.4.1   │ └─┬ uri-js@4.2.2 ... Theo mặc định, ls hiển thị toàn bộ cây phụ thuộc — các module  mà dự án của bạn phụ thuộc vào và các module  mà các phụ thuộc của bạn phụ thuộc vào. Điều này có thể hơi khó sử dụng nếu bạn muốn có một cái nhìn tổng quan cấp cao về những gì đã được cài đặt.
Để chỉ in các module bạn đã cài đặt mà không có phụ thuộc của chúng, hãy nhập thông tin sau vào shell của bạn:
- npm ls --depth 0 
Đầu ra của bạn sẽ là:
Output├── axios@0.19.0 └── eslint@6.0.0 Tùy chọn --depth cho phép bạn chỉ định mức độ của cây phụ thuộc mà bạn muốn xem. Khi nó là 0 , bạn chỉ thấy các phụ thuộc cấp cao nhất  của bạn .
Cập nhật module
 Đó là một thực tiễn tốt để giữ cho các module  npm của bạn được cập nhật. Điều này cải thiện khả năng bạn nhận được các bản sửa lỗi bảo mật mới nhất cho một module . Sử dụng lệnh outdated để kiểm tra xem có thể cập nhật bất kỳ module  nào không:
- npm outdated 
Bạn sẽ nhận được kết quả như sau:
OutputPackage  Current  Wanted  Latest  Location eslint     6.0.0   6.7.1   6.7.1  locator Lệnh này đầu tiên liệt kê Package đã được cài đặt và Phiên bản Current . Cột Wanted hiển thị version  nào đáp ứng yêu cầu version  của bạn trong package.json . Cột Latest hiển thị version  mới nhất của module  đã được xuất bản.
 Cột Location cho biết gói nằm ở đâu trong cây phụ thuộc. Lệnh outdated có cờ --depth như ls . Theo mặc định, độ sâu là 0.
 Có vẻ như bạn có thể cập nhật eslint lên version  mới hơn. Sử dụng lệnh update hoặc up như sau:
- npm up eslint 
Đầu ra của lệnh sẽ chứa version được cài đặt:
Outputnpm WARN locator@1.0.0 No repository field.  + eslint@6.7.1 added 7 packages from 3 contributors, removed 5 packages, updated 19 packages, moved 1 package and audited 184 packages in 5.818s found 0 vulnerabilities Nếu bạn muốn cập nhật tất cả các module cùng một lúc, thì bạn sẽ nhập:
- npm up 
Gỡ cài đặt module
 Lệnh uninstall npm có thể xóa các module  khỏi các dự án của bạn. Điều này  nghĩa là  module  sẽ không còn được cài đặt trong folder  node_modules , cũng như không thấy nó trong các file  package.json và package-lock.json .
Loại bỏ các phụ thuộc khỏi một dự án là một hoạt động bình thường trong vòng đời phát triển phần mềm. Phần phụ thuộc có thể không giải quyết được vấn đề như đã quảng cáo hoặc có thể không cung cấp trải nghiệm phát triển thỏa đáng. Trong những trường hợp này, tốt hơn bạn nên gỡ cài đặt phần phụ thuộc và xây dựng module của bạn .
 Hãy tưởng tượng rằng axios không cung cấp trải nghiệm phát triển mà bạn muốn thực hiện các yêu cầu HTTP. Gỡ bỏ axios với uninstall hoặc un lệnh  bằng lệnh :
- npm un axios 
Đầu ra của bạn sẽ tương tự như:
Outputnpm WARN locator@1.0.0 No repository field.  removed 5 packages and audited 176 packages in 1.488s found 0 vulnerabilities Nó không nói rõ ràng rằng axios đã bị loại bỏ. Để  xác minh  nó đã được gỡ cài đặt, hãy liệt kê các phần phụ thuộc   :
- npm ls --depth 0 
Bây giờ,  ta  chỉ thấy rằng eslint được cài đặt:
Output└── eslint@6.7.1 Điều này cho thấy rằng bạn đã  gỡ gói cài đặt  axios thành công.
Mô-đun kiểm toán
 npm cung cấp một lệnh audit để làm nổi bật các rủi ro bảo mật tiềm ẩn trong các phần phụ thuộc của bạn. Để xem hoạt động kiểm tra, hãy cài đặt version  lỗi thời của module  yêu cầu bằng cách chạy như sau:
- npm i request@2.60.0 
Khi bạn cài đặt version  request lỗi thời này, bạn sẽ nhận thấy  kết quả  tương tự như sau:
Output+ request@2.60.0 added 54 packages from 49 contributors and audited 243 packages in 7.26s found 6 moderate severity vulnerabilities   run `npm audit fix` to fix them, or `npm audit` for details npm cho bạn biết rằng bạn có lỗ hổng trong các phần phụ thuộc của bạn . Để biết thêm chi tiết, hãy kiểm tra toàn bộ dự án của bạn với:
- npm audit 
Lệnh audit hiển thị các bảng  kết quả  làm nổi bật các lỗi bảo mật:
Output                       === npm audit security report ===  # Run  npm install request@2.88.0  to resolve 1 vulnerability ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Moderate      │ Memory Exposure                                              │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package       │ tunnel-agent                                                 │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ request                                                      │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path          │ request > tunnel-agent                                       │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info     │ https://npmjs.com/advisories/598                             │ └───────────────┴──────────────────────────────────────────────────────────────┘  # Run  npm update request --depth 1  to resolve 1 vulnerability ┌───────────────┬──────────────────────────────────────────────────────────────┐ │ Moderate      │ Remote Memory Exposure                                       │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Package       │ request                                                      │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Dependency of │ request                                                      │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ Path          │ request                                                      │ ├───────────────┼──────────────────────────────────────────────────────────────┤ │ More info     │ https://npmjs.com/advisories/309                             │ └───────────────┴──────────────────────────────────────────────────────────────┘ ... Bạn có thể thấy đường dẫn của lỗ hổng và đôi khi npm đưa ra các cách để bạn sửa chữa nó. Bạn có thể chạy lệnh cập nhật theo đề xuất hoặc bạn có thể chạy lệnh audit con fix . Trong shell của bạn, hãy nhập:
- npm audit fix 
Bạn sẽ thấy kết quả tương tự như:
Output+ request@2.88.0 added 19 packages from 24 contributors, removed 32 packages and updated 12 packages in 6.223s fixed 2 of 6 vulnerabilities in 243 scanned packages   4 vulnerabilities required manual review and could not be updated npm có thể cập nhật hai trong số các gói một cách an toàn, giảm các lỗ hổng bảo mật của bạn xuống cùng một lượng. Tuy nhiên, bạn vẫn có bốn lỗ hổng trong phần phụ thuộc  của bạn . Không phải lúc nào lệnh audit fix cũng khắc phục được mọi vấn đề. Mặc dù một version  của module  có thể có lỗ hổng bảo mật, nhưng nếu bạn cập nhật nó lên version  có API khác thì nó có thể phá mã cao hơn trong cây phụ thuộc.
 Bạn có thể sử dụng tham số --force  đảm bảo  các lỗ hổng bảo mật đã biến mất, như sau:
- npm audit fix --force 
Như đã đề cập trước đây, điều này không được khuyến khích trừ khi bạn chắc chắn rằng nó sẽ không phá vỡ chức năng.
Kết luận
 Trong hướng dẫn này, bạn đã trải qua các bài tập khác nhau để chứng minh cách các module  Node.js được tổ chức thành các gói và cách các gói này được quản lý bởi npm. Trong một dự án Node.js, bạn đã sử dụng các gói npm làm phần phụ thuộc bằng cách tạo và duy trì file  package.json — một bản ghi metadata  của dự án của bạn, bao gồm những module  nào bạn đã cài đặt. Bạn cũng đã sử dụng công cụ npm CLI để cài đặt, cập nhật và loại bỏ module , ngoài việc liệt kê cây phụ thuộc cho các dự án của bạn và kiểm tra và cập nhật các module  đã lỗi thời.
Trong tương lai, việc tận dụng mã hiện có bằng cách sử dụng các module sẽ tăng tốc thời gian phát triển, vì bạn không phải lặp lại chức năng. Bạn cũng có thể tạo các module npm của riêng mình và những module này sẽ được người khác quản lý thông qua các lệnh npm. Đối với các bước tiếp theo, hãy thử nghiệm những gì bạn đã học được trong hướng dẫn này bằng cách cài đặt và thử nghiệm nhiều gói khác nhau. Xem những gì hệ sinh thái cung cấp để giúp giải quyết vấn đề dễ dàng hơn. Ví dụ: bạn có thể dùng thử TypeScript , một tập hợp siêu JavaScript hoặc biến trang web thành ứng dụng di động với Cordova . Nếu bạn muốn tìm hiểu thêm về Node.js, hãy xem các hướng dẫn Node.js khác của ta .
Các tin liên quan
 

