Node.js学习笔记——模块

2019 / 11 / 30

前言

来了上海,开启了新的职业生涯,作为一个程序员,职业生涯中除了规划自己未来的职业发展之外,还有很大的一部分是需要规划好自己该学习什么,如何让技术成长,因为除了职业素养,工作能力,沟通表达之外,技术人员要想进阶,技术提升是必不可少的,而自己其实本身是一个学工程的计算机门外汉,对于计算机的各种发展史,语言,各种编程模式,解决问题的范式都是一知半解的,对数据结构和算法,网络协议,操作系统等也只是知道个中概念。但其实自己慢慢学的越多便越能知道自己的盲区有多大,自己应该去补哪些盲区,也慢慢想清楚自己应该如何去成长等等。

学习node的crypto, net, process, stream, buffer, events, module可以非常好的理解许多原理性的知识,可以扩充前端在算法,网络,流处理,操作系统,事件模型,模块化开发等多方面的知识。

新的一年要变成一个真正的通过计算机的原理去思考问题的程序员

模块查找

nodejs采用commonjs模块规范,可以通过module.exports和require来导出引入。

优先找系统缓存,系统缓存是指被执行的模块会被缓存起来,优先存缓存里取,有的话就不需要找文件了。

然后在系统模块,比如fs, path等等

然后找文件,比如./a,文件模块会依次查找./a.js, ./a.json, ./a.node, 文件查找是同步阻塞的。

然后找目录,文件没找到就会去找目录,比如./a会找同级下的a文件夹找到了先看有没有package.json,有的话会把它当作包来处理,看package.json的入口文件即main参数,main参数没有或者指向的文件不存在,就会找文件夹下的index文件,依次找index.js, index.json, index.node,再没有就只能报错了。

然后找node_modules下的包。

模块中的缓存可以通过require.cache来读取,长这样

划个重点:优先查找缓存

模块的循环引用

node对于导出的模块默认是一个空对象,因为又缓存所以出现循环引用的时候就可以找到缓存里的值,就不会出现循环引用的问题。

比如a引用了b,b引用了a

首先执行a文件的时候发现引入b

然后就会把b文件执行一遍,发现b中又引入了a,这个时候又去回头执行a,发现a已经被执行了并且在缓存里了,所以就会引入一个空对象a

但其实a还没被执行完,所以一直到a执行module.exports之前其他地方引入a都是一个空对象

模块的多次引用

和上边的问题一样,模块第一次引入的时候会去执行文件,但是多次引入的时候由于已经有缓存了就不会再继续引入了。

exports 和 module.exports

正常情况下exports是指向module.exports的,所以我们写exports.a = 1的时候相当于写了module.exports.a = 1,那么如果写个exports = 1,那么module.exports 当然不会变成1,他依然是原来的值,默认值是{}。

嗨,请先 登录

加载中...
(๑>ω<๑) 又是元气满满的一天哟