走在前端的大道上javascript
本文记录本身 nodejs 学习过程当中的一些知识点html
最后更新时间 2018年1月18日前端
NVM——Node Version Manager(Node版本管理器),用它能够方便的在机器上安装并维护多个Node的版本。那么为何须要多个版本呢?场景有不少,比方说:你可能同时进行两个项目,而不一样项目所使用的node版本是不同的;又或者你要用更新的版本是作一些实验。java
有须要的同窗能够查看我以前总结的文章 Windows下安装 node 的版本控制工具 nvmnode
nrm就是npm registry manager 也就是npm的镜像源管理工具,有时候国外资源太慢,那么咱们能够用这个来切换镜像源。react
$ npm install -g nrm
用 nrm ls
能够查看咱们能够切换的地址webpack
$ nrm ls * npm ----- https://registry.npmjs.org/ cnpm ---- http://r.cnpmjs.org/ taobao - https://registry.npm.taobao.org/ nj ------ https://registry.nodejitsu.com/ rednpm - http://registry.mirror.cqupt.edu.cn skimdb - https://skimdb.npmjs.com/registry
提示:其中的*表明当前使用的地址web
切换shell
$ nrm use cnpm //switch registry to cnpm Registry has been set to: http://r.cnpmjs.org/
使用express
Usage: nrm [options] [command] Commands: ls List all the registries use <registry> Change registry to registry add <registry> <url> [home] Add one custom registry del <registry> Delete one custom registry home <registry> [browser] Open the homepage of registry with optional browser test [registry] Show the response time for one or all registries help Print this help Options: -h, --help output usage information -V, --version output the version number
Registries
npm-check-updates
能够将package.json
或bower.json
中的依赖项升级到最新版
安装
npm install -g npm-check-updates
使用
在当前目录中显示项目的全部新的依赖关系:
$ ncu
express 4.12.x → 4.13.x
multer ^0.1.8 → ^1.0.1
react-bootstrap ^0.22.6 → ^0.24.0
react-a11y ^0.1.1 → ^0.2.6
webpack ~1.9.10 → ~1.10.5
升级项目的包文件:
$ ncu -u express 4.12.x → 4.13.x
$ npm i -g npm
在初上手Node.js开发的时候,咱们要启动一个服务,使用的是 node 命令:
node myapp
然而,node告诉咱们,服务端的js代码只有在node第一次引用,才会从新加载;若是node已经加载了某个文件,即便咱们对它进行了修改, node也不会从新加载这个文件。
那么,在开发过程当中,要如何才能像PHP同样,修改某个文件后,直接刷新网页就能看到效果呢?
方法有不少,好比使用 Supervisor、pm二、forever 等来管理。
在开发过程当中,每次修改代码保存后,咱们都须要手动重启程序,才能查看改动的效果。使用 supervisor 能够解决这个繁琐的问题,全局安装 supervisor。这里注意一点的就是,supervisor必须安装到全局,若是你不安装到全局,错误命令会提示你安装到全局。
npm install -g supervisor
最经常使用、最快捷的方式,就是直接进入你的网站根目录,执行:
supervisor myapp
这里要说明的一点是,不论你的网站服务启动文件在什么位置,你必须在根目录启动它。
举个例子
Express4.0中,启动文件位于 ./bin/www 中,则咱们启动时,必须在 ./ 中执行:
supervisor bin/www
而不能进入 bin 目录执行: supervisor www。这样虽然有可能也能启动,但这么作至关于把 bin 目录看成了服务的根目录了,一旦有涉及到文件目录的操做,必定会出错的。
另外,执行完这个命令后,咱们的网站服务就已经启动了;不过,须要注意的是,这种方式启动的服务,是默认监控全部文件、文件夹的变化的;一旦有变化,服务就会重启
这样就出现了一些问题:咱们会将一些日志文件存入某些文件夹,或者用户会上传附件到服务器;而这样的操做都致使了服务器文件的变化,必然会引发node服务器的重启。试想一下,若是每一次上传都重启一次,那用户操做一旦频繁起来,服务器啥都不用干,天天重启就好了
因此说,supervisor
的这种工做方式,仅仅适用于调试阶段;甚至于有一些调试环境都不适合(好比调试服务器在远程,网络状态不是很好的状况下)。
3.使用方法
咱们在命令行中直接执行下边命令,会获得它的详细使用方法
supervisor
若是想不监控某一些文件夹,可使用 -i 参数。如:咱们要忽略根目录下的 private 文件夹,能够这样启动:
supervisor -i ./private myapp
若是要忽略多个文件夹,则用英文的逗号,分隔:
supervisor -i ./private,./otherdir myapp
当咱们的项目要部署到线上服务器时,不能单纯的靠 node index 或者 supervisor index 来启动了,由于咱们断掉 SSH 链接后服务就终止了,这时咱们就须要像 pm2 或者 forever 这样的进程管理器了。pm2 是 Node.js 下的生产环境进程管理工具,就是咱们常说的进程守护工具,能够用来在生产环境中进行自动重启、日志记录、错误预警等等。pm2官方文档
以 pm2 为例,全局安装 pm2:
首先须要安装pm2:
npm install -g pm2
运行:
pm2 start www.js
或者 修改 package.json中的start命令,而后运行 npm start 经过 pm2 启动程序
"scripts": { "start": "pm2 start ./bin/www" }
经常使用命令总结以下:
安装pm2 | npm install -g pm2 |
启动应用 | pm2 start app.js |
列出全部应用 | pm2 list |
查看资源消耗 | pm2 monit |
查看某一个应用状态 | pm2 describe [app id] |
查看全部日志 | pm2 logs |
重启应用 | pm2 restart [app id] |
中止应用 | pm2 stop [app id] |
开启api访问 | pm2 web |
本节参考文章:
1.pm2
2.详细版 | 用Supervisor守护你的Node.js进程
3.supervisor与pm2
本章节主要是学习 Node.js 概述 - 阮一峰 这本书的笔记,里边会结合本身掌握状况简化描述,也会在后续的学习中添加其余书中未提到的知识点。
安装略
$ node demo # 或者 $ node demo.js
使用-e参数,能够执行代码字符串。
$ node -e 'console.log("Hello World")' Hello World
在命令行键入node命令,后面没有文件名,就进入一个Node.js的REPL环境(Read–eval–print loop,”读取-求值-输出”循环),能够直接运行各类JavaScript命令。
$ node > 1+1 2 >
REPL是Node.js与用户互动的shell,各类基本的shell功能均可以在里面使用,好比使用上下方向键遍历曾经使用过的命令。
特殊变量下划线(_)表示上一个命令的返回结果。
> 1 + 1 2 > _ + 1 3
Node采用V8引擎处理JavaScript脚本,最大特色就是单线程运行,一次只能运行一个任务。这致使Node大量采用异步操做(asynchronous opertion),即任务不是立刻执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行。
因为这种特性,某一个任务的后续操做,每每采用回调函数(callback)的形式进行定义。
var isTrue = function(value, callback) { if (value === true) { callback(null, "Value was true."); } else { callback(new Error("Value is not true!")); } }
上面代码就把进一步的处理,交给回调函数callback。
Node约定,若是某个函数须要回调函数做为参数,则回调函数是最后一个参数。另外,回调函数自己的第一个参数,约定为上一步传入的错误对象。
var callback = function (error, value) { if (error) { return console.log(error); } console.log(value); }
上面代码中,callback的第一个参数是Error对象,第二个参数才是真正的数据参数。这是由于回调函数主要用于异步操做,当回调函数运行时,前期的操做早结束了,错误的执行栈早就不存在了,传统的错误捕捉机制try…catch对于异步操做行不通,因此只能把错误交给回调函数处理。
try { db.User.get(userId, function(err, user) { if(err) { throw err } // ... }) } catch(e) { console.log(‘Oh no!’); }
上面代码中,db.User.get方法是一个异步操做,等到抛出错误时,可能它所在的try…catch代码块早就运行结束了,这会致使错误没法被捕捉。因此,Node统一规定,一旦异步操做发生错误,就把错误对象传递到回调函数。
若是没有发生错误,回调函数的第一个参数就传入null。这种写法有一个很大的好处,就是说只要判断回调函数的第一个参数,就知道有没有出错,若是不是null,就确定出错了。另外,这样还能够层层传递错误。
if(err) { // 除了放过No Permission错误意外,其余错误传给下一个回调函数 if(!err.noPermission) { return next(err); } }
Node提供如下几个全局对象,它们是全部模块均可以调用的。
global:表示Node所在的全局环境,相似于浏览器的window对象。须要注意的是,若是在浏览器中声明一个全局变量,其实是声明了一个全局对象的属性,好比var x = 1等同于设置window.x = 1,可是Node不是这样,至少在模块中不是这样(REPL环境的行为与浏览器一致)。在模块文件中,声明var x = 1,该变量不是global对象的属性,global.x等于undefined。这是由于模块的全局变量都是该模块私有的,其余模块没法取到。process:该对象表示Node所处的当前进程,容许开发者与该进程互动。
console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。
Node还提供一些全局函数
setTimeout():用于在指定毫秒以后,运行回调函数。实际的调用间隔,还取决于系统因素。间隔的毫秒数在1毫秒到2,147,483,647毫秒(约24.8天)之间。若是超过这个范围,会被自动改成1毫秒。该方法返回一个整数,表明这个新建定时器的编号。
clearTimeout():用于终止一个setTimeout方法新建的定时器。
setInterval():用于每隔必定毫秒调用回调函数。因为系统因素,可能没法保证每次调用之间正好间隔指定的毫秒数,但只会多于这个间隔,而不会少于它。指定的毫秒数必须是1到2,147,483,647(大约24.8天)之间的整数,若是超过这个范围,会被自动改成1毫秒。该方法返回一个整数,表明这个新建定时器的编号。
clearInterval():终止一个用setInterval方法新建的定时器。
require():用于加载模块。
Buffer():用于操做二进制数据。
Node提供两个全局变量,都以两个下划线开头。
__filename:指向当前运行的脚本文件名。 __dirname:指向当前运行的脚本所在的目录。
除此以外,还有一些对象其实是模块内部的局部变量,指向的对象根据模块不一样而不一样,可是全部模块都适用,能够看做是伪全局变量,主要为module, module.exports, exports等。
安装 node-sass 的时候老是会各类不成功
正确姿式
在项目目录 执行
macOS 系统直接运行下面的命令便可:
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
windows下的同窗能够拆分红两个命令
set SASS_BINARY_SITE=https://npm.taobao.org/mirror... npm install node-sass