147.Node.js學習筆記(一)2018.11.27
阿新 • • 發佈:2018-12-13
1. Node.js介紹
1.1 Node.js是什麼
Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
- Node.js不是一門語言
- Node.js不是庫、不是框架
- Node.js是一個JavaScript執行時環境
- 簡單點來講就是Node.js可以解析和執行JavaScript程式碼
- 以前只有瀏覽器可以解析執行JavaScript程式碼
- 也就是說現在的JavaScript可以完全脫離瀏覽器來執行,一切都歸功於:Node.js
-
瀏覽器中的JavaScript
- ECMAScript
- 基本的語法
- if
- var
- function
- Object
- Array
- BOM
- DOM
Node.js中的JavaScript
- 沒有BOM、DOM
- ECMASCRIPT
- 在Node這個JavaScript執行環境中為JavaScript提供了一些伺服器級別的操作API
- 檔案讀寫
- 網路服務的構建
- 網路通訊
- http伺服器
- 等處理…
Node.js是構建與 Chrome的V8引擎的JavaScript 執行環境
- 程式碼只是具有特定格式的字串而已
- 引擎可以認識它,引擎可以幫你去解析和執行
- Google Chrome 的V8引擎是目前公認的解析執行JavaScript程式碼最快的
- Node.js的作者把Google Chrome中的V8引擎移植了出來,開發了一個獨立的JavaScript執行時環境。
Node.js uses an event-driven,non-blocking I/O model that makes it lightweight and efficient.
- event-driven 事件驅動
- non-blocking I/O model 非阻塞IO模型(非同步)
- lightweight and efficient 輕量和高效
Nodejs package ecosystem,npm,is the largest ecosystem of open source libraries in the world.
- npm 是世界上最大的開源生態系統
- 絕大多數JavaScript相關的包都放在了Npm上,這樣做的目的是讓開發人員更方便的去下載使用。
- npm install jquery
1.2 Node.js能做什麼?
Web 伺服器後臺
命令列工具
- npm(node)
- git(c語言)
- hexo(node)
- webpack
對於前端開發工程師來將,接觸node最多的是它的命令列工具
自己寫的很少,主要是使用別人第三方開發的
- webpack
- gulp
- npm
1.3 預備知識
- HTML
- CSS
- JavaScript
- 簡單的命令列工具
- cd
- dir
- ls
- mkdir
- rm
- 具有服務端開發經驗更佳
- java
- php
1.4 學習資源
- 《深入淺出Node.js》
- 《Node.js權威指南》
- JavaScript標準參考教材:阮一峰
- Node入門
- 官方API文件
- 中文文件(版本比較舊,湊合看)
- CNODE社群: http://cnodejs.org
- CNODE-新手入門:
1.5 這門課能學到什麼?
B/S程式設計模型
- Browse-Server
- back-end
- 任何服務端技術這種BS程式設計模型都是一樣的,和語言無關
- Node只是作為我們學習BS程式設計的一個工具而已
模組化程式設計
- RequireJS
- SeaJS
- 在Node中可以像
@import()
一樣來引用載入JavaScript指令碼檔案
Node常用API
- 非同步程式設計
- 回撥函式
- Promise
- async
- generator
- Express Web 開發框架
- ECMAScript 6
- ……
- 學習Node不僅會幫助開啟伺服器端黑盒子,同時會幫助學習以後前端高階內容
- Vue.js
- React
- Angular
2. 起步
2.1 安裝
- 檢視當前Node環境版本號
- 下載:https://nodejs.org/en/download/
- 安裝:
- 傻瓜式的一路
next
就可以了 - 對於已經安裝過的,重新安裝就會升級、
- 傻瓜式的一路
- 確認Node環境是否安裝成功
- 開啟命令列,輸入
node --version
- 或者
node -v
- 開啟命令列,輸入
- 環境變數
修改完程式碼自動重啟
nodemon是一個基於Node.js開發的一個第三方命令列工具,我們使用的時候需要獨立安裝:
npm install --global nodemon
安裝完畢之後,使用:
node app.js
#使用nodemon
nodemon app.js
只要是通過 nodemon app.js啟動的服務,則它會監視你的檔案變化,當檔案發生變化的時候,自然幫你重啟伺服器。
2.2 hello world
- 建立編寫JavaScript指令碼檔案,helloworld.js
- 開啟終端,定位到指令碼檔案所屬目錄,cd 目錄名
- 輸入
node 檔名
執行對應的檔案 - ps: 檔名不要使用
node.js
來命名,而且最好不要使用中文來命名。 - 解析執行JavaScript
- 讀寫檔案
- http
補充:
瀏覽器中的JavaScript是沒有檔案操作的能力的
但是,Node中的JavaScript具有檔案的操作能力
響應內容只能是二進位制資料或者字串
- 數字
- 物件
- 陣列
- 布林值
上述,均可轉換成二進位制或者字串(通過JSON.stringify()方法)
2.3 檔案讀取
// 瀏覽器中的JavaScript是沒有檔案操作的能力的
// 但是Node中的JavaScript具有檔案操作的能力
// fs是file-system的簡寫,就是檔案系統的意思
// 在Node中如果想要進行檔案操作,就必須引入fs這個模組
// 在fs這個核心模組中,就提供了所有的檔案操作現相關的API
// 例如: fs.readFile就是用來讀取檔案的
// 1. 使用require方法載入fs核心模組
var fs = require('fs');
// 2. 讀取檔案 第一個引數就是要讀取的檔案路徑
// 第二個引數是一個回撥函式
// error 讀取失敗,error就是錯誤物件,讀取成功,error就是null
// data 如果讀取成功,data就是讀取到的資料 讀取失敗,error就是錯誤物件
fs.readFile('./data/hello.txt', function(error,data){
// 檔案中儲存的其實就是二進位制資料 0 1
// 這裡為什麼看到的不是0和1呢?原因是二進位制轉為16進位制了
// 但是無論是二進位制還是16進位制,人類都不認識
// 所以我們可以通過toString方法把其轉為我們能認識的字元
if(err){
console.log('讀取檔案失敗');
}else{
console.log(data.toString());
});
}
2.4 檔案寫入
var fs = require('fs');
// 第一個引數:檔案路徑
// 第二個引數:檔案內容
// 第三個引數:回撥函式
fs.writeFile('./data/writeFile.txt','大家好,我是寫入的內容',function(error){
if(error){
console.log('寫入失敗了');
}else{
console.log('檔案寫入成功');
}
});
2.5 http
// 使用Node非常輕鬆的構建一個web伺服器
// 在Node中專門提供了一個核心模組,http
// http這個模組職責就是幫助建立編寫伺服器的
// 1. 載入http核心模組
var http = require('http');
// 2. 使用http.createServer()方法建立一個web伺服器
// 返回一個Server例項
var server = http.createServer();
// 3. 伺服器作用? 提供服務:資料服務
// 瀏覽器發請求——接收請求——處理請求——給個反饋(傳送響應)——註冊request請求事件
// 當客戶端請求過來,就會自動觸發服務武器的request請求事件,然後執行第二個引數:回撥處理
server.on('request',function(){
console.log('收到客戶端的請求了');
});
// 4. 繫結埠號,啟動伺服器
server.listen(8888,function(){
console.log('伺服器啟動成功了,可以通過http://127.0.0.1:3000/ 來進行訪問');
});`
// 使用Node非常輕鬆的構建一個web伺服器
// 在Node中專門提供了一個核心模組,http
// http這個模組職責就是幫助建立編寫伺服器的
// 1. 載入http核心模組
var http = require('http');
// 2. 使用http.createServer()方法建立一個web伺服器
// 返回一個Server例項
var server = http.createServer();
// 3. 伺服器作用? 提供服務:資料服務
// 瀏覽器發請求——接收請求——處理請求——給個反饋(傳送響應)——註冊request請求事件
// 當客戶端請求過來,就會自動觸發服務武器的request請求事件,然後執行第二個引數:回撥處理
server.on('request',function(){
console.log('收到客戶端的請求了');
});
// 4. 繫結埠號,啟動伺服器
server.listen(8888,function(){
console.log('伺服器啟動成功了,可以通過http://127.0.0.1:3000/ 來進行訪問');
});
2.6 http案例
var http = require('http');
// 1. 建立Server
var server = http.createServer();
// 2. 監聽request請求事件,設定請求處理函式
server.on('request',function(req,res){
// console.log('收到請求了,請求的路徑是:'+ req.url);
// res.write('hello world');
// res.end();
// 上面的方式比較麻煩,推薦使用更簡單的方式,直接end的同時
//res.end('hello node.js');
// 根據不同的請求路徑傳送不同的響應結果
// 1. 獲取請求的路徑
// req.url 獲取到的是埠號之後的那一部分路徑
// 也就是說所有的url都是以 / 開頭的
// 2. 判斷路徑處理響應
var url = req.url;
/*switch (url) {
case '/':
res.end('index page');
break;
case '/login':
res.end('login page');
break;
default:
res.end('404 not fund page');
break;
}*/
if(url === '/products'){
var products = [
{
name: '蘋果',
price: 2222
},
{
name: '栗子',
price: 3333
},
{
name: '桃子',
price: 4444
}
]
res.end(JSON.stringify(products));
}
});
// 3. 繫結埠號,啟動服務
server.listen(8000,function(){
console.log('伺服器啟動成功,可以訪問了!');
});
3. Node中的JavaScript
- ECMAScript
- 沒有DOM、BOM
- 核心模組
- 第三方模組
- 使用者自定義模組
3.1 核心模組
- Node為JavaScript提供了很多伺服器級別的API,這些API就大多數都被包裝到了一個 具名的核心模組中了。
- 例如:
- 檔案操作的
fs
核心模組 - http服務構建的
http
模組 path
路徑操作模組os
作業系統資訊模組- …
- 檔案操作的
- 以後只要模組是一個核心模組,就要如下使用它:
var fs = require('fs');
var http = require('http');
Node中,模組有三種:
- 具名的核心模組,例如:fs,http
- 使用者自己編寫的檔案模組(相對路徑必須加./)
在Node中,沒有全域性作用域,只有模組作用域
- 外部訪問不到內部
- 內部也訪問不到外部
require方法有兩個作用:
- 載入檔案模組並執行裡面的程式碼
- 拿到被載入檔案模組匯出的介面物件
- export 預設是一個空物件
3.2 使用者自定義模組
- require
- exports
3.3 第三方模組
4. Web伺服器開發
4.1 IP地址和埠號
- 所有聯網的程式都需要進行網路通訊
- 計算機中只有一個物理網絡卡,而且同一個區域網中,網絡卡的地址必須是唯一的。
- 網絡卡是通過唯一的IP地址來進行定位的。
- IP地址用來定位計算機
- 埠號用來定位具體的應用程式(所有需要聯網通訊的軟體都必須具有埠號)
- 一切需要聯網通訊的軟體都會佔用一個埠號
- 埠號的範圍從:0-65536之間
- 在計算機中有一些預設埠號,最好不要去使用
- 例如http服務的80
- 我們在開發過程中使用一些簡單的好機的就可以了,例如3000,5000等沒有什麼含義
- 可以同時開啟多個服務,但一定要確保不同服務佔用的埠號不一致才可以
- 說白了,在一臺計算機中,同一個埠號同一時間只能被一個程式佔用。