1. 程式人生 > >NodeJs學習之路(1)

NodeJs學習之路(1)

NodeJs主要乾的工作

    nodejs主要可以完成的工作就是在Web場景下使用,是對前端最友好的後端語言,主要是在高併發,非阻塞I/O密集下使用,但是不適合CPU使用密集、非阻塞I/O不多的情況下使用。很多情況下NodeJS在價效比方面不是最好的,但是對於前端開發者而言python和java語言並不是太友好。。。學習成本高,後臺也並不是太清楚前端,也懶得寫(哈哈哈主要是這個)。而NodeJs可以在server上跑,它也可以處理檔案和進行編譯工作,雖然效能相比其他主流後臺語言慢了一些但是對於前端來說無疑是最友好的後臺語言了~~

從頭開始我們首先安裝NodeJS

    由於網路限制的原因我們可以在 http://nodejs.cn/ 也就是node中文網站下載node安裝包,按安裝程式走,完成安裝後在cmd命令視窗輸入node -v檢視是否安裝成功,目前我用的是v8.7.0版本。隨著前端的工作越來越複雜,程式碼規範逐漸走向了模組化,所以nodejs中使用了CommonJs來規範程式碼。CommonJs將nodeJs的每個檔案都視為一個模組,而每個模組獨有自己的作用域,每個檔案中的變數只能自己的檔案使用,在編譯時nodejs會自動將檔案用function函式將其包裹起來,所以變數都為區域性變數。在檔案內部也就是模組module代表模組的本身,module.exports代表該模組的對外介面,這裡我們可以從中呼叫我們需要的值。有輸出自然接受,在nodejs中所使用的接受方法為“require”。nodejs檔案的執行只會執行一次,若是內部有呼叫會等呼叫檔案完畢再執行下面的步驟。
    以下有四個程式碼塊可以解釋該關係:四個檔案分別為xunhuanA.js,xunhuanB.js,xunhuanC.js,xunhuan_main.js,前三個檔案是三個子檔案,通過xunhuan_main.js來呼叫它們,以下為程式碼例項:

xunhuanA.js:

module.exports.test = 'A';

const modB = require('./xunhuanB');

console.log('====================================');
console.log('xunhuanA:', modB.test);
console.log('====================================');

module.exports.test = 'AA'

xunhuanB.js

module.exports.test = 'B';

const
modA = require('./xunhuanA'); console.log('===================================='); console.log('xunhuanB:', modA.test); console.log('===================================='); const modC = require('./xunhuanC'); console.log('===================================='); console.log('xunhuanB(c):', modC.test); console
.log('===================================='); module.exports.test = 'BB'

xunhuanC.js

module.exports.test = 'C';

const modB = require('./xunhuanB');

console.log('====================================');
console.log('xunhuanC:', modB.test);
console.log('====================================');

module.exports.test = 'CC'

xunhuan_main.js

const modA = require('./xunhuanA');

當執行A時匯入了B,B檔案的內部執行,當B呼叫到A時採用的變數是A停止時的變數,而非A整體檔案執行完畢的變數。執行到C檔案時C檔案的內部先執行,在const modB = require(‘./xunhuanB’);這裡會呼叫到B停止時的輸出變數‘B’而非‘BB‘與A檔案同理。在C整體執行完畢後,將最新的變數傳遞到B去,B執行完畢將變數傳遞A去。可能有一些抽象,畫為圖形的話就容易理解了。(“靈魂畫手”見諒~):
這裡寫圖片描述
在xunhuan_main.js中只調用了A檔案就可將ABC檔案執行完畢,可以繼續新增BC檔案,方便真實使用的情況下呼叫。當然這種互相引用迴圈在使用時不可取,我們在使用時不要使用這種方法。

nodejs有自己的模組系統,可以引用模組完成工作,其中有個模組名為fs模組,全稱為file system,主要是做檔案的讀寫改查功能,在nodejs中直接引用即可,為require('fs').以下為簡單的檔案獲取寫法:
const fs = require('fs');

const result = fs.readFile('./fs.js', (err,data) => {  //回撥函式
  if(err) {
    console.log(err);
  }else {
    console.log(data.toString());//fs模組是操作二進位制流的,我們想要看懂需要將其轉化為字串。
  }
});

console.log('====================================');
console.log(result); //node執行機制為非同步操作,這裡只是按順序進行得到的值,並不會得到裡邊的值,需要一個回撥函式才能得到讀取檔案的值
console.log('====================================');

讀者可以自己試一下。

nodejs引用第三方模組

        這裡引用的是chalk模組,因為為第三方模組,和上述的fs不同,需要手動安裝一下,在命令列工具裡輸入npm install chalk。這個模組可以改變命令列輸出的樣式效果,比如將輸出的字變成不同樣的顏色,加下劃線陰影等等。有興趣的可以查API。以下為示例:
const chalk = require('chalk');

console.log(chalk.yellow('this is yellow'));
console.log(chalk.bgGreen('this is green'));

exports與module.exports的區別

module.exports作為nodejs檔案的輸出口存在,exports只是作為預設的代表module.exports的變數名,就是  
const exports = module.exports

當exports輸出基本的型別如字串數字等時,是好用的(可以少寫個module),但是當exports輸出的是引用變數就不一樣了,輸出的物件會將exports的指標變向該物件,而不是預設的module.exports了,所以在匯出物件的時候需要使用module.exports就是可以的了。