兄弟會(huì)8.8號(hào)筆記

1.linux基本命令

2.node.js


linux基本操作命令

ls  ? ? ? ? 顯示文件或目錄

? ?-l? ? ? ? ? 列出文件詳細(xì)信息l(list)?

? ?-a? ? ? ? ? 列出當(dāng)前目錄下所有文件及目錄,包括隱藏的a(all)

mkdir? ? ? ? 創(chuàng)建目錄

? ? ?-p? ? ? ? ? 創(chuàng)建目錄,若無(wú)父目錄,則創(chuàng)建p(parent)

cd? ? ? ? ? ? ? 切換目錄

touch? ? ? ? ? 創(chuàng)建空文件

echo? ? ? ? ? ? 創(chuàng)建帶有內(nèi)容的文件。

cat? ? ? ? ? ? ? 查看文件內(nèi)容

cp? ? ? ? ? ? ? ? 拷貝

mv? ? ? ? ? ? ? 移動(dòng)或重命名

rm? ? ? ? ? ? ? 刪除文件

-r? ? ? ? ? ? 遞歸刪除,可刪除子目錄及文件

-f? ? ? ? ? ? 強(qiáng)制刪除

find? ? ? ? ? ? ? 在文件系統(tǒng)中搜索某文件

grep? ? ? ? ? ? 在文本文件中查找某個(gè)字符串

rmdir? ? ? ? ? 刪除空目錄

tree? ? ? ? ? ? 樹形結(jié)構(gòu)顯示目錄,需要安裝tree包

pwd? ? ? ? ? ? ? 顯示當(dāng)前目錄

ln? ? ? ? ? ? ? ? ? 創(chuàng)建鏈接文件

more、less? 分頁(yè)顯示文本文件內(nèi)容

head、tail? ? 顯示文件頭、尾內(nèi)容

ctrl+alt+F1? 命令行全屏模式


node.js


理解Node的模塊概念

在Node中,不同的功能組件被劃分成不同的模塊。應(yīng)用可以根據(jù)自己的需要來(lái)選擇使用合適的模塊。每個(gè)模塊都會(huì)暴露一些公共的方法或?qū)傩?。模塊的使用者直接使用這些方法或?qū)傩约纯?,?duì)于內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)就可以不用了解。除了Node本身提供的API外,開發(fā)人員也可以利用這個(gè)機(jī)制來(lái)將應(yīng)用拆分成多個(gè)模塊,以提高代碼的可復(fù)用性。

1.如何使用模塊?

在Node中使用模塊是非常方便的,在 JavaScript 代碼中可以直接使用全局函數(shù) require() 來(lái)加載一個(gè)模塊。

在剛剛”Hello World"的例子中,require("http") 可以加載系統(tǒng)預(yù)置的 http 模塊;模塊名稱以 "./" 開始的,如 require("./myModule.js") 用來(lái)加載與當(dāng)前 JavaScript 文件同一目錄下的 myModule.js 模塊。

2.自己如何開發(fā)模塊?

剛剛介紹使用require()導(dǎo)入模塊的時(shí)候,模塊名稱以 "./" 開始的這種,就是自己開發(fā)的模塊文件。需要注意的就是JS文件的系統(tǒng)路徑。

代碼中封裝了模塊的內(nèi)部處理邏輯,一個(gè)模塊一般都會(huì)暴露一些公開的方法或?qū)傩越o其他的人使用。模塊的內(nèi)部代碼需要把這些方法或?qū)傩越o暴露出來(lái)。

3.來(lái)一套簡(jiǎn)單的例子。先創(chuàng)建一個(gè)模塊文件如myModule.js,就一行代碼

console.log('Hi Darren.')

然后創(chuàng)建一個(gè)test.js文件,導(dǎo)入這個(gè)JS文件,執(zhí)行node看到結(jié)果

現(xiàn)在Node社區(qū)中已有不少第三方的模塊,希望能有更多人通過(guò)學(xué)習(xí)Node,加入到這個(gè)大家庭中,為Node社區(qū)來(lái)添磚加瓦。先謝謝之,咱們繼續(xù)。

4.來(lái)一個(gè)深點(diǎn)的例子。這個(gè)例子中將會(huì)針對(duì) 私有和共有 進(jìn)行介紹。先創(chuàng)建一個(gè)myModule.js,代碼如下:

var name = "Darren";

this.location = "Beijing";

this.showLog = function(){

console.log('Hi Darren.')

};

代碼中出現(xiàn)了三種類型,分別是: 私用屬性,共有屬性和共有方法,再創(chuàng)建一個(gè)test.js,執(zhí)行Node

