共计 2099 个字符,预计需要花费 6 分钟才能阅读完成。
提前申明: 本文皆以本人为视角来记录本人学习 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’)找到该模块。