1. 程式人生 > >147.Node.js學習筆記(一)2018.11.27

147.Node.js學習筆記(一)2018.11.27

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等沒有什麼含義
  • 可以同時開啟多個服務,但一定要確保不同服務佔用的埠號不一致才可以
  • 說白了,在一臺計算機中,同一個埠號同一時間只能被一個程式佔用。

5. 留言本

6. Nodejs中的系統模組