本文将挑战您的Node.js知识的极限。
在Ryan Dahl首次提出Node.js之后不久,我就开始学习它。即使在一年前,我也无法回答我在本文中提出的许多问题。如果您能真正回答所有这些问题,那么您对Node.js的了解将非常出色。我们应该成为朋友。
我认为这一挑战会让您感到惊讶的原因是,我们中的许多人大多数都是以错误的方式学习Node。有关Node的大多数教程,书籍和课程都专注于Node生态系统,而不是Node运行时本身。他们会教你使用Node时, 使用Express和Socket.io等所有可用包可以做什么,而不是讲授Node运行时本身的功能。
这些也有有理由的, Node是一个具有弹性的原始的, 它本身没有提供完整的解决方案, 而是提供了丰富的运行时,使您能够编写自己的解决方案。诸如Express.js和Socket.io之类的库更像是完整的解决方案,因此教那些库更有用处,使学习者使用这些完整的解决方案马上解决一些问题。
传统的观点似乎是,只有那些编写Express.js和Socket.io之类的库的人才需要了解有关Node.js运行时的一切。但是我认为这是错误的。在使用那些完整的解决方案之前,最好对Node.js运行时本身有扎实的理解。您至少应具有知识来判断判断第三方库是不是适合自己。
这就是为什么我决定创建一个完全致力于纯Node的Pluralsight课程的原因。在对该课程进行研究时,我整理了一系列具体问题供您确定您对Node运行时的知识是否已经足够强大,或者是否可以加以改进。
如果您能回答其中大多数问题,并且正在寻找工作,请告诉我!另一方面,如果大多数这些问题使您感到陌生,那么您只需要使多多学习Node运行时本身。您的知识将使您成为更理想的开发人员。
Node.js的知识挑战
其中一些问题简短而容易,而另一些则需要更长的答案和更深的知识。它们都以不特定的顺序显示。
我知道您在阅读此列表后会想要答案。下面的建议部分提供了一些答案但不是全部,但在此之后,我还将在一系列freeCodeCamp文章中回答所有这些问题。
- V8与Node.js的关系? Node没有v8是否也能工作?
- 在任何Node.js文件中声明全局变量时,为什么它并不是对所有模块真正都是全局变量呢?
- 当导出一个模块或者API, 为什么有时使用exports有些时候使用module.exports?
- 我能require一个本地文件不使用相对路径吗?
- 能使用不同的版本的同一个库在一个nodejs应用中吗?
- 什么是Event Loop? 他是V8的一部分吗
- 什么时候Call Stack? 他是V8的一部分吗
- setImmediate和process.nextTick有什么区别?
- 如何使异步函数返回值?
- 回调函数是否可以与promises一起使用?
- 哪些Node模块是底层模块?
- spawn,exec和fork之间的主要区别是什么?
- 集群模块如何工作?与使用负载均衡器有何不同?
- 什么是--harmony- *标志?
- 您如何读取和检查Node.js进程的内存使用情况?
- 当调用堆栈和事件循环队列都为空时,Node将做什么?
- 什么是V8对象和function templates?
- 什么是libuv?Node.js如何使用它?
- 如何使Node的REPL始终使用JavaScript严格模式?
- 什么是process.argv?它保存什么类型的数据?
- 如何在Node进程退出之前执行一项最终操作?该操作可以异步完成吗?
- 您可以在Node的REPL中使用哪些内置点命令?
- 除了V8和libuv,Node还具有其他哪些外部依赖项?
- process uncaughtException 事件时候触发, 会有问题怎么处理?与退出事件有何不同?
- _在REPL的REPL内部是什么意思?
- Node buffers 使用 V8 内存吗? 他们被能 resized吗?
- Buffer.alloc和Buffer.allocUnsafe有什么区别?
- buffers上的slice方法与数组上有什么不同?
- string_decoder模块有什么用?与casting buffers强制转换为字符串有何不同?
- require函数执行的5个主要步骤是什么?
- 如何检查本地模块的存在?
- package.json中的main属性有什么用?
- 什么是Node中的循环模块依赖关系,如何避免?
- require函数将自动尝试的3个文件扩展名是什么?
- 创建http服务器并为请求编写响应时,为什么需要end()函数?
- 什么时候可以使用文件系统* Sync方法?
- 如何只打印一层深层嵌套的对象?
- node-gyp软件包用于什么?
- export require module他们都是全局的, 但是每次使用的时候他们是不同的 怎么做到的?
- 如果执行的node脚本文件只有一行:console.log(arguments);,则node将打印什么内容?
- 一个模块如何既可以被其他模块require又可以使用node命令直接执行?
- Node中的内置流可读写的示例是什么?
- 在Node脚本中执行cluster.fork()行时会发生什么?
- 使用event emitters和使用简单的callback来允许异步处理代码有什么区别?
- console.time函数有什么用?
- 可读流的暂停模式和流动模式有什么区别?
- --inspect参数对node有什么作用?
- 如何从连接的socket中读取数据?
- require函数始终缓存所需的模块。如果需要在每次require时都执行一些代码,该怎么办?
- 在使用流时,何时使用管道功能以及何时使用事件?这两种方法可以结合使用吗?
我学习Node.js运行时的最佳方式
学习Node.js可能具有挑战性。以下是我希望在此过程中对您有所帮助的一些准则:
学习JavaScript的优秀部分并学习其现代语法(ES2015及更高版本)
Node是在VM引擎之上的一组库,可以编译JavaScript,因此不用说JavaScript本身的重要技能就是Node重要技能的一部分。您应该从JavaScript本身开始。
您了解函数,作用域,绑定,this关键字,new关键字,闭包,类,模块化,原型,回调和promise吗?您是否知道可以在数字,字符串,数组,集合,对象和映射上使用的各种方法?使自己熟悉此列表中的项目将使学习Node API更加容易。例如,在充分了解学习回调函数之后再去学习“ fs”模块方法。
了解Node的非阻塞性
callback和promise(以及generators/async)对于Node尤其重要。您需要了解异步操作如何成为Node中的头等大事。
您可以将Node程序中代码行的非阻塞性质与订购星巴克咖啡的方式(在商店中,而不是drivethru)进行比较:
- 下订单 | 给Node一些指令执行(一个函数)
- 自定义您的订单,例如不加奶油 | 给函数一些参数:({whippedCream:false})
- 根据订单给星巴克员工您的名字 | 使用您的函数为Node提供回调:({whippedCream:false},回调)
- 退一步,星巴克的工作人员将接受排队的人的订单。 Node将在您之后的各行中接受指令。
- 当您准备好订单时,星巴克工作人员会打电话给您,并给您的订单 | 计算函数并为Node.js准备好结果后,它将使用以下结果调用回调:callback(result)
我写了一篇关于此的博客文章:星巴克所见的异步编程
了解JavaScript并发模型及其如何基于事件循环
有一个堆栈,一个堆和一个队列。您可以阅读有关该主题的书籍,但仍然不能完全理解,可以看看这个人.
https://www.http://youtube.com/watch?v=8aGhZQkoFbQwww.youtube.comPhilip解释了浏览器中的事件循环,但是几乎完全一样的情况适用于Node.js(有一些区别)。
了解Node进程如何永不休眠,并且在无事可做时将退出
Node进程可以处于空闲状态,但从不休眠。它跟踪所有执行的回调,如果没有什么要执行的,它将退出。为了使Node进程保持运行状态,您可以使用例如setInterval函数,因为这将在事件循环中创建永久的挂起回调。
了解您可以使用的全局变量,例如流程,模块和缓冲区
它们都是在全局变量上定义的(通常与浏览器中的window变量进行比较)。在Node的REPL中,输入global。并按下Tab查看所有可用模块(或在空行上按两下Tab)。其中一些是JavaScript结构(例如Array和Object)。其中一些是Node库函数(例如setTimeout或用于打印到stdout / stderr的控制台),其中一些是Node全局对象,可用于某些任务(例如,process.env可用于读取主机)环境变量)。
您需要了解该列表中的大部分内容。
了解Node附带的内置库做什么以及它们如何专注于“网络”
其中一些会感到很熟悉,例如Timers,因为它们也存在于浏览器中,并且Node正在模拟该环境。但是,还有更多的东西要学习,例如fs,path,readline,http,net,stream,cluster,...(上面的自动完成列表包含了所有这些内容)。
例如,您可以使用fs读取/写入文件,可以使用“ http”运行流式的Web服务器,并且可以使用“ net”运行tcp服务器和sockets。今天的Node比一年前强大得多,并且通过社区提交变得越来越好。寻找npm仓库执行某些任务之前, 可以先试试使用内置的Node模块解决。
events 模块特别重要,因为大多数Node架构都是事件驱动的。
关于Node API,您总能学到更多,因此请继续拓展自己的视野。
了解为什么节点被命名为节点
您可以构建简单的单进程模块(node),可以使用良好的网络协议对其进行组织,以使它们彼此通信并进行扩展以构建大型分布式程序。扩展Node应用程序并不是事后的想法,它是内置在名称中的。
阅读并尝试理解为Node编写的一些三方库
选择一个类似Express的框架,并尝试理解其一些代码。询问所有你不了解的事情.
最后,在不使用任何框架的情况下在Node中编写一个Web应用程序。尝试处理尽可能多的情况,使用HTML文件进行响应,解析查询字符串,接受表单输入,并创建使用JSON响应这个请求。
还可以尝试编写聊天服务器,发布npm程序包,并为基于Node的开源项目做出贡献。
谢谢阅读。
Read more
- Learn React.js by Building Games
- Node.js Beyond the Basics
- https://http://medium.com/edge-coders/before-you-bury-yourself-in-packages-learn-the-node-js-runtime-itself-f9031fbd8b69
- https://www.http://pluralsight.com/courses/nodejs-advanced