亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

跟我學Nodejs(三)--- Node.js模塊

2019-11-20 15:11:56
字體:
來源:轉載
供稿:網友

簡介及資料

    通過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文件

創建一個自定義模塊

   以一個計數器為例

復制代碼 代碼如下:

var outputVal  = 0;     //輸出值
var increment = 1;    //增量
/* 設置輸出值 */
function seOutputVal (val) {
    outputVal = val;
}
/* 設置增量 */
function setIncrement(incrementVal){
    increment = incrementVal;
}
/* 輸出 */
function printNextCount()
{   
    outputVal += increment;
    console.log(outputVal) ;
}
function printOutputVal() {
    console.log(outputVal);
}
exports.seOutputVal = seOutputVal;
exports.setIncrement = setIncrement;
module.exports.printNextCount = printNextCount;
自定義模塊 示例源碼

示例中重點在于exports和module.exports;提供了外部訪問的接口,下面調用一下看看效果吧

調用自定義模塊

復制代碼 代碼如下:

/*
    一個Node.js文件就是一個模塊,這個文件可能是Javascript代碼、JSON或者編譯過的C/C++擴展。
    重要的兩個對象:
    require是從外部獲取模塊
    exports是把模塊接口公開   
*/
var counter = require('./1_modules_custom_counter');
console.log('第一次調用模塊[1_modules_custom_counter]');
counter.seOutputVal(10);               //設置從10開始計數
counter.setIncrement (10);             //設置增量為10
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
counter.printNextCount();
/*
    require多次調用同一模塊不會重復加載
*/
var counter = require('./1_modules_custom_counter');
console.log('第二次調用模塊[1_modules_custom_counter]');
counter.printNextCount();
自定義模式調用 源碼

    運行可以發現通過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 #<Object> has no method 'printOutputVal'

exports和module.exports 區別

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

復制代碼 代碼如下:

var counter  = 0;    
exports.printNextCount = function (){   
    counter += 2;
    console.log(counter);
}
var isEq = (exports === module.exports);
console.log(isEq);
2_modules_diff_exports.js 文件源碼

下面再新建個2_modules_diff_exports_load.js文件調用一下

復制代碼 代碼如下:

var Counter = require('./2_modules_diff_exports');
Counter.printNextCount();

    調用后,執行結果如上圖

    我在2_modules_diff_exports_load.js文件中輸出了isEq的值  ( var isEq = (exports === module.exports); ),返回的true

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

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

復制代碼 代碼如下:

//修改后的2_modules_diff_exports.js源碼如下
var counter  = 0;    
module.exports = function(){   
    counter += 10;
    this.printNextCount = function()
    {
        console.log(counter);   
    }
}
var isEq = (exports === module.exports);
console.log(isEq);

復制代碼 代碼如下:

//修改后的2_modules_diff_exports_load.js文件源碼如下
var Counter = require('./2_modules_diff_exports');
var counterObj = new Counter();
counterObj.printNextCount();

    調用后,執行結果如上圖

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

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

    API提供了解釋

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

    Note that exports is a reference to module.exports making it suitable for augmentation only. If you are exporting a single item such as a constructor you will want to use module.exports directly instead
    exports僅僅是module.exports的一個地址引用。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只不過是它的一個輔助工具?!∽罱K返回給調用的是module.exports而不是exports。
    所有的exports收集到的屬性和方法,都賦值給了Module.exports。當然,這有個前提,就是module.exports本身不具備任何屬性和方法。
    如果,module.exports已經具備一些屬性和方法,那么exports收集來的信息將被忽略。

exports和module.exports 覆蓋

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

