在命令行键入node命令,后面没有文件名,就进入一个Node.js的REPL环境(Read–eval–print loop,”读取-求值-输出”循环),能够直接运行各类JavaScript命令。node
REPL是Node.js与用户互动的shell,各类基本的shell功能均可以在里面使用,好比使用上下方向键遍历曾经使用过的命令。shell
Node采用V8引擎处理JavaScript脚本,最大特色就是单线程运行,一次只能运行一个任务。这致使Node大量采用异步操做(asynchronous opertion),即任务不是立刻执行,而是插在任务队列的尾部,等到前面的任务运行完后再执行。npm
因为这种特性,某一个任务的后续操做,每每采用回调函数(callback)的形式进行定义。缓存
Node约定,若是某个函数须要回调函数做为参数,则回调函数是最后一个参数。另外,回调函数自己的第一个参数,约定为上一步传入的错误对象。服务器
这是由于回调函数主要用于异步操做,当回调函数运行时,前期的操做早结束了,错误的执行栈早就不存在了,传统的错误捕捉机制try…catch对于异步操做行不通,因此只能把错误交给回调函数处理。异步
若是没有发生错误,回调函数的第一个参数就传入null。这种写法有一个很大的好处,就是说只要判断回调函数的第一个参数,就知道有没有出错,若是不是null,就确定出错了。另外,这样还能够层层传递错误。async
Node提供两个全局变量,都以两个下划线开头。函数
__filename:指向当前运行的脚本文件名。工具
__dirname:指向当前运行的脚本所在的目录。oop
http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
核心模块老是最优先加载的。若是你本身写了一个HTTP模块,require('http')加载的仍是核心模块
全部代码都运行在模块做用域,不会污染全局做用域。
模块能够屡次加载,可是只会在第一次加载时运行一次,而后运行结果就被缓存了,之后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
模块加载的顺序,按照其在代码中出现的顺序。
require方法有一个main属性,能够用来判断模块是直接执行,仍是被调用执行。
直接执行的时候(node module.js),require.main属性指向模块自己。
require.main === module // true
调用执行的时候(经过require加载该脚本执行),上面的表达式返回false。
注意,从npm v2.6.1 开始,npm update只更新顶层模块,而不更新依赖的依赖,之前版本是递归更新的。若是想取到老版本的效果,要使用下面的命令。
$ npm --depth 9999 update