結(jié)果高亮的地方很清楚的告訴我們,私有方法我們?cè)谀K以外是取不到的,所以是undefined。共有屬性和共有方法的聲明需要在前面加上 this 關(guān)鍵字。

Node能做什么和它的優(yōu)勢(shì)

Node核心思想:  1.非阻塞;  2.單線程;  3.事件驅(qū)動(dòng)。

在目前的web應(yīng)用中,客戶端和服務(wù)器端之間有些交互可以認(rèn)為是基于事件的,那么AJAX就是頁(yè)面及時(shí)響應(yīng)的關(guān)鍵。每次發(fā)送一個(gè)請(qǐng)求時(shí)(不管請(qǐng)求的數(shù)據(jù)多么?。紩?huì)在網(wǎng)絡(luò)里走一個(gè)來(lái)回。服務(wù)器必須針對(duì)這個(gè)請(qǐng)求作出響應(yīng),通常是開辟一個(gè)新的進(jìn)程。那么越多用戶訪問這個(gè)頁(yè)面,所發(fā)起的請(qǐng)求個(gè)數(shù)就會(huì)越來(lái)越多,就會(huì)出現(xiàn)內(nèi)存溢出、邏輯交錯(cuò)帶來(lái)的沖突、網(wǎng)絡(luò)癱瘓、系統(tǒng)崩潰這些問題。

Node的目標(biāo)是提供一種構(gòu)建可伸縮的網(wǎng)絡(luò)應(yīng)用的方案,在hello world例子中,服務(wù)器可以同時(shí)處理很多客戶端連接。

Node和操作系統(tǒng)有一種約定,如果創(chuàng)建了新的鏈接,操作系統(tǒng)就將通知Node,然后進(jìn)入休眠。如果有人創(chuàng)建了新的鏈接,那么它(Node)執(zhí)行一個(gè)回調(diào),每一個(gè)鏈接只占用了非常小的(內(nèi)存)堆棧開銷。

舉一個(gè)簡(jiǎn)單的異步調(diào)用的例子,把test.js和myMydule.js準(zhǔn)備好了,^_^。把以下代碼拷貝到test.js中并執(zhí)行:

復(fù)制代碼

var fs = require('fs');

fs.readFile('./myModule.js', function (err, data) {

if (err) throw err;

console.log('successfully');

});

console.log('async');

復(fù)制代碼

所謂的異步,大家應(yīng)該都能想得到運(yùn)行時(shí)會(huì)先打先顯示"async",再顯示"successfully"。

Node是無(wú)阻塞的,新請(qǐng)求到達(dá)服務(wù)器時(shí),不需要為這個(gè)請(qǐng)求單獨(dú)作什么事情。Node僅僅是在那里等待請(qǐng)求的發(fā)生,有請(qǐng)求就處理請(qǐng)求。

Node更擅長(zhǎng)處理體積小的請(qǐng)求以及基于事件的I/O。

Node不僅僅是做一個(gè)Web服務(wù)的框架,它可以做更多,比如它可以做Socket服務(wù),可以做比方說(shuō)基于文件的,然后基于像一些比方說(shuō)可以有子進(jìn)程,然后內(nèi)部的,它是一個(gè)很完整的事件機(jī)制,包括一些異步非注射的解決方案,而不僅僅局限在網(wǎng)絡(luò)一層。同時(shí)它可能,即使作為一個(gè)Web服務(wù)來(lái)說(shuō),它也提供了更多可以深入這個(gè)服務(wù)內(nèi)核、核心的一些功能,比方說(shuō)Node使用的Http Agent,這塊就是它可以更深入這個(gè)服務(wù)內(nèi)核來(lái)去做一些功能。

Node事件流概念

因?yàn)镹ode 采用的是事件驅(qū)動(dòng)的模式,其中的很多模塊都會(huì)產(chǎn)生各種不同的事件,可由模塊來(lái)添加事件處理方法,所有能夠產(chǎn)生事件的對(duì)象都是事件模塊中的 EventEmitter 類的實(shí)例。代碼是全世界通用的語(yǔ)言,所以我們還是用代碼說(shuō)話:

復(fù)制代碼

var events = require("events");

var emitter = new events.EventEmitter();

emitter.on("myEvent", function(msg) {

console.log(msg);

});

emitter.emit("myEvent", "Hello World.");

復(fù)制代碼

簡(jiǎn)單的分析這段:

1. 使用require()方法添加了events模塊并把返回值賦給了一個(gè)變量

2. new events.EventEmitter()這句創(chuàng)建了一個(gè)事件觸發(fā)器,也就是所謂的事件模塊中的 EventEmitter 類的實(shí)例