調用結果

    從結果可以看出,并沒有報錯,表示可以這么定義,但最終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

  返回該模塊引用的所有模塊對象的數組

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊是香蕉大人久久| 日韩欧美aⅴ综合网站发布| 中文字幕亚洲在线| 亚洲国产欧美一区二区丝袜黑人| 日韩电影视频免费| www.国产精品一二区| 亚洲自拍高清视频网站| 亚洲国产天堂久久综合| 久久视频在线免费观看| 欧美大荫蒂xxx| 伊人一区二区三区久久精品| 国外成人在线视频| 美日韩精品视频免费看| 91av在线播放视频| 欧美最近摘花xxxx摘花| 在线免费观看羞羞视频一区二区| 欧美大片va欧美在线播放| 亚洲天堂一区二区三区| 久久久久久久久久av| 国产精品自产拍在线观看中文| 日韩激情视频在线播放| 久久久久久久久久久91| 久久欧美在线电影| 午夜精品久久久久久久久久久久| 91sao在线观看国产| 亚洲va国产va天堂va久久| 国产日韩精品一区二区| 成人美女免费网站视频| 欧美激情中文字幕在线| 亚洲国产精品大全| 久久精品小视频| 国产精品免费视频xxxx| 亚洲奶大毛多的老太婆| 91在线视频免费| 久久久久久久爱| 成人情趣片在线观看免费| 国产一区二区三区视频在线观看| 亚洲成人久久电影| 国产a∨精品一区二区三区不卡| 久久久久久有精品国产| 国产中文字幕日韩| 成人写真视频福利网| 色噜噜亚洲精品中文字幕| 国产成人中文字幕| 欧美日韩福利视频| 岛国av午夜精品| 国内精品400部情侣激情| 亚洲美腿欧美激情另类| 日韩精品中文字幕在线| 国产性猛交xxxx免费看久久| 亚洲综合精品伊人久久| 久久久亚洲精选| 久久久久久国产免费| 5252色成人免费视频| 欧美性高跟鞋xxxxhd| 久久精品美女视频网站| 国产精品久久久久久久久久东京| 久久久国产精品视频| 国内精品久久久久久久| 国产精品福利在线观看| 国产精品第三页| 国产精品久久久久久久久| 国产精品亚洲美女av网站| 欧美日韩国产色| 色999日韩欧美国产| 国产婷婷97碰碰久久人人蜜臀| 九九久久国产精品| 欧美做爰性生交视频| 国模gogo一区二区大胆私拍| 亚洲视频一区二区三区| 欧美精品电影免费在线观看| 亚洲第一天堂av| 国产精品久久999| 中文字幕成人在线| 欧美丝袜美女中出在线| 国产精品一久久香蕉国产线看观看| 亚洲国产三级网| 欧美激情视频一区| 日韩色av导航| 日韩av在线影视| 日韩在线一区二区三区免费视频| 亚洲欧美日韩在线一区| 98精品国产高清在线xxxx天堂| 欧美一性一乱一交一视频| 成人黄色生活片| 色综合久久久久久中文网| 91大神福利视频在线| 欧美亚洲另类激情另类| 久久精品亚洲国产| 最近2019中文字幕第三页视频| 国产成人久久久精品一区| 国产精品7m视频| 中文字幕自拍vr一区二区三区| 精品久久久久久亚洲国产300| 亚洲国产精品资源| 亚洲精品国偷自产在线99热| 亚洲伊人久久综合| 久久久噜噜噜久久| 久久久成人的性感天堂| 久久精品视频亚洲| 九色成人免费视频| 国产精品99久久久久久久久| 亚洲在线观看视频网站| 欧美成年人在线观看| 亚洲美女中文字幕| 欧美中文字幕在线| 性色av一区二区三区在线观看| 久久国产精品久久久久久久久久| 国产精品吴梦梦| 亚洲国产97在线精品一区| 亚洲综合社区网| 一本大道亚洲视频| 亚洲国产精品成人精品| 黄色一区二区在线| 91精品久久久久久久久中文字幕| 欧美日韩美女在线观看| 欧美精品情趣视频| 日本久久久a级免费| 精品人伦一区二区三区蜜桃免费| 日本91av在线播放| 欧美性猛交xxxx富婆| 久久久精品中文字幕| 国产精品一区二区性色av| 亚洲一区二区三区在线视频| 久久福利视频导航| 亚洲片国产一区一级在线观看| 亚洲激情自拍图| 夜夜躁日日躁狠狠久久88av| 日韩精品免费看| 亚洲天堂2020| 国产精品成人免费电影| 欧美人成在线视频| 久久精品在线播放| 美日韩精品免费观看视频| 亚洲欧洲免费视频| 在线观看不卡av| 性色av一区二区三区在线观看| 亚洲aⅴ男人的天堂在线观看| 国产xxx69麻豆国语对白| 国内成人精品视频| 亚洲国产天堂网精品网站| 亚洲综合自拍一区| 亚洲国产天堂久久综合| 国产精品欧美风情| xvideos亚洲人网站| 日韩免费av片在线观看| 国产三级精品网站| 一区二区三区无码高清视频| 精品久久久久久久久久| 国产精品人成电影在线观看| 亚洲视频免费一区| 欧美日韩国产激情| 欧亚精品在线观看| 精品久久久一区二区| 久久在线免费观看视频| 国产一区二区三区视频免费| 欧美激情免费看| 国产成人一区二区| 国产精品久久久一区| 欧美福利在线观看| 日韩h在线观看| 亚洲资源在线看| 成人免费网视频| 日韩视频永久免费观看|