nodejs基礎教程--require 、module和exports
阿新 • • 發佈:2019-01-05
一 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
注意不能改變這兩者的指向引用