NPM¶
-
Overview
-
Install/remove library package
-
Package version constrains & package.lock
Overview¶
-
npm - Node Package Manager
là một công cụ quản lý các library, package cho NodeJs. -
npx
là một công cụ giúp bạn execute các package từ npm registry một cách đơn giản và nhanh chóng.
-
nvm
là mộtpackage tool
quản lý cácversion
của Nodejs. -
Package
là:- a) Một thư mục chứa chương trình được mô tả bằng tệp
package.json
- b) Một
tarball gzipped
chứa (a) - c) Một url phân giải thành (b)
- d) Một
<name>@<version>
được xuất bản trênnpm registry
với © - e) Một
<name>@<tag>
trỏ đến (d) - f) Một
<name>
giống (e), default tag làlatest
- g) Một
<git remote url>
phân giải thành (a)
- a) Một thư mục chứa chương trình được mô tả bằng tệp
npm components and use case¶
-
npm
bao gồm ba thành phần riêng biệt:- npm website: dùng để discover packages, thiết lập profiles cá nhân hay tổ chức để quản lý quyền truy cập vào các public/private packages.
- npm Command Line Interface: nơi các dev tương tác với npm
- npm registry: public database cho
JavaScript software
vàmeta-information
của npm.
-
Sử dụng
npm
trong các trường hợp cần:- Quản lý packages cho NodeJS app
- Tải xuống đúng cách các
standalone tools
- Run packages mà không cần download bằng
npx
.
npm vs yarn¶
-
Một vài thiếu sót của npm:
-
Queued install
: npm down các dependencies từ registry của nó theo cơ chế queue (FIFO), tốn nhiều thời gian. -
Single registry
: Có duy nhất 1 npm registry. -
Security
: npm cho phép các packages chạy code trong quá trình download. -
Offline
: Không hỗ trợ cài đặt offline -
Conflict
giữa các version của packages, dependencies. Có thể khắc phục bằngnpm shrinkwrap
để tạo lockfilenpm-shrinkwrap.json
→ chỉ update version khi tồn tại lock file.
-
-
yarn
- Yet Another Resource Negotiator -Node Package Manager
, có thể coi là CLI client hỗ trợ việc down các dependencies:-
Cho phép download các package từ NpmJS hoặc Bower
-
Download các dependencies song song với nhau, không chờ đợi như npm.
-
Nếu đã cài 1 package trước đó,
yarn
sẽ tạo một clone trong bộ nhớ cached để hỗ trợ việc cài đặt offline. -
lock
chính xác duy nhất một version của packages đã cài vào fileyarn.lock
→ luôn tạo và updateyarn.lock
-
-
npm
vs.yarn
:-
Installation procedure:
npm
được cài đặt chung vớiNode
cònyarn
được cài bằngyarnpkg
hoặcnpm
với command: -
The lock file
-
Output log:
-
npm
: Log hếtstack trace
của các câu lệnhnpm
→ Log dài, đọc mệt. -
yarn
:clean
, ngắn gọn và trình bày theo kiểu tree → đọc log dễ hiểu và dễ phân biệt
-
-
Installing global dependencies:
npm
:yarn
:
→ Cú pháp commands thay đổi khi xài
yarn
so vớinpm
, vẫn có vàicommands same
-
The ‘why’ command:
npm
chưa tích hợp tính năng "why".yarn
đi kèm với một lệnh "why" cho biết lý do tại sao có một dependency trong dự án.
-
Fetching packages:
npm
: fetch các dependencies từnpm registry
trong mỗi lầnnpm install
.yarn
: lưu trữ locally các dependenciesc và fetch từ local trong mỗi lầnyarn add
.
-
Install/remove library package¶
-
scope
: Tất cả cácpackage
đều có name, ngoài ra một số có thêmscope
.scope
kèm trong tênpackage
:
-scope
là một cách nhóm cácpackage
có liên quan lại với nhau, có thể gom lại chung 1 scope:Local install
(default)): tải package vào folder./node_modules
tại root. Cần dùng khi mìnhrequire()
hayimport()
package vô project của mình. -
Global install
(with-g
) : tải package vào/usr/local
hoặc bất cứ nơi nào Node được cài đặt. Dùng khi mình cần run cái package bằng command line.
Install a package¶
npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <alias>@npm:<name>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>
aliases: npm i, npm add
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional|--save-peer] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]
Lệnh này cài đặt một package
và được quản lý bởi: npm-cowrap.json
, package-lock.json
hoặc yarn.lock
.
Description¶
folder
npm install <folder>
: Cài đặt package dựa trên thư mục chứa package đó.
tarball file
npm install <tarball file>
: Cài đặt package dựa trêntarball file
:.tar
,.tar.gz
, hoặc.tgz
. Ví dụ:npm install <tarball url>
: tương tự như trên nhưng là link tới url của file tarball file để down về
scope
npm install [<@scope>/]<name>
: Cài package theo scope và tên package, version và tag mặc định làlatest
npm install [<@scope>/]<name>@<tag>
vànpm install [<@scope>/]<name>@<version>
: Tương tự trên, nhưng down chính xác tag hay version của package
alias
npm install <alias>@npm:<name>
: alias là biệt danh của package, được named trong dự án từ những package củanpm registry
tuân theo validate-npm-package-name. Ví dụ:
npm install my-react@npm:react
npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3
npm install npa@npm:npm-package-arg
npm install <git remote url>
: Cài đặt package từ git bằnggit remote url
, syntax củagit remote url
:
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
Ví dụ:
npm install git+ssh://git@github.com:npm/cli.git#v1.0.27
npm install git+ssh://git@github.com:npm/cli#pull/273
npm install git+ssh://git@github.com:npm/cli#semver:^5.0
npm install git+https://isaacs@github.com/npm/cli.git
npm install git://github.com/npm/cli.git#v1.0.27
GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/cli.git
- Đơn giản hơn, có thể dùng
npm install <githubname>/<githubrepo>[#<commit-ish>]
hoặcnpm install github:<githubname>/<githubrepo>[#<commit-ish>]
. Ví dụ:
- Ngoài ra, ta có thể tải package với git bằng id của commit theo kiểu
npm install gist:[<githubname>/]<gistID>[#<commit-ish>|#semver:<semver>]
hoặc bằng gitlabnpm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]
, bitbucketnpm install bitbucket:<bitbucketname>/<bitbucketrepo>[#<commit-ish>]
Configuration¶
Xem full tại: using-npm/config, dưới đây là 3 Configuration phổ biến nhất:
save
:- Default: true
- Type: boolean
Lưu các packages
đã cài đặt vào package.json
dưới dạng json object dependencies
. Được sử dụng để lưu packages cần thiết để ứng dụng chạy.
save-dev
:- Default: false
- Type: boolean
Lưu các packages
đã cài đặt vào package.json
dưới dạng json object devDependencies
. Được sử dụng để lưu packages cho mục đích phát triển.
global
- Default: false
- Type: Boolean
Cài các package ở global
thay vì local
Remove a package¶
npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]
aliases: remove, rm, r, un, unlink
-
Thao tác này sẽ gỡ cài đặt package, xóa luôn các objects:
dependencies
,devDependencies
,optionalDependencies
, vàpeerDependencies
trongpackage.json
,npm-shrinkwrap.json
vàpackage-lock.json
. -
Có thể sử dụng Configuration:
no-save
để ngăn việc npm xóa các json object trên.
Package version constrains & package.lock¶
-
npm
đưa ra một số ràng buộc vềPackage version
, gọi là semantic versioning rules (? - V6, V7, npm V8 đọc docs ko thấy) mà bất cứ NodeJS Dev nào cũng should know. Mỗi khipackage
có các cập nhật quan trọng, thì nên xuất bản phiên bản mới củapackage
,Package version
được cập nhật trong tệppackage.json
. Việc đặtPackage version
tuân theosemantic versioning rules
giúp các ông dev khác - user của cáipackage
hiểu được mức độ thay đổi trong một phiên bản nhất định củapackage
và điều chỉnh mã của riêng ổng nếu cần. -
semantic versioning rules
cơ bản:First release
:1.0.0
Patch release
:1.0.1
Minor release
:1.1.0
Major release
:2.0.0
version specificity
:
Value | Description |
---|---|
~version |
Approximately equivalent to version, cách tính: npm semver - Tilde Ranges |
^version |
Compatible with version, cách tính: npm semver - Caret Ranges |
version |
version cụ thể |
>version hoặc >=version |
version thấp nhất |
<version hoặc <=version |
version cao nhất |
1.2.x |
version từ 1.2.0 tới 1.2.9 |
* |
version nào cũng hảo |
latest |
latest release |
-
package-lock.json
được tạo tự động từ npm ^5.x.x với mục đích theo dõi chính xácPackage version
của mọi package được cài đặt để nodejs app có thể tái tạo lại chính xác 100%node_modules
. -
package-lock.json
giải quyết một vấn đề rất cụ thể màpackage.json
chưa được giải quyết được: Trongpackage.json
, ta có thể đặtPackage version
sử dụngsemantic versioning rules
, từ đó dẫn tới trường hợp Cài đặt các dependencies từ cùng một file package.json nhưng lại dẫn đến 2 phiên bản cài đặt khác nhau.
"express": {
"version": "4.15.4",
"resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz",
"integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=",
"requires": {
"accepts": "1.3.3",
"array-flatten": "1.1.1",
"content-disposition": "0.5.2",
"content-type": "1.0.2",
"cookie": "0.3.1",
"cookie-signature": "1.0.6",
"debug": "2.6.8",
"depd": "1.1.1",
"encodeurl": "1.0.1",
"escape-html": "1.0.3",
"etag": "1.8.0",
"finalhandler": "1.0.4",
"fresh": "0.5.0",
"merge-descriptors": "1.0.1",
"methods": "1.1.2",
"on-finished": "2.3.0",
"parseurl": "1.3.1",
"path-to-regexp": "0.1.7",
"proxy-addr": "1.1.5",
"qs": "6.5.0",
"range-parser": "1.2.0",
"send": "0.15.4",
"serve-static": "1.12.4",
"setprototypeof": "1.0.3",
"statuses": "1.3.1",
"type-is": "1.6.15",
"utils-merge": "1.0.0",
"vary": "1.1.1"
}
},
→ package-lock.json chỉ định rõ version
, location
, mã băm integrity
cho mỗi module và từng dependencies
của nó, từ đó giúp cho việc clone của node_modules
được tạo ra sẽ luôn giống nhau cho dù ta cài đặt nodejs app vào bất cứ lúc nào.