3. on(event, listener)用來(lái)為某個(gè)事件 event 添加事件處理方法監(jiān)聽器

4. emit(event, [arg1], [arg2], [...]) 方法用來(lái)產(chǎn)生事件。以提供的參數(shù)作為監(jiān)聽器函數(shù)的參數(shù),順序執(zhí)行監(jiān)聽器列表中的每個(gè)監(jiān)聽器函數(shù)。

EventEmitter 類中的方法都與事件的產(chǎn)生和處理相關(guān):

1. addListener(event, listener) 和 on(event, listener) 這兩個(gè)方法都是將一個(gè)監(jiān)聽器添加到指定事件的監(jiān)聽器數(shù)組的末尾

2. once(event, listener) 這個(gè)方法為事件為添加一次性的監(jiān)聽器。該監(jiān)聽器在事件第一次觸發(fā)時(shí)執(zhí)行,過(guò)后將被移除

3. removeListener(event, listener) 該方法用來(lái)將監(jiān)聽器從指定事件的監(jiān)聽器數(shù)組中移除出去

4. emit(event, [arg1], [arg2], [...]) 剛剛提到過(guò)了。

在Node中,存在各式各樣不同的數(shù)據(jù)流,Stream(流)是一個(gè)由不同對(duì)象實(shí)現(xiàn)的抽象接口。例如請(qǐng)求HTTP服務(wù)器的request是一個(gè)流,類似于stdout(標(biāo)準(zhǔn)輸出);包括文件系統(tǒng)、HTTP 請(qǐng)求和響應(yīng)、以及 TCP/UDP 連接等。流可以是可讀的,可寫的,或者既可讀又可寫。所有流都是EventEmitter的實(shí)例,因此可以產(chǎn)生各種不同的事件。

可讀流主要會(huì)產(chǎn)生以下事件:

data? 當(dāng)讀取到流中的數(shù)據(jù)時(shí),此事件被觸發(fā)

end? 當(dāng)流中沒有數(shù)據(jù)可讀時(shí),此事件被觸發(fā)

error? 當(dāng)讀取數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),此事件被觸發(fā)

close? 當(dāng)流被關(guān)閉時(shí),,此事件被觸發(fā),可是并不是所有流都會(huì)觸發(fā)這個(gè)事件。(例如,一個(gè)連接進(jìn)入的HTTP request流就不會(huì)觸發(fā)'close'事件。)

還有一種比較特殊的 fd 事件,當(dāng)在流中接收到一個(gè)文件描述符時(shí)觸發(fā)此事件。只有UNIX流支持這個(gè)功能,其他類型的流均不會(huì)觸發(fā)此事件。

相關(guān)詳細(xì)文檔:http://cnodejs.org/cman/all.html#events_

強(qiáng)大的File System 文件系統(tǒng)模塊

Node 中的 fs 模塊用來(lái)對(duì)本地文件系統(tǒng)進(jìn)行操作。文件的I/O是由標(biāo)準(zhǔn)POSIX函數(shù)封裝而成。需要使用require('fs')訪問這個(gè)模塊。所有的方法都提供了異步和同步兩種方式。

fs 模塊中提供的方法可以用來(lái)執(zhí)行基本的文件操作,包括讀、寫、重命名、創(chuàng)建和刪除目錄以及獲取文件元數(shù)據(jù)等。每個(gè)操作文件的方法都有同步和異步兩個(gè)版本。

異步操作的版本都會(huì)使用一個(gè)回調(diào)方法作為最后一個(gè)參數(shù)。當(dāng)操作完成的時(shí)候,該回調(diào)方法會(huì)被調(diào)用。而回調(diào)方法的第一個(gè)參數(shù)總是保留為操作時(shí)可能出現(xiàn)的異常。如果操作正確成功,則第一個(gè)參數(shù)的值是 null 或 undefined 。

同步操作的版本的方法名稱則是在對(duì)應(yīng)的異步方法之后加上一個(gè) Sync 作為后綴。比如異步的 rename() 方法的同步版本是 renameSync() 。下面列出來(lái)了 fs 模塊中的一些常用方法,都只介紹異步操作的版本。

test.js和myModule.js文件準(zhǔn)備好了木?把下面這段代碼copy到test.js中執(zhí)行一次

var fs = require('fs');

fs.unlink('./myModule.js', function (err) {

if (err) throw err;

console.log('successfully deleted myModule.js');

});

如果沒有報(bào)error,那么myModule.js就被刪除了,就是這么簡(jiǎn)單

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容