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