1、NODE是基于V8引擎來渲染JS的(V8是谷歌的引擎)

渲染JS的速度會很快
我們在使用JS開發後台程序的時候,不需要考慮浏覽器兼容了,使用JS的最新標准即可(ECMAScript)
2、單線程、無阻塞I/O操作、事件驅動(event-" />

  • QQ咨詢:4001806960
  • 咨詢熱線:400-180-6960

NODE中一些常用的基礎知識講解

作者:日期:2017-12-31 17:30:56 點擊:459

NODE中一些常用的基礎知識講解

 

NODE的特點

常人所說的NODE是後台編程語言,這種說法其實是錯誤的。NODE只是一個工具(或者環境),我們可以把NODE安裝在服務器上,NODE提供的環境可以運行JS代碼,這樣我們就可以在服務器端使用JavaScript編寫一些處理服務器相關操作的程序,也可以理解爲JS變爲了後台編程語言。

1、NODE是基于V8引擎來渲染JS的(V8是谷歌的引擎)

  • 渲染JS的速度會很快
  • 我們在使用JS開發後台程序的時候,不需要考慮浏覽器兼容了,使用JS的最新標准即可(ECMAScript)

2、單線程、無阻塞I/O操作、事件驅動(event-driven)


NODE是如何執行JS代碼的

常用的方式有三種

  • 使用NODE的REPL(Read-Evaluate-Print-Loop,輸入-求值-輸出-循環)命令
  • 使用命令行:node xxx.js (在命令行中把xxx.js文件中的代碼執行)
  • 在webStorm中直接右鍵 -> Run xxx.js 也可以把JS代碼在NODE中執行

Alt text

Alt text

Alt text


I/O操作

I(input):輸入
O(output):輸出
I/O操作泛指對文件及文件中內容的操作(包括:增刪改查)

JS作爲前端編程語言(運行在客戶端浏覽器中),不能直接對客戶端的本地文件進行I/O操作

  • 目的是爲了保證客戶端信息的安全
  • 有一些機制可以操作客戶端內容(input type=’file’),但是需要用戶手動選擇某些文件上傳才可以

JS作爲後台編程語言(運行在服務器端NODE環境下),可以對服務器上的資源文件進行I/O操作

  • NODE中絕對提供了供JS代碼操作I/O的方法(後面講到的fs模塊就是做這件事情的)
let fs = require('fs');
//=>異步讀取:異步讀取文件中的內容就是無阻塞I/O操作
//fs.readFile()
 
//=>同步讀取
let con = fs.readFileSync('./readme.md', 'utf8');
console.log(con);

JS中的同步異步

客戶端:

  • 定時器都是異步操作的
  • AJAX中也提供異步操作(Promise設計模式是異步編程的處理模式)
  • 事件綁定也是異步編程
  • 回調函數也可以理解爲異步編程

同步:一件事一件事的來進行處理,A做完了,B才能做,A做不完,B也無法執行…

異步:上一件事沒有徹底完成,下一件事可以先幹著,A(異步)沒做完,B(同步)先做,等B做完了,在把A進行處理…

JS本身是單線程的(有很多的進程), 一次只能做一件事情


NODE中的異步操作:

  • 定時器
  • 異步的I/O
  • 回調函數
  • setImmediate:在等待任務隊列的頂部最先執行
  • process.nextTick:在主任務隊列的最底部執行(永遠會在setImmediate之前執行)

事件驅動:
到達某個時候做一些事情,就是事件驅動(服務器端能用異步的不用同步操作)

Alt text

NODE和客戶端浏覽器的主要區別:全局對象
浏覽器全局對象: window
NODE全局對象: global

NODE天生就是基于模塊化開發的

NODE中模塊這個概念非常強(強到我們每創建一個新的JS,都相當于創建了一個新的模塊)

NODE是基于commonjs規範來完成模塊設計的(如何創建模塊、如何調取模塊、如何導出模塊 這些就是規範裏提及的內容)

  • CMD模塊開發思想:seajs (按需導入:用到的時候在導入進來使用)
  • AMD模塊開發思想:requirejs (提前導入所有需要的依賴)

1、自定義模塊:自己創建的
2、第三方模塊:別人寫好的我來用
3、內置模塊:天生自帶的

自定義模塊的原理

創建一個JS就相當于創建一個模塊,而模塊之間是獨立的(也可以共享),爲了實現這樣的需求,每當創建一個JS,NODE都幫助我們做了很多的事情

//=>NODE爲了實現模塊之間的獨立,會自動包一層閉包,而且給每一個模塊傳遞五個值
(function (exports, require, module, __filename, __dirname) {
/*
* module模塊:NODE模塊管理的對象
* exports叫做導出,等同于module.exports,用來把模塊進行導出的
* require是導入的方法,通過這個方法可以把一些模塊導入到當前模塊中使用
*/
 
//=>內部代碼中有一個類似于這樣的操作,可以把一些想要供別人使用的屬性和方法暴露出來
module.exports=exports=this={
fn:()=>{}
};
})();
 
//=>下一個模塊
(function (exports, require, module, __filename, __dirname) {
let obj=require('pre');//=>導入上邊的模塊
//=>我們的obj就是上面模塊導出的對象
//{fn:()=>{}}
})();

require
導入某個模塊,目的是使用其它模塊中的屬性和方法

require('./xxx') : 指定目錄的情況下,都是爲了要導入自己定義的模塊
 
require('xxx'):不指定目錄情況下,可能是導入第三方安裝的模塊,也可能是導入內置模塊(首先到node_modules文件夾中找第三方模塊,有的話,導入的就是第三方模塊,沒有的話,看內置模塊中有沒有,內置中這個模塊,導入的就是內置模塊,內置中沒有就會報錯)

module.exports
把當前模塊中的某些屬性和方法導出

module.exports.fn=fn;
module.exports.a=12;
//=>上面寫起來麻煩(上面屬于向原有內置對象的堆內存中增加屬性和方法,下面屬于導出一個新的堆內存)
module.exports={
fn:fn,
a:12
};
 
---
//=>直接使用exports也可以,但是這種模式只能使用原有內置內容,自己開辟新內存不行
exports.fn=fn;
exports={};//=>這種方式不行

思考題:
有三個自定義模塊
A:任意數求和 sum :sum(1,2,3,4) => 10
B:求平均數 avg : avg(12,23,34) =>平均數 (先求和[調取A中的sum],除以長度,求出平均數)
C:最後調取 : 調取B中的avg ,傳遞幾個數,算出平均數即可

第三方模塊的安裝

除了npm我們還可以使用yarn來安裝模塊

1、首先在全局安裝yarn
npm install yarn -g

2、想在項目中安裝模塊,和npm的操作步驟類似
yarn init -y 生成package.json
yarn add xxx 安裝具體模塊,並且保存在生産依賴項中(yarn只能把模塊安裝在本地項目中不能安裝在全局)
yarn add xxx –dev 保存在開發依賴項中
yarn remove xxx 移除安裝的模塊
yarn install 按照依賴模塊清單,跑環境

基本上和npm的操作類似,大家可以體驗一把哈,看看急速安裝是什麽狀態

上一篇: Git基礎知識精講

下一篇: Promise 詳解與實現(遵循Promise/A+規範)