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
注意不能改變這兩者的指向引用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章