提前声明:本文以自己的角度记录了学习node的过程,因此不作为教程发布。初学者刚开始有很多认知错误,请多多思考,如有错误请在评论区指出,不耻下问,共同进步。每种语言都有自己的运行环境,什么是运行环境?为什么javaScript语言可以在浏览器中运行?也就是说,为什么浏览器可以识别javascript这门语言的代码呢?为什么我不能用java、C++这种语言来开发网页呢?这样,浏览器就是javaScript的运行环境。具体为什么会出现Node,先说说服务器和数据库的I/O性能,因为服务器和数据库的I/O输入输出方式,使得这部分解决高并发问题的优化难度很大。那么如何提高网页性能呢?它只能从传统的客户端到服务器。传统的java和c语言服务器脚本都是多线程的。每次客户端向服务器发送请求时,它都会分配一个线程来为请求服务。在数据库请求的过程中,这个服务器线程是无事可做的。就像去餐厅吃饭,餐厅给每张桌子都分配了一个服务员,而服务员跟你交流的时间只有在点菜的时候。她把菜单交给厨师,厨师做饭的时候她还在你面前。等待食物出来。这样浪费了大量的内存资源,双十一期间电商服务器的压力可想而知。而node是JS的运行环境,JS是单线程的,通过异步编程,这样就不会造成资源浪费,就像餐厅里只有一个服务员,但她可以在一秒内完成你的服务,超级服务员(你可以不用在这里争论)。大家可能又会有疑问了,我为什么不多加几个厨师呢?这是服务器和数据库之间的硬件性能问题。数据库存储在硬盘中,硬盘的读取速度取决于硬件的好坏。是现实中存在的硬件,提升会有瓶颈,会有极限。编程思想没有限制。同一个任务的功能代码可以有不同的写法,道理是一样的。或者你可以直接理解,一开始js只是用来跟浏览器打交道的,但是随着需求越来越大,前端人员发现和后端交互的时候写接口比较好,所以,有人发明了另一种运行环境node.js。不要卡在英文单词节点上。这不是必需的。你知道这个东西可以让你用js代码开发后端相关的东西。你需要澄清这个概念。DOM和BOM不属于js语言本身。这是浏览器环境提供的API,方便您开发页面效果。Node说,既然大哥的浏览器环境给了你那么多API,那我也给你一些吧。但在这里我们需要改变我们的想法。直接dom和bom都是和浏览器打交道的。那些变化可以直观地显示在浏览器上,但后台处理的是数据。必须要有思想上的转变。按照之前前端的思路来思考这些问题。1.模块化思维模块可以是.js文件之类的东西,非常抽象。由于我的学习过程是三剑客-->反应。所以我比较熟悉es6的模块化,在node.js中更容易理解和接受这一点。但是需要注意的是,node遵循common.js规范,而我们的浏览器使用的是es6语法。Node现在可以完美支持es6新的import或者export规则,但是还是有不可替代的地方,比如import,必须在头部引入,不能作为进入函数的逻辑判断。比如语言,你的代码不能这样写,但是逻辑判断需要引入common.js是可以的。1.2模块底层原理我在nodeText文件夹下创建了两个文件。众所周知,我写完一个js文件后,可以作为一个模块使用,所以我们在nodeOutPut中导入。这里我们需要知道的是,require方法会将那个路径下的js文件中的代码编程成一个对象导入。通过打印CCC的类型,可以知道它其实是一个对象。这也解释了为什么可以通过解构赋值的方式从'react'引入react的hooksimport{useState,useEffect}。runco??de,可以看到控制台输出了我们用Text.js写的代码。注意??:一个特别重要的概念是在这个nodeText.js模块中,node实际上在外层包裹了一个函数,所以这里定义的所有变量都是局部变量,这也解释了为什么全局对象global没有这两个属性.arguments.calee表示正在执行的代码的参数,+""表示arguments.callee的执行函数toString会以字符串拼接的形式打印出来,结果如下。shell的函数一共有五个参数1.exports是module参数的一个属性,指向和module.exports相同的对象地址,module就是模块本身,module.exports.AAA=console.log("a")也就是在自己模块的exports对象中暴露AAA方法。2.require解释了为什么可以不引入require方法直接使用。3、_filename和_dirname好理解,filenae准确到自己的,准确到index.js,dirname准确到文件所在文件夹。这就解释了为什么其他模块可以通过require('./nodeText')找到这个模块。
