1. 程式人生 > >Node.js入門:檔案查詢機制

Node.js入門:檔案查詢機制

檔案查詢流程圖

從檔案模組快取中載入

    儘管原生模組與檔案模組的優先順序不同,但是都不會優先於從檔案模組的快取中載入已經存在的模組。

從原生模組載入

    原生模組的優先順序僅次於檔案模組快取的優先順序。require方法在解析檔名之後,優先檢查模組是否在原生模組列表中。以http模組為例,儘管在目錄下存在一個http/http.js/http.node/http.json檔案,require(“http”)都不會從這些檔案中載入,而是從原生模組中載入。     原生模組也有一個快取區,同樣也是優先從快取區載入。如果快取區沒有被載入過,則呼叫原生模組的載入方式進行載入和執行。

從檔案載入

    當檔案模組快取中不存在,而且不是原生模組的時候,Node.js會解析require方法傳入的引數,並從檔案系統中載入實際的檔案,載入過程中的包裝和編譯細節在前一節中已經介紹過,這裡我們將詳細描述查詢檔案模組的過程,其中,也有一些細節值得知曉。     require方法接受以下幾種引數的傳遞:
  1. http、fs、path等,原生模組。 
  2. ./mod或../mod,相對路徑的檔案模組。 
  3. /pathtomodule/mod,絕對路徑的檔案模組。 
  4. mod,非原生模組的檔案模組。
    在進入路徑查詢之前有必要描述一下module path這個Node.js中的概念。對於每一個被載入的檔案模組,建立這個模組物件的時候,這個模組便會有一個paths屬性,其值根據當前檔案的路徑計算得到。我們建立modulepath.js這樣一個檔案,其內容為:
console.log(module.paths);
    我們將其放到任意一個目錄中執行node modulepath.js命令,將得到以下的輸出結果。
[ '/home/jackson/research/node_modules',  '/home/jackson/node_modules',  '/home/node_modules',  '/node_modules' ]
    Windows下:
[ 'c:\\nodejs\\node_modules',  'c:\\node_modules' ]
    可以看出module path的生成規則為:從當前檔案目錄開始查詢node_modules目錄;然後依次進入父目錄,查詢父目錄下的node_modules目錄;依次迭代,直到根目錄下的node_modules目錄。     除此之外還有一個全域性module path,是當前node執行檔案的相對目錄(../../lib/node)。如果在環境變數中設定了HOME目錄和NODE_PATH目錄的話,整個路徑還包含NODE_PATH和HOME目錄下的.node_libraries與.node_modules。其最終值大致如下:
[NODE_PATH,HOME/.node_modules,HOME/.node_libraries,execPath/../../lib/node]

require方法中的檔案查詢策略

    由於Node.js中存在4類模組(原生模組和3種檔案模組),儘管require方法極其簡單,但是內部的載入卻是十分複雜的,其載入優先順序也各自不同。     簡而言之,如果require絕對路徑的檔案,查詢時不會去遍歷每一個node_modules目錄,其速度最快。其餘流程如下:
  1. 從module path陣列中取出第一個目錄作為查詢基準。 
  2. 直接從目錄中查詢該檔案,如果存在,則結束查詢。如果不存在,則進行下一條查詢。 
  3. 嘗試新增.js、.json、.node字尾後查詢,如果存在檔案,則結束查詢。如果不存在,則進行下一條。 
  4. 嘗試將require的引數作為一個包來進行查詢,讀取目錄下的package.json檔案,取得main引數指定的檔案。 
  5. 嘗試查詢該檔案,如果存在,則結束查詢。如果不存在,則進行第3條查詢。 
  6. 如果繼續失敗,則取出module path陣列中的下一個目錄作為基準查詢,迴圈第1至5個步驟。 
  7. 如果繼續失敗,迴圈第1至6個步驟,直到module path中的最後一個值。 
  8. 如果仍然失敗,則丟擲異常。
    整個查詢過程十分類似原型鏈的查詢和作用域的查詢。所幸Node.js對路徑查詢實現了快取機制,否則由於每次判斷路徑都是同步阻塞式進行,會導致嚴重的效能消耗。

相關推薦

Node.js入門檔案查詢機制

檔案查詢流程圖 從檔案模組快取中載入     儘管原生模組與檔案模組的優先順序不同,但是都不會優先於從檔案模組的快取中載入已經存在的模組。 從原生模組載入     原生模組的優先順序僅次於檔案模組快取的優先順序。require方法在解析檔名之後,優先檢查模組是否在原生模組列

Node.js入門模組機制

**CommonJS規範 ** 早在Netscape誕生不久後,JavaScript就一直在探索本地程式設計的路,Rhino是其代表產物。無奈那時服務端JavaScript走的路均是參考眾多伺服器端語言來實現的,在這樣的背景之下,一沒有特色,二沒有實用價值。但是隨著JavaScript在前端的應

Node.js入門事件機制

