NodeJS筆記
什么是 Node
Node.js? is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world. --選自:https://nodejs.org/en/
翻譯:
- Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境擦酌。
- Node.js 使用了一個事件驅(qū)動先口、非阻塞式 I/O 的模型,使其輕量又高效跳昼。
- Node.js 的包管理器 npm,是全球最大的開源庫生態(tài)系統(tǒng)
? --選自:http://nodejs.cn/
NodeJS 是一個構(gòu)建于Chrome V8 引擎之上的一個JavaScript的運(yùn)行時環(huán)境
Node 可以像瀏覽器一樣去解析和執(zhí)行JavaScript代碼
-
JavaScript 特點:
- 動態(tài)語言
- 預(yù)編譯
- 再執(zhí)行
- 編譯和執(zhí)行都在瀏覽器環(huán)境中完成
- JavaScript包括
- ECMAScript
- var
- if
- while
- function
- Date
- Math
- ....
- DOM
- document
- BOM
- window
- ECMAScript
- 通過編譯解析引擎解析和執(zhí)行JavaScript腳本代碼
- Chorme V8 引擎是所有瀏覽器里面解析和執(zhí)行js最快的
- JavaScript包括
- 動態(tài)語言
-
NodeJS特點:
- NodeJS 的作者將 Chrome 的 V8 引擎移植出來砸抛,作為NodeJS 的運(yùn)行時環(huán)境
- 在Node 中泪喊,沒有界面,沒有樣式(不需要再關(guān)心HTML搓萧、CSS)
- 又基于 V8 引擎構(gòu)建了一系列的API
- ECMASCript:
- var
- if
- while
- function
- Date
- Math
- ....
- 文件操作
- 網(wǎng)絡(luò)操作
- 讓JavaSCript代碼具有了服務(wù)器編程能力(使JavaScript代碼成為了服務(wù)器端代碼)
- ECMASCript:
- 事件驅(qū)動
- 非阻塞IO模型:大量的異步編程接口與
- ajax 一樣的 API 調(diào)用方式
- 異步:回調(diào)
- 跨平臺
- 單線程
- 輕量和高效
- Node.js 的包管理器 npm杂数,是全球最大的開源庫生態(tài)系統(tǒng)
- npm 是世界上最大的開源生態(tài)系統(tǒng)
- 在 npm 上發(fā)布的第三方包已經(jīng)接近 35 萬個之多
- 每個包只能解決單一問題,解決不了業(yè)務(wù)
Chrome V8引擎 瀏覽器內(nèi)核可以分為兩個部分瘸洛,即:渲染引擎和JS引擎揍移。 渲染引擎:負(fù)責(zé)對網(wǎng)頁語法的解釋(如HTML、JavaScript)并渲染網(wǎng)頁反肋。 所以那伐,通常所謂的瀏覽器內(nèi)核也就是瀏覽器所采用的渲染引擎,渲染引擎決定了瀏覽器如何顯示網(wǎng)頁的內(nèi)容以及頁面的格式信息石蔗。不同的瀏覽器內(nèi)核對網(wǎng)頁編寫語法 的解釋也有不同罕邀,因此同一網(wǎng)頁在不同的內(nèi)核的瀏覽器里的渲染(顯示)效果也可能不同,這也是網(wǎng)頁編寫者需要在不同內(nèi)核的瀏覽器中測試網(wǎng)頁顯示效果的原因养距。 JS引擎:解析 Javascript語言诉探,執(zhí)行 javascript語言來實現(xiàn)網(wǎng)頁的動態(tài)效果 Chrome V8引擎:作為一個 JavaScript 引擎,最初是服役于 Google Chrome 瀏覽器的棍厌。它隨著 Chrome 的第一版發(fā)布而發(fā)布以及開源∩隹瑁現(xiàn)在它除了 Chrome 瀏覽器,已經(jīng)有很多其他的使用者了耘纱。諸如 NodeJS敬肚、MongoDB、CouchDB 等束析。
為什么要學(xué)習(xí)NodeJS
- 打開服務(wù)器的黑盒子
- 滿足公司的招聘需求:需要具有一定的服務(wù)器開發(fā)經(jīng)驗
- 提供更廣闊的發(fā)展前景:如果是純粹的前端想要向高級前端發(fā)展艳馒,服務(wù)端就是瓶頸
- 成為全棧的必經(jīng)之路
Node 應(yīng)用場景
- 提供服務(wù)(Java , PHP , .Net , Python , Ruby 等服務(wù)器語言能做的Node都能做)
- 網(wǎng)站開發(fā),提供網(wǎng)站服務(wù)器
- 數(shù)據(jù)庫交互
- 移動應(yīng)用:后臺
- 網(wǎng)絡(luò)游戲:后臺
- CLI (Commond Line Interface)程序:
- git
- gulp
- hexo
- Node 具有開發(fā)命令行工具的能力
- webpack 打包構(gòu)建工具
- http-server 在終端中快速提供一個服務(wù)
- borwer-sync 提供服務(wù)员寇,提供瀏覽器自動刷新的能力
Node 的優(yōu)勢領(lǐng)域
-
對 IO 操作比較頻繁的操作
- 文件讀寫
- 和數(shù)據(jù)庫交互:網(wǎng)絡(luò)數(shù)據(jù)IO
-
實時通信
-
聊天軟件:微信鹰溜、QQ、直播
?
-
NodeJS 學(xué)習(xí)資源
- 《Node.js 權(quán)威指南》:官方API詳解:https://nodejs.org/dist/latest-v6.x/docs/api/
- JavaScript 標(biāo)準(zhǔn)參考教程(alpha): http://javascript.ruanyifeng.com/nodejs/fs.html
- Node 入門:http://www.nodebeginner.org/index-zh-cn.html
- 中文文檔(版本比較舊丁恭,湊合看):http://www.nodeclass.com/api/node.html
- CNODE社區(qū):http://cnodejs.org
- CNODE-新手入門:http://cnodejs.org/getstart
- Node.js包教不包會:https://github.com/alsotang/node-lessons
- 樸靈:《深入淺出Node.js》
NodeJS 安裝
- 使用NodeJS 安裝包安裝
- 安裝方法,見:安裝包--->直接安裝Node
- 使用 nvm 安裝和管理 Node
- 安裝方法斋日,見:安裝包--->使用nvm安裝
判斷Node 是否安裝成功的方法:
1.0 打開CMD
2.0 輸入 node + 回車
Node 中的組成
- 基本語法 ECMAScript
- var
- if
- while
- function
- Date
- Math
- console
- 定時器函數(shù)
- setTimeout clearTimeout
- setInterval clearInterval
- global
- ....
- 用戶自定義模塊
- 關(guān)鍵字:
- reuqire:
- 是一個函數(shù)牲览,可以在任何NodeJS腳本文件中使用
- 作用:就是用來加載模塊的(加載解析執(zhí)行JavaScript腳本文件)
- 注意:加載自定義模塊時一定要加上“./”,否則加載不出來
- module.exports:
- 每個模塊都會提供一個接口對象module.exports
- 作用:通過require加載可以得到模塊返回的module.exports對象(相當(dāng)于每個模塊最后面都會有一句:reutrn module.exports)
- 特點:
- 自己寫每個JS文件都是一個模塊
- 模塊天生就是一個私有的作用域
- 可能通過global設(shè)置全局變量(不建議)
- reuqire:
- 關(guān)鍵字:
- 第三方模塊(由社區(qū)/公司/個人提供:如果jquery)
- 所有第三方模塊用法都差不多:
- 通過npm 下載
- 通過require函引包
- 查看第三方包的 API 文檔(例如:moment)
- 所有第三方模塊用法都差不多:
- 核心模塊
- 核心模塊是由Node環(huán)境平臺本身提供的
- 以一個唯一核心 模塊標(biāo)識名稱進(jìn)行暴露
- 使用的時候直接通 “require” 進(jìn)行函數(shù)加載
- 如:文件操作模塊“fs”恶守,網(wǎng)絡(luò)操作模塊“http”
- 總結(jié):
- 將來我們會結(jié)合以上的功能去開發(fā) Node 應(yīng)用程序第献,這里先宏觀了解一下
- 模塊的加載機(jī)制,會隨著課程的深入再具體講解兔港。
path 環(huán)境變量
問題:為什么不管我們把文件放在哪個目錄下面庸毫,都可以在CMD中通過Node來運(yùn)行文件?
答案:環(huán)境變量衫樊。
- 什么是環(huán)境變量飒赃?
- 在CMD中利花,我們輸入一段字符時,系統(tǒng)會將字符當(dāng)作一個程序去當(dāng)前路徑下面去找對應(yīng)的程序载佳,如果有炒事,直接運(yùn)行
- 如果沒有,系統(tǒng)會去用戶變量對應(yīng)的路徑下去找程序蔫慧,如果能找到直接運(yùn)行
- 如果沒有挠乳, 系統(tǒng)會去系統(tǒng)變量對應(yīng)的路徑下去找程序,如果能找到姑躲,直接運(yùn)行
- 如果都沒有睡扬,報錯
- path變量特點:
- 由一個或者多個路徑組成,路徑之間以 英文分號 隔開
- 將來CMD會按照path中的路徑一個一個去找對應(yīng)的程序黍析,如果有就運(yùn)行卖怜,如果沒有就出錯
- 環(huán)境變量除了可以是直接放路徑以外,還可以通過用戶自己來創(chuàng)建一個變量橄仍,以: %變量名% 的形式添加到path中
常用核心模塊
NodeJS 版 hello word
1. 創(chuàng)建一個文件韧涨,后綴名改為:.js
2. 在文件中輸入 console.log("hello word");
3. 使用 node 打開文件:
方法一:通過 CMD 轉(zhuǎn)到文件所在的路徑下面:node + 文件名
方法二:直接找到文件所在目錄,在空白處:shift + 右鍵 ----> 在此外打開命令窗口 ----> 在cmd中輸入: node + 文件名
NodeJS 讀寫文件
? 讀文件:
var fs = require("fs");
fs.readFile("./01_hello word.js",function(err,data){
if (err) {
console.log("讀取出錯");
}
else {
console.log(data.toString());
}
});
? 寫文件:
var fs = require("fs");
fs.writeFile("./00selfbuild.js","這是我自己寫的內(nèi)容",function(err,data){
if (err) {
console.log("寫入文件失敗");
} else {
console.log("寫入完成");
}
});
NodeJS 開啟服務(wù)器
var http = require('http');
var server = http.createServer();
server.on('request', function(request, response) {
console.log('收到客戶端請求了');
response.write('<h1>hello word</h1>');
response.write('over');
response.end();
});
server.listen( 3000, function() {
console.log('服務(wù)器啟動成功');
});
構(gòu)建HTTP服務(wù)
-
編寫一個響應(yīng) “hello word” 服務(wù)
var http = require('http'); var server = http.createServer(); server.on('request', function(request, response) { console.log('收到客戶端請求了'); response.write('hello word'); response.end(); }); server.listen( 3000, function() { console.log('服務(wù)器啟動成功'); });
- 注意:
- 服務(wù)開啟之后除了 request 中的內(nèi)容會執(zhí)行多次以外侮繁,其它的代碼只會執(zhí)行一行
- 一個端口號只能被一個程序占用虑粥。
- 注意:
-
根據(jù)不同請求輸出不同響應(yīng)服務(wù)var http = require('http');
var server = http.createServer(); server.on('request', function(request, response) { var url = request.url; if ( url == '/') { response.end('home index'); } else if (url == '/a'){ response.end('aaa index'); } }); server.listen( 3000, function() { console.log('服務(wù)器啟動成功'); }); 注意: 所有請求都是以 “/” 開頭的
-
根據(jù)不同請求輸出不同文件服務(wù):
var http = require('http'); var fs = require('fs'); var server = http.createServer(); server.on('request', function( req, res){ var url = req.url; if (url == '/') { fs.readFile('./temp/index.html',function(err,data) { res.end(data); }); } else if ( url == '/a') { res.end('請求的是a'); } }); server.listen(3000,function() { console.log("服務(wù)器開啟成功"); });
- 注意:
- 可以通過自己寫的服務(wù)在不同的頁面中跳轉(zhuǎn),跳轉(zhuǎn)時可以不加ip和端口號
- 如果在自己的html頁面中添加一些css文件/圖片宪哩,那么將來服務(wù)是沒有辦法拿到css文件件/圖片的娩贷。
- 注意:
-
構(gòu)建一個類似于 Apache 的功能
var http = require('http'); var fs = require('fs'); var server = http.createServer(); server.on('request', function( req, res){ var url = req.url; var filePath = '.' + url; fs.readFile( filePath, function(err,data) { if (err) { res.end('404 Not Found') } else { res.end(data); } }); }); server.listen(3000,function() { console.log("服務(wù)器開啟成功"); });
- 注意:文件的命名不能以“/”開頭,否則服務(wù)器會去當(dāng)前文件處的磁盤根目錄去找到文件
?