一 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
注意不能改变这两者的指向引用