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

nodejs对于前端开发的好处

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

nodejs简要相关

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

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

  • commonJS
  • 引用系统内置模块/引用第三方模块
  • global变量
  • process进程
  1. commonJS
    不同于浏览器的requireJS这样的模块管理系统,nodejs拥有自带的模块管理系统,即commonJS。
  • 每一个文件就是一个模块,每一个模块都有自己的作用域(防止全局变量污染)
  • 在模块的内部module就代表着模块本身
  • 每一个模块的module.exports表示该模块的出口,可以向其他模块输出一些变量属性或者是方法函数。
  • 每一个模块在加载时就会执行,而一旦加载过下一次再进行加载时就会从缓存中抽取内容了,比如代码中如果有console.log这种操作,那么再次进行require的话就只会打印第一次。这一点可以用于解释Nodejs中循环调用的结果。当然,要避免循环引用。

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

  • 在使用require进行模块引用的时候,会在js json node这三种文件后缀名中依次进行对比检查,检查到之后就进行引用,都检查不到的话就报错。常用的自然是js 和 Json, node就比较少用。 这也就说明require文件的时候可以不用书写文件后缀名。
  • 在模块中书写的变量会变成模块的私有变量,而书写在global上的变量会变成整个的全局变量,挂载在global这个全局变量上,如果需要向全局暴露一些内容,可以通过给global变量添加属性的方式进行。

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

image.png

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

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

  • exports(一个对象)
  • require (一个方法函数,用于调用其他模块)
  • module (一个对象,里面有众多属性,包括常见的exports,前面做过介绍,表示当前模块)

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

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

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

  • argv (参数 , 包括了程序所在的路径,以及当前执行文件的文件路径,执行脚本命令的后续参数,比如(node test.js --test testVal01=1 testVal02=2,此时的argv就是 Node的路径,test.js的文件路径,以及--test,testVal01=1,testVal02=2))
  • argv0 (argv的首个参数值的引用 )
  • execArgv (字面意思可以翻译为执行参数,即node --inspect test.js --test testVal01=1 testVal02=2里面的--inspect,且该变量是一个数组)
  • execPath (字面意思为执行路径,表示执行这个脚本是从哪里执行的,即node所在的路径

解决疑惑

  • 疑问01:
    举例来说,假设有两个模块A与B
    A模块如下:
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了。

  • 疑问02:
    exports 实际上是module.exports的一个快捷方式,可以修改它的属性,但是不可以直接修改它的指向,像是通过对象字面量覆盖的方式,会使得exports不再是module.exports的快捷方式了,而是直接指向了另一个对象,在这样的情况下,别的模块来引用该模块的时候,输出就会变成undefined。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,612评论 2 41
  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,656评论 0 16
  • Node.js第一天 1. 初识Node.js 1.1 Node.js是什么 Node.js® is a Java...
    再见天才阅读 4,727评论 1 24
  • 我来自南方的一个小村庄。 在我还小时,我的父母经常说我的饭量大得惊人。 我的父母还经常对我说:“你再这样吃下去,我...
    会疼这思念阅读 200评论 0 2
  • 此时洛寒静静的看着陆机,只见陆机快步走到那茅屋门前,而后抬起手来,迅速的向其门上连击三声,同时嘴里低声说道:“有人...
    时於归阅读 229评论 0 0