nodejs 模塊以及加載機制,主要討論找不到模塊的問題


  

  最主要的一個思想,加載模塊無非就是找到模塊在哪,只要清楚了模塊的位置以及模塊加載的邏輯那么找不到模塊的問題就迎刃而解了。本文只是綜合了自己所學的知識點進行總結,難免出現理解錯誤的地方,請見諒。

 

nodejs的模塊分類

  1、原生模塊:http  fs path等,這些模塊都在源碼包的lib目錄下面,nodejs安裝好之后是找不到這些模塊的,都作為node.exe的一部分了,require這些模塊永遠沒問題的,如果哪天出現問題了,直接重啟電腦或者重裝node。有什么疑問可以通過下載源碼對這些原生模塊的功能進行查看。地址:https://nodejs.org/download/

  2、文件模塊:第三方模塊,例如express等,通過npm安裝的模塊都是第三方模塊。經常找不到的也是這些個模塊了。

  3、文件模塊:我們自己寫的模塊,之所以獨立出來是因為其加載和另兩種模塊有區別。

 

怎樣定義模塊

  nodejs聲明一個模塊有2中做法

    exports.module_name

    module.exports

  關於這兩個的區別也很簡單,不過要講明白很費勁,關鍵點在於知道有 module 這個全局變量的存在,打印出來並做幾次嘗試,就完全明白了,這里有一篇非常精彩  的關於這兩者異同的文章:http://www.cnblogs.com/kongxianghai/p/3936197.html

 

第三方模塊安裝在哪(NPM)

  幾條命令

npm config get/set prefix //查看設置全局安裝目錄,全局安裝的模塊就安裝該目錄下面的node_modules目錄下

npm install [-g]  // -g 全局安裝,模塊將會安裝到全局目錄下。不帶 -g 則直接安裝在當前所在目錄下,即為本地安裝

 

模塊的存在形式

  1、文件包含,這個比較直觀,直接指定到文件名(去掉 .js 后綴),就可以得到文件里面所有導出的模塊。

  2、文件夾包含,通過npm安裝的第三方模塊都是這種方式,指定到模塊所在的文件夾,該文件夾就是模塊名,以express為例:

    

    加載代碼:var ex = require('express')

    加載機制:

      首先搜索當前目錄下的 package.json 文件,查找里面的mian屬性,如果存在,則加載該屬性所指定的的文件。

      如果不存在 package.json 或者該文件里面沒有main字段,nodejs將試圖加載 index.js 

      都不存在那么就只有說一聲Cannot find module了。

 

模塊在哪些地方搜索(針對第三方模塊)

  1、逐級往上查找

    在此介紹一個全局變量  process   里面包含了nodejs進程運行的所有信息,在此打印一下 process.mianModule

    

    很明顯,nodejs會從當前目錄開始逐級往上搜索node_modules,找得到當然最好,找不到那么就會繼續找node_path這個環境變量了。

  2、環境變量node_path

    如果環境變量中有node_path的存在,並且該變量的值為全局安裝的目錄,那么也不會出現找不到模塊的錯。

    關於eclipse、sublime等IDE的node_path沒有問題,如果遇到的話,可以給它們單獨配置。當然,插件得先裝好啊。

    eclipse

    右鍵 -> Run As -> Run Configurations... 找到下面的界面

    

 

    Sublime

    Preferences -> Package Settings -> Nodejs -> Settings-Default

    

    填一下node_path

require('這里應該怎么填')

  1、相對路徑指定模塊,一般用於加載自己的模塊。

    必須用到的符號: ./ 表示當前目錄,相對路徑所相對的就是當前的目錄

                  ../ 表示上一級模塊,可以無限使用直到跳轉到根目錄

    這兩個符號必須以其中一個開頭,比如想加載當前目錄下的另一模塊,假設文件名為 hello.js 當前所在文件為 hi.js 我們需要在hi.js文件中這樣寫:

    var hello = require('./hello')//變量名隨意,一般慣用文件名

    在此基礎上,再加入文件夾的名字,我們就可以加載到我們自己所寫的任意模塊了。

  2、絕對路徑指定模塊地址,除了原生模塊之外,任何文件模塊都可以加載到,除非路徑出錯了。比如我們可以這樣子加載express模塊,以我的express模塊所在路徑為例。

  

  這種情況下,還可以給express隨便改名字,比如我把express的文件夾名改為ex

  var ex = require('F:\\nodejs\\node_modules\\ex')

  也是可以的。

  3、直接使用 require('xxx') 那么所加載的模塊要么是原生模塊,要么該模塊在某個node_modules目錄下面

 

 

 

    

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM