首頁 web前端 js教程 跟我學Nodejs(三)--- Node.js模組_javascript技巧

跟我學Nodejs(三)--- Node.js模組_javascript技巧

May 16, 2016 pm 04:47 PM
node.js 模組

簡介及資料

    透過Node.js的官方API可以看到Node.js本身提供了很多核心模組http://nodejs.org/api/ ,這些核心模組被編譯成二進位文件,可以require('模組名稱')去取得;核心模組具有最高的載入優先權(有模組與核心模組同名時會體現)

    (這次主要說自訂模組)

    Node.js還有一類模組為檔案模組,可以是JavaScript程式碼檔案(.js作為檔案後綴)、也可以是JSON格式文字檔案(.json作為檔案後綴)、還可以是編輯過的C/ C 文件(.node作為文件後綴);

    檔案模組存取方式透過require('/檔案名稱.後綴')    require('./檔案名稱.字尾')    requrie('../檔案名稱.後綴') 去訪問,檔案後綴可以省略;以"/"開頭是以絕對路徑去加載,以"./"開頭和以"../"開頭表示以相對路徑加載,而以"./"開頭表示同級目錄下文件,

    前面提到檔案後綴可以省略,Nodejs嘗試載入的優先權 js檔案 > json檔案 > node檔案

建立一個自訂模組

   以一個計數器為例

跟我學Nodejs(三)--- Node.js模組_javascript技巧

複製碼 代碼如下:

var outputVal = 0;>

var outputVal = 0; var increment = 1;    //增量
/* 設定輸出值*/
function seOutputVal (val) {
    outputVal = val;
}
/* 增量設定🎜>function setIncrement(incrementVal){
    increment = incrementVal;
}
/* 輸出*/
function printNextCount()}
function printOutputVal() {
    console.log(outputVal);
}
exports.sesetputVal = seOutputVall; 🎜>module.exports.printNextCount = printNextCount;
自訂模組範例原始碼



範例中重點在於exports和module.exports;提供了外部存取的接口,下面調用一下看看效果吧

呼叫自訂模組

跟我學Nodejs(三)--- Node.js模組_javascript技巧

複製程式碼

程式碼如下:/*  模組,這個檔案可能是Javascript程式碼、JSON或編譯過的C/C 擴充。     重要的兩個物件:    require是從外部取得模組
    exports是將模組介面公開   
*/
var counter = remod./1_ console.log('第一次呼叫模組[1_modules_custom_counter]');
counter.seOutput 設定增量為10
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
/*
    requireue不會重複載入
*/
var counter = require('./1_modules_custom_counter');
console.log('第二次呼叫模組[1_modules_custom_counter]');
counter.printNext( );
自訂模式呼叫原始碼

    運作可以發現透過exports和module.exports對外公開的方法都可以存取!

    範例中可以看到,我兩次透過require('./1_modules_custom_counter')取得模組,但是第二次引用後呼叫printNextCount()方法確從60開始~~~

    原因是node.js透過requirerequire多次呼叫相同模組不會重複載入,Node.js會根據檔案名稱快取所有載入過的檔案模組,所以不會重新載入了

    注意:透過檔案名稱快取是指實際檔案名,不會因為傳入的路徑形式不一樣而認會是不同的文件    

    在我建立的1_modules_custom_counter檔案中有一個printOutputVal()方法,它並沒有透過exports或module.exports提供對外公開存取方法,

    如果1_modules_load檔案中直接存取運作會出現什麼樣的狀況呢?

    答案是:TypeError: Object # has no method 'printOutputVal'

exports和module.exports 區別

經過上面的例子,透過exports和module.exports對外公開的方法都可以存取!那既然兩種都能達到效果,但總得有點差別的吧~~~用個例子看看吧!

跟我學Nodejs(三)--- Node.js模組_javascript技巧

複製程式碼 程式碼如下:

var counterprint = 0; function (){   
    counter = 2;
    console.log(counter);
}
var isEq = (exports === module.exports);2_modules_diff_exports.js 檔案原始碼


下面再新建個2_modules_diff_exports_load.js檔案呼叫一下

跟我學Nodejs(三)--- Node.js模組_javascript技巧

