nodejs筆記

nodejs常用知識(shí)點(diǎn)

nodejs中require方法的過程

// Check the cache for the requested file.
// 1. If a module already exists in the cache: return its exports object.
// 2. If the module is native: call `NativeModule.require()` with the filename and return the result.
// 3. Otherwise, create a new module for the file and save it to the cache.Then have it load  the file contents before returning its exports object.

在module.js中會(huì)先調(diào)用_load方法,當(dāng)該模塊既不在cache中,也不是nativeModule,需要?jiǎng)?chuàng)建Module的實(shí)例(調(diào)用_compile方法),并加入緩存中,同時(shí)返回exports方法。

而在es6中引入了Module,提供了require方法,那么它和commonJs的require方法有什么區(qū)別呢?

  1. 非運(yùn)行時(shí)
    可以做靜態(tài)代碼分析,在運(yùn)行前分析模塊之間的依賴關(guān)系,運(yùn)行代碼檢查。
  2. 更好支持依賴循環(huán)
    在Nodejs中如果模塊之間存在相互引用,可能會(huì)引發(fā)意想不到的結(jié)果。而在es6中,是不會(huì)關(guān)心是否發(fā)生了"循環(huán)加載",生成的是指向被加載模塊的引用。

什么是error-first回調(diào)模式?

應(yīng)用error-first回調(diào)模式是為了更好的進(jìn)行錯(cuò)誤和數(shù)據(jù)的傳遞。第一個(gè)參數(shù)保留給一個(gè)錯(cuò)誤error對(duì)象,一旦出錯(cuò),錯(cuò)誤將通過第一個(gè)參數(shù)error返回。其余的參數(shù)將用作數(shù)據(jù)的傳遞。

fs.readFile(filePath, function(err, data) {  
  if (err) {
    // handle the error, the return is important here
    // so execution stops here
    return console.log(err)
  }
  // use the data object
  console.log(data)
})

require方法加載順序源碼

當(dāng) Node 遇到 require(X) 時(shí),會(huì)依次按下面的順序處理。

  • 如果 X 是內(nèi)置模塊(比如 require('http'))
    1. 返回該模塊。
    2. 不再繼續(xù)執(zhí)行。
  • 如果 X 以 "./" 或者 "/" 或者 "../" 開頭
    1. 根據(jù) X 所在的父模塊,確定 X 的絕對(duì)路徑。
    2. 將 X 當(dāng)成文件,依次查找下面文件,只要其中有一個(gè)存在,就返回該文件,不再繼續(xù)執(zhí)行。
    X
    X.js
    X.json
    X.node
3. 將 X 當(dāng)成目錄,依次查找下面文件,只要其中有一個(gè)存在,就返回該文件,不再繼續(xù)執(zhí)行。
    X/package.json
    X/index.js
    X/index.json
    X/index.node
  • 如果 X 不帶路徑
    1. 根據(jù) X 所在的父模塊,確定 X 可能的安裝目錄。
    2. 依次在每個(gè)目錄中,將 X 當(dāng)成文件名或目錄名加載。
  • 拋出 "not found"

process.nextTick

先通過一段代碼看看process.nextTick干了什么

function foo() {
    console.error('foo');
}

process.nextTick(foo);
console.error('bar');

-------------
bar
foo 

通過上述代碼,可以看到程序先輸出Bar,再輸出foo。在js中我們可以通過setTimeout(function(){},0)來實(shí)現(xiàn)這個(gè)功能。
但是在內(nèi)部處理機(jī)制上,process.nextTicksetTimeout(fn,0)是有明顯區(qū)別的。
process.nextTick時(shí)間復(fù)雜度o(1),而setTimeout(fn,0)的時(shí)間復(fù)雜度o(log(n))[紅黑樹]。
process.nextTick中傳入的函數(shù),都是在當(dāng)前執(zhí)行棧的尾部觸發(fā)。最大嵌套層級(jí)是1000。
注:
nextTick傳入的callback執(zhí)行先于任何IO事件。(It runs before any additional I/O events (including timers) fire in subsequent ticks of the event loop..)

nodejs處理cpu密集型

let http = require('http');

let server = http.createServer((req,res)=>{
    let url = req.url;
    if(url.indexOf('test')>=0){
        while(1){
            console.log('a');
        }
    }else{
        console.log('b');
    }
});

server.listen(3000,()=>{
    console.log("監(jiān)聽3000端口");
});

運(yùn)行上述代碼,控制臺(tái)無法輸出b;

mysql包

pool.query方法是流程pool.getConnection -> connection.query -> connection.release的縮寫
該npm包默認(rèn)使用sqlstring包對(duì)sql語句進(jì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)容

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,603評(píng)論 0 6
  • Node基本 node的最大特性莫過于基于事件驅(qū)動(dòng)的非阻塞I/O模型。 node通過事件驅(qū)動(dòng)的方式處理請(qǐng)求,無須為...
    AkaTBS閱讀 2,305評(píng)論 0 11
  • Node.js是目前非?;馃岬募夹g(shù),但是它的誕生經(jīng)歷卻很奇特。 眾所周知,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,731評(píng)論 2 41
  • 第二章:模塊機(jī)制 總結(jié):nodejs遵循commonjs規(guī)范,commonjs定義了模塊、I/O、二進(jìn)制、文件等規(guī)...
    shanshanfei閱讀 682評(píng)論 0 0
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,234評(píng)論 0 1

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