npm是每一位前端工程师都必须具备技能,本文结合最新的npm v5讲解npm使用方法,因本人使用windows系统,而原作使用mac系统,所以在命令不同时,会特意提出。
node.js的可以直接去官网下载所需要的版本直接安装即可。对于Linux,也可以直接通过包管理器安装Node。
检查node的安装位置及版本,win中使用where
,linux和mac使用which
$ which node
/usr/bin/node
$ node --version
v6.10.3
为了证明node安装成功,需要进入node命令控制台试试:
$ node
> console.log('Node is running');
Node is running
> .help
.break Sometimes you get stuck, this gets you out
.clear Alias for .break
.exit Exit the repl
.help Show repl options
.load Load JS from a file into the REPL session
.save Save all evaluated commands in this REPL session to a file
> .exit
Node.js安装成功,就需要检查一下npm:
$ which npm
/usr/bin/npm
$ npm --version
3.10.10
npm可以在局部或全局范围内安装包,在局部范围内,包会安装到根目录下node_modules
文件夹下面,属于当前用户的。全局范围的包会安装在{prefix}/lib/node_modules/
下,{prefix}
通常是/usr/
或/usr/local
。
npm config
可以输出安装信息
$ npm config list
; cli configs
user-agent = "npm/3.10.10 node/v6.10.3 linux x64"
; userconfig /home/sitepoint/.npmrc
prefix = "/home/sitepoint/.node_modules_global"
; node bin location = /usr/bin/nodejs
; cwd = /home/sitepoint
; HOME = /home/sitepoint
; "npm config ls -l" to show all defaults.
获取当前全局下地址
$ npm config get prefix
/usr
想要更改这个prefix
,以至于以后安装到我们自定义的目录下,所以创建了新的文件夹
$ cd ~ && mkdir .node_modules_global
$ npm config set prefix=$HOME/.node_modules_global
上面代码已经更改了地址了,还需要在创建一个.npmrc
文件
$ npm config get prefix
/home/sitepoint/.node_modules_global
$ cat .npmrc
prefix=/home/sitepoint/.node_modules_global
因为我们更改了地址了,所以需要在更改后的地址下重新安装npm。
$ npm install npm --global
└─┬ npm@5.0.2
├── abbrev@1.1.0
├── ansi-regex@2.1.1
....
├── wrappy@1.0.2
└── write-file-atomic@2.1.0
最终,需要添加.node_modules_global/bin
到$PATH
环境变量下,以便在命令行下可以使用全局包,然后添加下面语句到.profile
、.bash_profile
或.bashrc
并重启终端(此操作针对mac和Linux系统)。
export PATH="$HOME/.node_modules_global/bin:$PATH"
现在能发现路径.node_modules_global/bin
,而且npm已经能使用
$ which npm
/home/sitepoint/.node_modules_global/bin/npm
$ npm --version
5.0.2
现在在全局路径下只有npm一个包,所以体验一下安装包的过程,下面我们安装压缩js的包UglifyJS
,使用--global
标签,也可以使用-g
。
$ npm install uglify-js --global
/home/sitepoint/.node_modules_global/bin/uglifyjs -> /home/sitepoint/.node_modules_global/lib/node_modules/uglify-js/bin/uglifyjs
+ uglify-js@3.0.15
added 4 packages in 5.836s
从结果可以看出,包已经安装完成
使用npm list
可以查看全局路径下的所有包
$ npm list --global
home/sitepoint/.node_modules_global/lib
├─┬ npm@5.0.2
│ ├── abbrev@1.1.0
│ ├── ansi-regex@2.1.1
│ ├── ansicolors@0.3.2
│ ├── ansistyles@0.1.3
....................
└─┬ uglify-js@3.0.15
├─┬ commander@2.9.0
│ └── graceful-readlink@1.0.1
└── source-map@0.5.6
也可以使用--depth=0
来缩短返回的结果
$ npm list -g --depth=0
/home/sitepoint/.node_modules_global/lib
├── npm@5.0.2
└── uglify-js@3.0.15
全局路径下的包在命令行中可以使用,
$ uglifyjs example.js -o example.min.js
在本地模式下安装,需要使用package.json
文件,所以先创建:
$ npm init
package name: (project)
version: (1.0.0)
description: Demo of package.json
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
一直敲击回车键,就可以创建package.json
文件在根目录下。
{
"name": "project",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
main
表示程序的入口文件,scripts
指定运行脚本命令缩写。如果想了解更多,可以去查阅package.json相关文档。
现在试着安装Underscore
包
$ npm install underscore
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN project@1.0.0 No description
npm WARN project@1.0.0 No repository field.
+ underscore@1.8.3
added 1 package in 0.344s
如果看一下package.json
,会发现dependencies
已经被添加
{
...
"dependencies": {
"underscore": "^1.8.3"
}
}
Underscore v1.8.3已结安装到项目中,版本号前的插入符号(^
)代表的是要安装不低于此版本的包,但是不能改变大版本号,上例可以安装2.0.0版本以下,但不能安装超过2.0.0版本(package.json还有其他符号,可以参考文档)。
需要注意在最新的npm中默认会把Underscore存为dependencies
域,这样作为程序运行必备的包。同时也可以指定--save-dev
,填入到devDependency
。devDependency
是用于开发时所需要的包。
也可以使用添加private:true
到package.json
,防止发布意外私有库,当运行npm install
防止错误发生。
使用package.json
为了让项目的依赖库可以移植到别处。例如,在你主机上运行别人代码,你需要在项目根目录运行npm i
,npm会解析并安装所需要的库,以便能运行app。
npm是包管理器,所以当然也能删除包。
$ npm uninstall underscore
removed 2 packages in 0.107s
$ npm list
project@1.0.0 /home/sitepoint/project
└── (empty)
现在我们可以安装我们所想要版本的包,使用@
加上版本号即可。
$ npm install underscore@1.8.2
+ underscore@1.8.2
added 1 package in 1.574s
$ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.8.2
首先先检查包是否有更新
$ npm outdated
Package Current Wanted Latest Location
underscore 1.8.2 1.8.3 1.8.3 project
Current
代表你已经安装的包版本,Latest
为最新的版本,Wanted
为在不破坏现有代码情况下,可以更新到的版本号。
npm v5中新增了package-lock.json
,其目的是确保在所有主机上安装同样的依赖库。无论是是在node_modules
目录或package.json
文件修改依赖树,都会自动记录下来。
可以删除node_modules
目录,然后再运行npm i
,依然会安装Underscore v1.8.2,早期的npm会安装到最新版,但是最新的v5版本npm却不会。这样就不用在像早期使用npm-shrinkewrap.json
来解决。
但是如果有了package-lock.json
,再运行npm shrinkwrap
,会把pakcage-lock.json
重命名为npm-shrinkewrap.json
,可以看出 把npm-shrinkwrap.json
作为了默认创建,这是因为为了向下兼容之前使用npm-shrinkwrap.json
的项目。
现在让我们更新包:
$ npm update underscore
+ underscore@1.8.3
updated 1 package in 0.236s
$ npm list
project@1.0.0 /home/sitepoint/project
└── underscore@1.8.3
也可以直接使用
npm update
更新多个已经过期的包
寻找包使用npm search
命令
$ npm search mkdir
NAME | DESCRIPTION | AUTHOR | DATE | VERSION
mkdir | Directory crea… | =joehewitt | 2012-04-17 | 0.0.2
fs-extra | fs-extra conta… | =jprichardson… | 2017-05-04 | 3.0.1
mkdirp | Recursively mkdir,… | =substack | 2015-05-14 | 0.5.1
...
首先安装一个新的包
$ npm install request
+ request@2.81.0
added 54 packages in 15.92s
检查package.json
文件
"dependencies": {
"mkdirp": "^0.5.1",
"request": "^2.81.0",
"underscore": "^1.8.2"
},
注意依赖树自动更新,之前的npm执行npm install request --save
才会存储到依赖中,如果不想存入到依赖中,则使用--no-save
删除node_modules
目录,模拟clone项目在别的主机上,然后执行npm install
$ rm -R node-modules
$ npm list
project@1.0.0 /home/sitepoint/project
├── UNMET DEPENDENCY mkdirp@^0.5.1
├── UNMET DEPENDENCY request@^2.81.0
└── UNMET DEPENDENCY underscore@^1.8.2
npm ERR! missing: mkdirp@^0.5.1, required by project@1.0.0
npm ERR! missing: request@^2.81.0, required by project@1.0.0
npm ERR! missing: underscore@^1.8.2, required by project@1.0.0
$ npm install
added 57 packages in 1.595s
npm安装包时会保存副本,这样下次再安装时,就不需要连网,缓存存储在默认用户目录下的.npm
文件夹(windows系统会存储在npm-cache文件夹)
$ ls ~/.npm
anonymous-cli-metrics.json _cacache _locks npm registry.npmjs.org
可以使用下面命令,偶尔清楚一下缓存:
$ npm cache clean
也可以一次安装多个包
$ npm i express momemt lodash mongoose body-parser webpack
如果想知道其余npm命令,可以运行npm help
版本管理器可以在一台主机上控制多个版本的node,比如n,nvm。
原文链接
npm 模块安装机制简介
npm5 新版功能特性解析及与 yarn 评测对比
package.json文件
package.json for NPM 文件详解
欢迎订阅掘金专栏和知乎专栏