初识apt-get 和 nvm
apt-get
是什么
在各个平台都有相关的包管理工具,比如ubuntu下面有apt-get,centos下面有yum,mac下面有brew等,它们都是安装软件的非常方便的利器,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统
如何使用 apt-get 安装 node
$ sudo apt-get install nodejs
$ sudo apt-get install npm
查看安装版本
1 . 查看 node 版本
$ node --version(node -v)
2 . 查看 npm 版本
$ npm --version(npm -v)
怎么使用node
- 进入node 环境
$ nodejs
或者
$ node
2 . 运行 js 文件,例如运行 hello.js
$ nodejs hello.js
或
$ node hello.js
nvm
是什么
nvm是一个开源的Node版本管理器,通过简单的bash脚本来管理、切换多个Node.js版本
如何使用 nvm 安装 node
- 首先我们需要安装 nvm
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
- 接下来查看一下node有哪些版本可以安装
$ nvm ls --remote
v6.1.0
v6.2.0
v6.2.1
v6.2.2
v6.3.0
....
- 下载所需要的 node 版本,比如说我们需要v6.3.0版本
$ nvm install v6.3.0
使用 nvm 切换 node 版本
- 查看当前已安装版本
$ nvm ls
-> v6.3.0
default -> v6.3.0
node -> stable (-> v6.3.0) (default)
stable -> 6.3 (-> v6.3.0) (default)
iojs -> N/A (default)
lts/* -> lts/argon (-> N/A)
lts/argon -> v4.6.0 (-> N/A)
- 例如要使用v4.4.5版本,首先安装该版本
$ nvm install v4.4.5
- 切换至该版本
$ nvm use v4.4.5
- 可设置默认版本
$ nvm alias default v6.3.0
个人建议
- 个人平时使用 node 时,习惯使用 node 命令,毕竟少输个 “js”,节省时间
- 安装 node 时,node 各个版本特性不同,对于Node.js这个版本帝而言,很多项目需要使用不同版本的 node开发机器上可能要同时存在几个Node.js的大版本,所以建议大家使用 nvm 方式安装 node
两种方式安装的具体差异
- 安装的版本
- apt-get
不是最新版本(在linux下默认源中没有node的程序),安装的版本有且只有一个 - nvm
可以供我们选择要安装的版本,并且则解决了多版本共存、切换问题,但在安装之前,请确认本机以前的安装包已经被卸载
- apt-get
安装目录(终端通过
whereis node
查看)apt-get
/usr/local/bin/nodenvm
/home/xxx/.nvm/versions/node/v6.3.0/bin/node
启动 node 时内部实现过程
在命令行启动node程序时,传入参数,node程序根据输入的命令参数,执行相应的处理流程。即:在node程序中会使用process.argv 获取命令行输入参数。Process.argv 是一个数组,用于存放从命令行传入的参数。其类似C语言main 函数中的char* argv[],假定我们在控制台输入 node argument.js –r arguments.js . 那么程序argument.js 启动后, process.argv 数组中就就存储了以下几个字符串信息:process.argv[0] = “node”, process.argv [1]= “argument.js”, process.argv [2] = “-r”,process.argv[3] = “argument.js”. 由于参数数组的前两个存储的是字符串”node”和源代码文件名,要想获得有效的输入参数,我们一般会从process.argv[2] 开始处理。
var args = {
'-h': displayHelp,
'-r': readFile
};
function displayHelp() {
console.log('Argument processor:', args);
}
function readFile(file) {
if (file && file.length) {
console.log('Reading:' ,file);
console.time('read');
var stream = require('fs').createReadStream(file);
stream.on('end', function() {
console.timeEnd('read');
});
stream.pipe(process.stdout);
}
else {
console.error('A file must be provided with the -r option');
process.exit(1);
}
}
if (process.argv.length > 0) {
process.argv.forEach(function(arg, index) {
if (arg === '-r' || arg === '-h') {
console.log(process.argv.slice(index + 1));
args[arg].apply(this, process.argv.slice(index+1));
}
});
}
args对象存储了对应参数要执行的对应函数,例如输入参数是 -r 那么执行readFile 函数, 如果输入参数-h 则执行displayHelp函数。readFile函数被调用时,传入的参数是要读取的文件名。通过Node 的文件系统模块 fs 所提供的接口调用createReadStream, 将指定文件名的文件内容读入形成输入流对象,然后再通过输入流对象的pipe函数,将输入流中的所有数据内容,重定向到标准输出,其实也就是输出到控制台
nvm 使用 node 切换版本内部实现原理
实现原理:在一个目录下存放多个版本的目录,在切换时候将相
应的版本路径加入PATH中,从而实现版本的切换,例如从v6.3.0 切换到v4.4.5具体流程如下
* 查看一下当前使用的node版本
$ node --version
v6.3.0
- 现在来看一下node 环境变量
$ echo $PATH
/home/guoru/.nvm/versions/node/v6.3.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
通过环境变量我们可以看出,现在使用的node 版本是 v6.3.0
* 使用nvm use v4.4.5 切换 版本,并且查看环境变量
$ nvm use v4.4.5
Now using node v4.4.5 (npm v2.15.5)
$ echo $PATH
/home/guoru/.nvm/versions/node/v4.4.5/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
可以看出环境变量已经将path 路径中的版本改为 v4.4.5版本了