背景:由於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 - 包名。html
-
version - 包的版本號。node
-
description - 包的描述。python
-
homepage - 包的官網 url 。nginx
-
author - 包的做者姓名。git
-
contributors - 包的其餘貢獻者姓名。web
-
dependencies - 依賴包列表。若是依賴包沒有安裝,npm 會自動將依賴包安裝在 node_module 目錄下。chrome
-
repository - 包代碼存放的地方的類型,能夠是 git 或 svn,git 可在 Github 上。express
-
main - main 字段是一個模塊ID,它是一個指向你程序的主要項目。就是說,若是你包的名字叫 express,而後用戶安裝它,而後require("express")。npm
-
keywords - 關鍵字
(屬性轉自菜鳥教程)
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:針對文件進行讀寫等操做