1. 程式人生 > >nodejs基礎教程--require 、module和exports

nodejs基礎教程--require 、module和exports

一 require

1 a是內建模組(優先順序0)

require('a') //返回該模組

2(以 “./” 或者 “/” 或者 “../” 開頭 )(優先順序1)


require('./a.js')
//或
require('./a')

node的搜尋順序是這樣的。
在“a”父檔案的路徑下搜尋
將 a 當成檔案,依次查詢下面檔案,只要其中有一個存在,就返回該檔案,不再繼續執行。

//
a 
a.js
a.json
a.node
//即 檔名稱- > .js -> .json -> .node
//如果都搜尋不到 返回 Cannot find module './a'

3 a為資料夾時(優先順序2)

。。。

//當前檔案根目錄假設為 E:\nodejsTest\test0\hello.js
require('./a')
//新建index.js 目錄:E:\nodejsTest\test0\a\index.js
console.log("我是 a資料夾的 index.js")

//如果(優先順序1)找不到,將a當做目錄搜尋,如下。

a/package.json(main欄位)
a/index.js
a/index.json
a/index.node

4 a不帶路徑(優先順序3)

require('a')

node 從當前模組的父目錄+/node_modules 這個位置嘗試載入。
如果還是沒有找到,那麼它跳到上層目錄並依此類推,直到找到模組,或者達到根目錄為止。

如果在檔案 ‘/xxxx/xx/test/bb.js’ 中呼叫 require(‘a.js’),那麼 node 將在下列位置查詢,順序如下:

•/xxxx/xx/test/node_modules/a
•/xxxx/xx/node_modules/a
•/xxxx/node_modules/a
•/node_modules/a

總結:搜尋優先順序 內建模組 -> 檔名 -> 目錄名 -> node_modules目錄->not found

二module

module 儲存提供和當前模組的一些資訊

//當前檔案目錄 E:\nodejsTest\test0\hello.js
console.log(module)

輸出

Module {
  id: '.',
  exports: {},//這個等下exports中會提到
  parent: null,          //父模組 ,為null說明沒有父模組
  filename: 'E:\\nodejsTest\\test0\\hello.js',      //模組的絕對路徑,
                                                //console.log(__filename) 可以得到。
  loaded: false,   //輸出這些內容時,模組還沒有全部載入,所以 loaded 屬性為 false
  children: [],//子模組 
  paths:  //模組可能的位置
   [ 'E:\\nodejsTest\\test0\\node_modules',
     'E:\\nodejsTest\\node_modules',
     'E:\\node_modules' ] }
require('./1.js')
console.log(module)
//輸出

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: 'E:\\nodejsTest\\test0\\hello.js',
  loaded: false,
  children: //子模組 
   [ Module { 
       id: 'E:\\nodejsTest\\test0\\1.js',  //子模組的id
       exports: {},
       parent: [Circular],
       filename: 'E:\\nodejsTest\\test0\\1.js',
       loaded: true,
       children: [],
       paths: [Object] }
    ],
  paths: 
   [ 'E:\\nodejsTest\\test0\\node_modules',
     'E:\\nodejsTest\\node_modules',
     'E:\\node_modules' ] }

三exports

nodejs和js的一個不同點就是作用域。比如說js的頂級物件是Windows,而nodejs是global
nodejs的作用域分3種
區域性變數,作用域:定義該變數的函式內
區域性全域性變數,作用域:定義該變數的JS檔案
公共全域性變數,作用域:程式內可訪問global物件的任何一個地方

var a=100
global.a=200;
console.log(a)//輸出 100
console.log(global.a)//輸出 200

在專案中我們時常會用到公共變數。並不推薦global。

a.js
var a=100;
在 b.js
require('./a.js')

console.log(a);//拋 a is not defined

b.js並不能訪問a中的變數。
我們有兩種方法能使他訪問到。
1這裡寫圖片描述
開發中並不推薦使用global。

2 exports

a.js
var a=100;
module.exports.a=a
在 b.js
var mya=require('./a.js')//這個方法的返回值,其實就是該模組中的module.exports物件。

console.log(mya);//輸出{a:100}

3 module.exports 和exports
這裡寫圖片描述
輸出 true
注意不能改變這兩者的指向引用