Evented I/O for V8 JavaScript     基於V8引擎實現的事件驅動IO。 事件機制的實現     Node.js中大部分的模組,都繼承自Event模組(http://nodejs.org/docs/latest/api/events.html )。Event模組(ev

Node.js-入門三--檔案I/O

1.檔案I/O fs模組的基本用法 開發中我們經常會有檔案I/O的需求,node.js中提供一個名為fs的模組來支援I/O操作,fs模組的檔案I/O是對標準POSIX函式的簡單封裝。 2.writeFile函式的基本用法 (寫入檔案) 檔案I/O,寫入是必修課之

Node.js入門前後端模組的異同

    通常有一些模組可以同時適用於前後端,但是在瀏覽器端通過script標籤的載入JavaScript檔案的方式與Node.js不同。Node.js在載入到最終的執行中,進行了包裝,使得每個檔案中的變數天然的形成在一個閉包之中,不會汙染全域性變數。而瀏覽器端則通常是裸露的JavaScript程式碼片段。所以

Node.js入門非同步IO

非同步IO     在作業系統中,程式執行的空間分為核心空間和使用者空間。我們常常提起的非同步I/O,其實質是使用者空間中的程式不用依賴核心空間中的I/O操作實際完成,即可進行後續任務。 同步IO的並行模式 多執行緒單程序     多執行緒的設計之處就是為了在共享的程式空間中,實現並行處理

Node.js入門包結構

    JavaScript缺少包結構。CommonJS致力於改變這種現狀,於是定義了包的結構規範(http://wiki.commonjs.org/wiki/Packages/1.0 )。而NPM的出現則是為了在CommonJS規範的基礎上,實現解決包的安裝解除安裝,依賴管理,版本管理等問題。require

Node.js入門Hello World

  馬上開始我們第一個Node.js應用:“Hello World”。開啟你的編輯器,建立一個hello.js檔案。編寫程式碼儲存該檔案,並通過Node.js來執行。 控制檯輸出 1 console.log('hello, nodejs.') ; Web輸出 1

Node.js入門Node.js&NPM的安裝與配置

Node.js安裝與配置      Node.js已經誕生兩年有餘,由於一直處於快速開發中,過去的一些安裝配置介紹多數針對0.4.x版本而言的,並非適合最新的0.6.x的版本情況了,對此,我們將在0.6.x的版本上介紹Node.js的安裝和配置。(本文一律以0.6.1為例,0.6的其餘版本,只需替換版本號即

(原創)node.js入門之一express簡單伺服器搭建-Mac環境開發

0:開篇廢話 好久沒來記錄點東西了,以前記錄的都是一些解決小問題的程式碼片段,只能算是當記事本來用的吧。 換了工作,好像沒那麼多程式碼要寫了,那就自己找點事做,於是重新翻出了nodejs,以前是在主程的搭建環境下,寫一些介面給我的iOS前

極簡 Node.js 入門 - 3.2 檔案讀取

> 極簡 Node.js 入門系列教程:[https://www.yuque.com/sunluyong/node](https://www.yuque.com/sunluyong/node) > > 本文更佳閱讀體驗:[https://www.yuque.com/sunluyong/node/fs-read

極簡 Node.js 入門 - 3.5 監視檔案變化

> 極簡 Node.js 入門系列教程:[https://www.yuque.com/sunluyong/node](https://www.yuque.com/sunluyong/node) > > 本文更佳閱讀體驗:[https://www.yuque.com/sunluyong/node/fs-watc

Node.js入門以及第一個helloworld程序

目錄 rip 工作 直播 需要 減少 web容器 用戶 長連接 1、概念:簡單的說 Node.js 就是運行在服務端的 JavaScript。學之前需要明白Node.js是無法挑戰jsp、php或者asp這種老牌網站的地位的,是永遠不會出現在證券、金融這種領域的。node.

Node.js入門》Windows 7下Node.js Web開發環境搭建筆記

基於 方法 一位 實時 ibm cal 項目 直觀 ear 近期想嘗試一下在IBM Bluemix上使用Node.js創建Web應用程序。所以須要在本地搭建Node.js Web的開發測試環境。這裏講的是Windows下的搭建方法,使用CentOS 的小夥伴請參考:《No

Node.js入門

js代碼 roc 簡單 本地 node span server -s host Node的安裝就不說了,流程見http://www.runoob.com/nodejs/nodejs-install-setup.html。直接來做一個簡單的web服務器 首先輸入並保存一個js

node js實戰帶數據庫,加密的註冊登錄表單

settings else input 是否 rip dig code setting 個人 demo 註冊效果: 登陸效果: 數據庫截圖: 數據庫操作 db.js //這個模塊裏面封裝了所有對數據庫的常用操作 var MongoClient =

Node.js入門到企業Web開發中的應用

實戰 tput 統一 sse 介紹 有用 enc oba 入門到 第1章 課程內容介紹主要介紹為什麽我們錄制本次課程、課程包含的主要內容。1-1 導學1-2 課程介紹 第2章 NodeJS 是什麽,為什麽偏愛NodeJS?在一切課程課程內容開始之前先了解一下 NodeJS

Node.js中fs檔案系統-與檔案file相關;

1.首先引入fs檔案模組; //讀取檔案; fs.readFile(path[, options], callback)  path:檔名; options:檔案讀取方式; callback:回撥函式;回撥函式有兩個引數err data  其中data是檔案的

node.js在讀取檔案時中文亂碼問題

斷更很久了........從今天開始會努力的持續更博,積極學習。 言歸正傳。今天在寫node.js的demo時發現一個bug。我在node中讀取本地的text檔案時,發現英文的內容可以被讀取,但是中文的就顯示的是亂碼。如下圖   產生這種問題的原因是: Windows下預設的編碼格式是AS

node.js中的檔案系統

檔案開啟操作 fs.open(path, flags[, mode], callback) path: <string>|<Buffer>|<URL> flags: <string>|<number> mode: <integ