nodejs基础篇--模块化知识点

64 阅读2分钟

模块化

前端项目要遵循模块化(当然还有什么组件化,工程化等等),因为模块化编程首先好维护,如果全部堆在一个文件里,出问题了都要找半天,其次代码会显得更简洁,比如写后端代码时,以app.js代表入口文件,那一个项目的接口肯定不止一个,如果全部堆在入口文件里就显得很臃肿,并且还有其他的一些第三方工具的配置什么的,整个项目就很乱七八糟,所以尽量保证入口文件简洁。

比如:

app.js里看起来似乎整个项目没有什么代码,但是每个功能模块都被分到它们应该呆的文件夹里,比如app.js引入一个自定义模块config,config.js内部又去引入了别的模块,包括第三方模块和自定义模块,引入的模块里可能又引入了别的模块。

commonjs规范

在学commonjs之前,大多数是接触的es6的模块化编程,import引入,export导出,而commonjs模块定义是需要require()指定依赖,使用exports对象定义自己的公共API,比如:

我在app文件中引入了一个自定义模块tool.js

tool.js文件中导出了一个我需要的模块,注意导出的是个对象,所以我直接在app.js中进行解构赋值了。

随后执行这个app.js,得到:

在commonjs规范中还存在一个exports,它和module.exports指向同一个内存空间,不过最后都是以module.exports为准,所以最好不要一个文件同时出现exports和module.exports,推荐都用module.exports.

es6的模块化和commonjs的区别

es6中只要代码中有import xxx 就一定是先解析这个import,哪怕你写在最后一行也是先解析这个import的文件,但是require就不一样了,它就是按照顺序去解析引入的文件,举个栗子:

在text1.js文件中输出text1

在text.js文件中先输出text再导入text1模块

结果:

因此可以看出,在js文件中,import会优先被解析

而require就不一样了

通过控制台输出可以明显看见这是按顺序执行的,先打印app,随后遇到require才去解析执行被导入模块

require时发生了什么

文字太苍白了,直接画图来的清晰明了