nodejs cluster_学习nodejs本身, 在求助于npm之前

48de182d5a9e71b66b658eebf848e0d7.png

本文将挑战您的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文章中回答所有这些问题。

  1. V8与Node.js的关系? Node没有v8是否也能工作?
  2. 在任何Node.js文件中声明全局变量时,为什么它并不是对所有模块真正都是全局变量呢?
  3. 当导出一个模块或者API, 为什么有时使用exports有些时候使用module.exports?
  4. 我能require一个本地文件不使用相对路径吗?
  5. 能使用不同的版本的同一个库在一个nodejs应用中吗?
  6. 什么是Event Loop? 他是V8的一部分吗
  7. 什么时候Call Stack? 他是V8的一部分吗
  8. setImmediate和process.nextTick有什么区别?
  9. 如何使异步函数返回值?
  10. 回调函数是否可以与promises一起使用?
  11. 哪些Node模块是底层模块?
  12. spawn,exec和fork之间的主要区别是什么?
  13. 集群模块如何工作?与使用负载均衡器有何不同?
  14. 什么是--harmony- *标志?
  15. 您如何读取和检查Node.js进程的内存使用情况?
  16. 当调用堆栈和事件循环队列都为空时,Node将做什么?
  17. 什么是V8对象和function templates?
  18. 什么是libuv?Node.js如何使用它?
  19. 如何使Node的REPL始终使用JavaScript严格模式?
  20. 什么是process.argv?它保存什么类型的数据?
  21. 如何在Node进程退出之前执行一项最终操作?该操作可以异步完成吗?
  22. 您可以在Node的REPL中使用哪些内置点命令?
  23. 除了V8和libuv,Node还具有其他哪些外部依赖项?
  24. process uncaughtException 事件时候触发, 会有问题怎么处理?与退出事件有何不同?
  25. _在REPL的REPL内部是什么意思?
  26. Node buffers 使用 V8 内存吗? 他们被能 resized吗?
  27. Buffer.alloc和Buffer.allocUnsafe有什么区别?
  28. buffers上的slice方法与数组上有什么不同?
  29. string_decoder模块有什么用?与casting buffers强制转换为字符串有何不同?
  30. require函数执行的5个主要步骤是什么?
  31. 如何检查本地模块的存在?
  32. package.json中的main属性有什么用?
  33. 什么是Node中的循环模块依赖关系,如何避免?
  34. require函数将自动尝试的3个文件扩展名是什么?
  35. 创建http服务器并为请求编写响应时,为什么需要end()函数?
  36. 什么时候可以使用文件系统* Sync方法?
  37. 如何只打印一层深层嵌套的对象?
  38. node-gyp软件包用于什么?
  39. export require module他们都是全局的, 但是每次使用的时候他们是不同的 怎么做到的?
  40. 如果执行的node脚本文件只有一行:console.log(arguments);,则node将打印什么内容?
  41. 一个模块如何既可以被其他模块require又可以使用node命令直接执行?
  42. Node中的内置流可读写的示例是什么?
  43. 在Node脚本中执行cluster.fork()行时会发生什么?
  44. 使用event emitters和使用简单的callback来允许异步处理代码有什么区别?
  45. console.time函数有什么用?
  46. 可读流的暂停模式和流动模式有什么区别?
  47. --inspect参数对node有什么作用?
  48. 如何从连接的socket中读取数据?
  49. require函数始终缓存所需的模块。如果需要在每次require时都执行一些代码,该怎么办?
  50. 在使用流时,何时使用管道功能以及何时使用事件?这两种方法可以结合使用吗?

我学习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)进行比较:

  1. 下订单 | 给Node一些指令执行(一个函数)
  2. 自定义您的订单,例如不加奶油 | 给函数一些参数:({whippedCream:false})
  3. 根据订单给星巴克员工您的名字 | 使用您的函数为Node提供回调:({whippedCream:false},回调)
  4. 退一步,星巴克的工作人员将接受排队的人的订单。 Node将在您之后的各行中接受指令。
  5. 当您准备好订单时,星巴克工作人员会打电话给您,并给您的订单 | 计算函数并为Node.js准备好结果后,它将使用以下结果调用回调:callback(result)

我写了一篇关于此的博客文章:星巴克所见的异步编程

了解JavaScript并发模型及其如何基于事件循环

有一个堆栈,一个堆和一个队列。您可以阅读有关该主题的书籍,但仍然不能完全理解,可以看看这个人.

https://www.http://youtube.com/watch?v=8aGhZQkoFbQ​www.youtube.com

Philip解释了浏览器中的事件循环,但是几乎完全一样的情况适用于Node.js(有一些区别)。

了解Node进程如何永不休眠,并且在无事可做时将退出

Node进程可以处于空闲状态,但从不休眠。它跟踪所有执行的回调,如果没有什么要执行的,它将退出。为了使Node进程保持运行状态,您可以使用例如setInterval函数,因为这将在事件循环中创建永久的挂起回调。

了解您可以使用的全局变量,例如流程,模块和缓冲区


它们都是在全局变量上定义的(通常与浏览器中的window变量进行比较)。在Node的REPL中,输入global。并按下Tab查看所有可用模块(或在空行上按两下Tab)。其中一些是JavaScript结构(例如Array和Object)。其中一些是Node库函数(例如setTimeout或用于打印到stdout / stderr的控制台),其中一些是Node全局对象,可用于某些任务(例如,process.env可用于读取主机)环境变量)。

592ff5ebedf3e136e06e8a8d93572fec.png

您需要了解该列表中的大部分内容。

了解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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值