Thứ ba, 26/11/2019 | 00:00 GMT+7

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 :

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 , bugshomepage 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:

Output
This 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 :

Output
About 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:

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",   "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 , MINORPATCH . 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:

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",   "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_modulespackage-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:

Output
node_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.jsonpackage-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.jsonpackage-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ư:

Output
hexo-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:

Output
Package 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:

Output
npm 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.jsonpackage-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ư:

Output
npm 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 .


Tags:

Các tin liên quan