背景:因為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 - 關鍵字
(屬性轉自菜鳥教程)
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:針對文件進行讀寫等操作