複製程式碼 程式碼如下:
var Counter = require('./2_modul('./2_modv);
Counter.printNextCount();


    呼叫後,執行結果如上圖

    我在2_modules_diff_exports_load.js檔案中輸出了isEq的值  ( var isEq = (exports === module.exports); ),回傳的true

    PS:注意是三個等號,如果不清楚自已查查資料吧!

不用急著下結論,把這兩個JS檔分別改成module.exports對應的程式碼

複製程式碼 程式碼如下:
///修改過的2_modules_diff >var counter  = 0;    
module.exports = function(){   
    counter = 10;
    this.printNextCount = function()
   sole.log(counter);   
    }
}
var isEq = (exports === module.exports);
console.log(isEq);




複製程式碼

程式碼如下://修改過的2_modules_diff_modules_diff 🎜>var Counter = require('./2_modules_diff_exports');var counterObj = new Counter();
counterObj.printNextCount();

跟我學Nodejs(三)--- Node.js模組_javascript技巧

    呼叫後,執行結果如上圖

    我在2_modules_diff_exports_load.js檔案中輸出了isEq的值  ( var isEq = (exports === module.exports); ),傳回的false,這與先前得到的結果不一致!

    PS:不要用Counter.printNextCount();去訪問,你只會得到一個錯誤的提示

    API提供了解釋

    http://nodejs.org/api/modules.html

    註釋的一個位址引用。 nodejs只會導出module.exports的指向,如果exports指向變了,那就只是exports不在指向module.exports,於是不會再被導出

    參考其它理解:

    http://www.hacksparrow.com/node-js-exports-vs-module-exports.html

    http://zihua.li/2012/03/use-module-exports-or-exports-in-node/

    module.exports才是真正的接口,exports只不過是它的一個輔助工具。 最終回傳給呼叫的是module.exports而不是exports。

    所有的exports所收集到的屬性和方法,都賦值給了Module.exports。當然,這有個前提,就是module.exports本身不具備任何屬性和方法。
    如果,module.exports已經具備一些屬性和方法,那麼exports收集來的資訊將被忽略。

exports和module.exports 覆蓋

上面也基本上也明白了exports和module.exports的關係和區別,但如果同時針對printNextCount()方法存在exports和module.exports,結果如何?

跟我學Nodejs(三)--- Node.js模組_javascript技巧

呼叫結果

跟我學Nodejs(三)--- Node.js模組_javascript技巧

    從結果可以看出,並沒有報錯,表示可以這麼定義,但最終module.exports覆蓋了exports

    雖然結果不會報錯,如果這麼用開發中難免會有一些問題存在,所以

    1.最好別分別定義module.exports和exports

    2.NodeJs開發者建議導出物件用module.exports,導出多個方法和變數用exports

其它...

   API中也提供了其它的方法,就不細講了,在上面例子的基礎上自已動手一輸出就知道了

  module.id

  傳回string類型的模組標識,一般為完全解析後的檔名

  module.filename

  傳回一個string類型的完全解析後檔名

  module.loaded

  傳回一個bool類型,表示是否載入完成

  module.parent

  傳回引用此模組的模組

  module.children

  傳回該模組所引用的所有模組物件的陣列

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

WLAN擴充模組已停止[修復] WLAN擴充模組已停止[修復] Feb 19, 2024 pm 02:18 PM

WLAN擴充模組已停止[修復]

WLAN可擴充性模組無法啟動 WLAN可擴充性模組無法啟動 Feb 19, 2024 pm 05:09 PM

WLAN可擴充性模組無法啟動

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

一文聊聊Node中的記憶體控制

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

圖文詳解Node V8引擎的記憶體和GC

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

深入聊聊Node中的File模組

Python常用標準函式庫及第三方函式庫2-sys模組 Python常用標準函式庫及第三方函式庫2-sys模組 Apr 10, 2023 pm 02:56 PM

Python常用標準函式庫及第三方函式庫2-sys模組

Python程式設計:詳解命名元組(namedtuple)的使用要點 Python程式設計:詳解命名元組(namedtuple)的使用要點 Apr 11, 2023 pm 09:22 PM

Python程式設計:詳解命名元組(namedtuple)的使用要點

一起聊聊Node中的事件循環 一起聊聊Node中的事件循環 Apr 11, 2023 pm 07:08 PM

一起聊聊Node中的事件循環

See all articles