2018-10-07Nodejs的笔记(1)

2018-10-30  本文已影响0人  EWL

nodejs对于前端开发的好处

前端职责扩大,统一开发体验
适合于高并发 I/O密集的场景(web就是典型的I/O密集场景,例如读取静态资源、网络请求I/O等等)

nodejs简要相关

nodejs自己的模块规范是CommonJS。 global对象是nodejs的全局对象,类似于浏览器上的window,上面挂载着常用的全局属性和方法

本次的学习内容是从环境以及调试入手,分别有以下内容:

  1. commonJS
    不同于浏览器的requireJS这样的模块管理系统,nodejs拥有自带的模块管理系统,即commonJS。

疑问01:关于循环引用的解释

在chrome中可以使用chrome://inspect来调试对应的node应用,从中可以看到单个node模块的全貌, 如下。

image.png
点击target部分的inspect就可以进入调试页面
image.png

可以看到单个模块的代码全部被包裹在一个function中,并且该function有五个参数,分别对应

疑问02: exports和module.exports有何区别?

  1. global全局对象
    类似于浏览器环境下的全局变量window,nodejs也有自己的全局变量global,当然这两个全局变量下面拥有的属性方法自然不尽相同,但是即使在nodejs下面错误地使用了浏览器环境下的变量或者方法也不会出现报错的情况,只是会提示undefined。
    其次,nodejs中并没有浏览器中的DOM或者是BOM,它只包含了核心的ECMAScript。

  2. process
    表示当前执行的进程,它挂载在global下,它同样是一个对象,拥有一系列属性。本次学习的有主要四个常用的属性。

解决疑惑

module.exports.test = 'A';

const modB = require('./04_modB');

console.log('modB.test in modA',modB.test);

module.exports.test = 'AA';

B模块如下:

module.exports.test = 'B';

const modA = require('./03_modA');

console.log('modA.test in modB', modA.test);

module.exports.test = 'BB';

同时引用了这两个模块的文件如下:

const modA = require('./03_modA');
const modB = require('./04_modB');

console.log(modA.test);
console.log(modB.test);
image.png

为什么会出现第一句的情况,这就要从nodejs中模块加载执行的规则说起,一旦模块加载了就不会再进行一次加载,只会从上一次加载的内容中抽取内容进行剩余代码的执行,那么此时就会出现,在main文件中,当A模块在加载时,逐行执行到加载B模块的部分,就直接进入到B模块中逐行执行B模块的内容,恰好在B模块中遇到了加载A模块的代码,此时A模块已经加载过了,那么就会从已加载的部分中抽取需要的内容,此时的module.exports.test仍然还是,并没有执行到修改test为AA的部分,所以输出为A,这就是为什么第一行输出的是A而不是AA。等到B模块全部加载结束,就又回到A模块的部分,继续向下执行,然后全部执行结束之后,再继续进行main中B模块的加载流程,同样的流程加载结束之后,再去打印二者的test时就已经是修改过的AA与BB了。

上一篇 下一篇

猜你喜欢

热点阅读