提前申明:本文皆以本人为视角来记录本人学习node的过程,故不当做教程公布。刚开始初学不乏有认知谬误的中央,请读者斟酌,如有误还望评论区内指出,鄙人定不耻下问虚心求救,一起晋升。

每种语言都有本人的运行环境,什么是运行环境?javaScript这门语言为什么能够在浏览器中运行?换句话说,为什么浏览器能够辨认javascript这门语言的代码?为什么我就不能用java,C++,这种语言来开发网页呢?这样解释的话,浏览器就是javaScript的运行环境。

具体为什么会呈现Node这个货色,那就要说起服务器和数据库I/O性能的问题了,因为服务器和数据库的I/0输入输出模式,导致了这部分为了解决高并发问题优化起来十分艰难,那么怎么晋升web性能呢?只能从传统的客户端到服务器这一头传统的java ,c语言写出的服务器脚本都是多线程,客户端每向服务器发送一个申请,就会调配一个线程来为这个申请服务,而服务器到数据库申请的过程中,这个服务器线程是没事干的。就好比一去餐厅吃饭,餐厅为每一个桌都调配一个服务员,而服务员和你沟通的工夫就仅仅只有点菜的工夫,她把菜单给厨师,厨师在炒菜的期间,她都还在你背后等着菜进去。

这样就节约了很多内存资源,双11对电商服务器的压力可想而知。

而node是JS的运行环境,JS是单线程,通过异步编程,这样就不会有资源的节约,就好比餐厅只有一个服务员,然而她能够一秒实现对你的服务,超级服务员(你大可不必在这里抬杠)。

你又可能会有疑难,那为什么我不多加几个厨师呢?

这就是服务器和数据库之间交换的硬件性能问题,数据库寄存在硬盘中,硬盘的读取速度是取决于硬件的品质,是事实里存在的硬件,就会有晋升的瓶颈,会有极限,而编程思维是没有限度的,同样一个工作的函数代码能够有不同的写法,情理是一样的。

又或者你能够间接了解成,刚开始的时候,js也就只是用来和浏览器打交道的,然而随着日益的需要,前端人员发现和后端交互的时候还不如本人写接口,于是乎,就有人创造了另外一种运行环境 node.js,你别在node这个英文单词上死钻牛角尖,没必要,你就晓得这货色能够让你用js代码开发后端的相干的货色。

你须要理清这个概念,DOM,BOM这货色可不是js自身这门语言所有的,这可是浏览器环境提供给你更不便的开发页面成果的API。Node说,既然我大哥浏览器环境都给你这么多API了,那我也给你一点吧。然而这里须要咱们思维上有个转变,间接dom,bom都是和浏览器打交道,那些扭转能够直观的在浏览器上展现进去,然而后端就是和数据打交道的,思维上要有转变,不能还依照之前前端的思维来思考这些问题了。

一.模块化思维

模块能够是一个.js文件等一些货色,很形象。因为我的学习过程是 三剑客-->react。所以我对es6的模块化比拟相熟,了解node中的这个也比拟容了解承受。然而咱们须要留神的是,node里遵循的是common.js标准,而咱们浏览器端应用的是es6语法,node当初也能够完满反对es6的新的引入或者导出的规定,然而仍有不可代替的中央,比方import必须在头部引入,无奈作为逻辑判断来进入函数外部。

比方if语言,你不能够这样编写你的代码


然而common.js却能够在逻辑判断中按需要引入。


1.2 模块的底层原理

我在nodeText文件夹下创立了两个文件



咱们都晓得,在我编写了一个js文件后,它就是能够被当作一个模块来应用,那咱们在nodeOutPut里引入。


这里咱们须要晓得的是,require办法会将那个门路里的js文件内的代码编程成一个对象来引入。通过打印CCC的类型就能够晓得其实是一个对象。这也就解释了为什么能够通过解构赋值的办法引入react的hooks

import {useState,useEffect} from 'react'


咱们runcode一下,能够看到控制台输入了咱们在Text.js里编写的代码。

留神⚠️:特地重要的概念 在这个nodeText.js模块里,node其实在外层包裹了一个函数,所以在这个外面定义的所有变量都是局部变量,这也就解释了为什么全局对象global身上没有这两个属性。

arguments.calee示意正在执行这个代码的参数,+" "示意让arguments.callee这个被执行的函数toString变成字符串拼接的模式打印进去,后果如下。

外壳的函数一共有五个参数

1.exports是module参数的一个属性,它和module.exports指向同一个对象地址,而module就是这个模块自身,module.exports.AAA= console.log(“a”)也就是裸露进来本人module身上的exports对象里的AAA办法。
2.require就解释了为什么你能够间接应用require这个办法而不需引入。
3._filename和_dirname很好了解,filenae准确到你这个自身,准确到index.js,而dirname准确到这个文件所在的文件夹。这就解释了为什么别的模块能够通过require('./nodeText')找到该模块。