背景:因为appium是基于Node.js的,所以想看一下Node.js。但是发现很多资料的顺序看起来有点颠倒。然后就一面看资料一面整理了一下大概的知识点框架,希望对自己对别人有用。
本文不包含node.js的基本语法。node.js的基本语法和JavaScript基本一样,可以以后再单独整理一份基本语法的。
Node.js是一个基于chrome V8的JavaScript运行时的环境
Node.js是事件驱动,非阻塞式I/O模型
Node.js使用npm包管理器
使用Node.js不仅实现了一个应用,也实现了整个HTTP服务器,所以不需要单独搭建Apache或nginx
Node.js安装
mac下安装方法
brew install node
查看node.js的版本
node -v
查看包管理工具npm版本
npm -v
进入node.js的交互式解释器
node
交互式解释器和python的类似。可以输入命令实时查看输入结果
npm的使用
npm随着node一起被安装
npm允许用户从NPM服务器下载并安装第三方包,也允许将自己编写的包上传到第三方服务器,类似python的pip
npm安装命令
npm install 【包名】
安装的包放在工程目录的node_modeles目录下,例如mac上是在/usr/local/lib/node_modules文件夹下
安装好的包在代码中通过require("包名")来引用
安装的包模块的目录下有package.json,文件包含了包名、依赖包列表(npm安装时会将依赖表中的包自动安装)
Package.json 属性说明
- name - 包名。
- version - 包的版本号。
- description - 包的描述。
- homepage - 包的官网 url 。
- author - 包的作者姓名。
- contributors - 包的其他贡献者姓名。
- dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
- repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
- main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后require("express")。
- keywords - 关键字
http://www.runoob.com/nodejs/nodejs-npm.html
(属性转自菜鸟教程)
npm卸载命令
npm uninstall 【包名】
更新模块
npm update 【包名】
搜索模块
npm search【包名】
(从包管理中心搜索包含该关键词的包)
更改npm下载的地址为国内的仓库
有些包下载较慢,可以切换到国内的仓库
npm config list(查看npm的一些配置项)
npm config set registry cnpmjs.org(更改仓库为cnpmjs.org)
首次更改仓库后,会创建一个~/.npmrc文件,里面内容为“registry="https://registry.npm.taobao.org "”
如果想切回到原来的下载中心,可以将~/.npmrc中的registry注释掉或删掉。
Node.js引入其他模块
通过require()引入其他模块
引入npm下载的第三方模块
require("模块名")
引入本地某一路径下的模块(实际就是.js文件,引用时不需要后缀)
require("路径/模块名")
例如引入当前目录的hello.js模块:require("./hello")
Node.js的函数
Node.js中一个函数可以作为另一个函数接收参数,通过关键字function定义函数
定义方式:function 函数名(参数){要执行的内容}
function say(word){console.log(word)} \\定义一个名字为say的函数,参数为word
say("hi") \\调用函数say,并传递参数word为hi
在函数做为参数传递时,也可以定义一个匿名函数(不取函数名,直接function(参数){要执行的内容})直接传递给函数
function exe(name,value){name(value)} \\定义一个函数exe
exe(function(value){console.log(value)},"wow,see it!") \\执行exe()时,传递的第一个参数是一个匿名函数
Node.js的事件
Node.js是单进程单线程应用程序,通过事件和回调来支持并发(Node.js所有的API都通过回调实现了异步)
Node.js中所有事件都是用观察者模式实现的
Node.js中大部分的模块都继承自Event模块(Event模块是一个简单的事件监听器模式的实现)
Node.js可以通过引入events模块,并通过实例化EventEmitter类来绑定和监听事件。
绑定事件及事件的处理函数:eventEmitter.on("事件名字",函数) \\实际就是绑定给时间eventEmitter一个监听器
触发事件:eventEmitter.emit(“事件名字”)
例子如下:
var events=require("events")//导入events模块
var eventemitter=new events.EventEmitter()//实例化events的EventEmitter类
eventemitter.on("start",function(){console.log("hello world")})//注册一个事件,绑定打印hello world的事件,名字为start,实际start就是一个监听器
eventemitter.emit("start")//触发事件start
实际上on调用的是addListener(event,listener)。一个事件可以on多个监听器,emit执行时依次执行。
可以通过removerListener来移除一个监听器,监听器还有很多其他的方法。
类方法
Node.js的回调函数
Node的所有API都支持回调函数(也可以选择不使用回调函数),Node.js的异步是通过回调来实现的,非阻塞的I/O,大大提高了Node.js的性能
阻塞是按顺序执行的,必须执行完当前的代码才会进行下一个执行。而非阻塞是不需要按照顺序的,所以如果需要处理回调函数的参数,就需要写在回调函数内。
例如fs的读取函数readFile:
var fs=require("fs")
fs.readFile("test.txt",function(err,data){
if (err) return console.log(err)
console.log(data.toString())
})
Node的API回调函数的第一个参数都是捕获错误,第二个参数一般是正确的返回值
Node.js全局对象
全局对象:它及它的所有属性可以在程序的任何地方访问,不需要require导入
process:与当前进程互动,可以查看当前目录、进程等
console:用于输出
setTimeout :定时,用法【setTimeout(函数,毫秒单位的时间)】
还有很多其他的全局对象
Node.js的工具模块
Node.js模块库有很多很好用的模块,下面列举几个
os:返回当前系统的一些数据
path:对路径做的一些操作
http:可以创建web服务器对象等
fs:针对文件进行读写等操作