[译] 在你沉迷于包的海洋以前,仍是了解一下运行时 Node.js 的自己

在你沉迷于包的海洋以前,仍是了解一下运行时 Node.js 的自己

这篇文章将挑战你 Node.js 的知识极限。javascript

我在 Ryan Dahl 第一次 介绍 Node.js 以后不久就开始学习它,甚至一年前我也不能回答我在这篇文章中提出的许多问题。 若是你能真正地回答全部的问题,那么你的 Node.js 的知识储备是迥乎常人的。 咱们应该成为朋友。html

我发起这个挑战的缘由可能会让你大吃一惊,咱们中的许多人一直采用着错误的方式来学习 Node。大多数关于 Node 的教程,书籍和课程都关注于 Node 生态,而不是 Node 自己。 他们专一于教你使用的全部的 Node 包,例如 Express 和 Socket.IO,而不是教会你使用 Node 自己的功能。前端

这样作也有很好的理由。Node 是原生的和灵活的。它不提供完整的解决方案,而是提供一个丰富的,你本身可以实现的解决方案。像 Express.js 和Socket.IO 这样的库则是更完整的解决方案,所以教这些库是更有意义的,这样可让学习者使用这些完整的解决方案。java

传统的观念彷佛以为只有那些编写类库如 Express.js 和 Socket.IO 的人须要了解 Node.js 运行时的一切。但我认为这样的观点是错误的。深刻理解 Node.js 自己是使用这些完整的解决方案以前最好的作法。你至少应该有足够的知识和信心来经过一个包的代码来判断你是否应该学习使用它。node

这就是为何我决定开一个完彻底全专攻于 Node 自己的 Pluralsight 课程。在备课时,我会列出一些具体问题来肯定你对 Node 自己的了解是否已经足够深刻,仍是须要改进。react

若是你能回答这些问题而且正在找工做,请联系我!反过来讲,若是大多数这些问题使你感到茫然,你则须要优先学习 Node 自己了。你所学的知识将使你成为一个更加理想的开发人员。android

Node.js 知识挑战:

其中一些问题简短而容易,而另外一些则须要更长的答案和更深刻的知识。它们的排名不分前后。ios

我知道你会在阅读这个列表后想要它们的答案。下面的建议部分有一些答案,但我也将在这篇的 freeCodeCamp 文章以后回答全部这些问题。 但让我试试你的底!git

  1. Node.js 和 V8 之间的关系是什么?能够在没有 V8 的状况下运行 Node 吗?
  2. 当你在任何一个 Node.js 文件中声明一个全局变量时,它对于全部模块都是真的全局吗?
  3. 当暴露一个 Node 模块的 API 时, 为何咱们有时候用 exports 有时候用 module.exports?
  4. 咱们能够依赖不使用相对路径的本地文件吗?
  5. 能够在同一个应用中使用相同包的不一样版本吗?
  6. 什么是事件循环?它是 V8 的一部分吗?
  7. 什么是调用栈?它是 V8 的一部分吗?
  8. setImmediateprocess.nextTick 的区别在哪里?
  9. 如何使异步函数返回值?
  10. 回调能够与 promise 一块儿使用吗?他们仍是同一种方式仍是两种不一样的方式?
  11. 什么 Node 模块由许多其余 Node 模块实现?
  12. spawnexecfork 的主要区别是什么?
  13. 集群模块如何工做?它与使用负载均衡有何不一样?
  14. --harmony-* 标志是什么?
  15. 如何读取和检查 Node.js 进程的内存使用状况?
  16. 当调用栈和事件循环队列都为空时,Node 将作什么?
  17. 什么是 V8 对象和函数模板?
  18. 什么是libuv, Node.js 如何使用它?
  19. 如何使 Node 的 REPL 老是使用 JavaScript 严格模式?
  20. 什么是 process.argv? 它拥有什么类型的数据?
  21. 在 Node 进程结束以前,咱们该如何作最后一个操做?该操做能够异步完成吗?
  22. 你能够在 Node REPL 中使用哪些内置命令?
  23. 除了 V8 和 libuv,Node 还有什么其余外部依赖?
  24. 进程 uncaughtException 事件的问题是什么? 它和 exit 事件的区别是什么?
  25. 在 Node’s REPL 中 _ 意味着什么?
  26. Node buffer 使用V8内存吗?能够调整他们的大小吗?
  27. Buffer.allocBuffer.allocUnsafe 的区别是什么?
  28. slice 在 buffer 上与在 array 上有什么不一样?
  29. string_decoder 模块有什么用? 它和 buffer 转字符串有何不一样?
  30. require 函数须要执行的 5 个主要步骤是什么?
  31. 如何检查本地模块是否存在?
  32. package.jsonmain 属性有什么用?
  33. 什么是 Node 中的模块循环依赖,如何避免?
  34. require 函数自动尝试的 3 个文件扩展名是什么?
  35. 当建立一个 HTTP 服务并对请求做出响应时, 为何 end() 函数是必须的?
  36. 什么状况下适合使用文件系统的 *Sync 方法?
  37. 如何只打印深层嵌套对象的一个级别?
  38. node-gyp 包有什么用?
  39. 对象 exportsrequiremodule 在全部模块中都是全局的但在每个模块中它们都不相同. 这是怎么作到的?
  40. 若是你执行一个只有 console.log(arguments); 的 Node 脚本文件 , 实际 Node 会输出什么?
  41. 如何作到一个模块能够同时被其余模块使用,而且能够经过 node 命令执行?
  42. 举一个可读写的内置流的例子。
  43. 当在 Node 脚本中执行 cluster.fork() 时会发生什么?
  44. 使用事件发射器和使用简单的回调函数来容许异步处理代码有什么区别?
  45. console.time 函数有什么用?
  46. 可读流的“已暂停”和“流动”模式之间有什么区别?
  47. --inspect 参数对于 node 命令有什么用?
  48. 如何从已链接的套接字中读取数据?
  49. require 函数老是缓存它依赖的模块. 若是须要屡次执行所需模块中的代码,你能够作什么?
  50. 使用流时,你什么时候使用管道功能以及什么时候使用事件? 这两种方法能够组合吗?

我采起了最好的方式来学习 Node.js

学习 Node.js 可能很具备挑战性。如下的一些指南但愿能在这个旅程中帮到你:github

学习 JavaScript 的好的部分并学习它的现代语法( ES2015 及更高版本)

Node 是一个基于 VM 引擎的能够编译 JavaScript 的库,因此不言而喻,JavaScript 自己的重要功能是 Node 的重要功能的一个子集。故你应该从 JavaScript 自己开始学习之旅。

你理解函数、做用域、绑定这个关键字以及新的关键字,闭包、类、模块模式、原型、回调和 promise 吗?你知道能够在 Number、String、Array、Set、Object 和 map 上使用的各类方法吗?适应这个列表上的项目,将使得学习 Node API 更容易。例如,在你很好地理解回调以前,试图学习 'fs' 模块方法可能会致使没必要要的混乱。

了解 Node 的非阻塞性质

回调和 promise(以及 generators/async 模式)对于 Node 特别重要。异步操做是你在 Node 中的第一课。

你能够将一个 Node 程序中的几行代码的非阻塞性质你订购星巴克咖啡的方式(在商店中,而不是得来速)相比较:

  1. 下订单 | 给 Node 一些执行指令(一个函数)
  2. 自定义你的订单,例如没有生奶油 | 给函数一些参数:({whippedCream: false})
  3. 在你的订单上告诉星巴克员工你的命令 | 经过回调告诉 Node 执行你的函数: ({whippedCream: false}, callback)
  4. 而后靠边站,星巴克的员工会从排在你后面的人接到订单 | Node 将从你的后面的代码接收指令。
  5. 当你要的咖啡准备好了,星巴克员工会叫你的名字,并给咖啡 | 当你的函数计算结束 Node.js 就会根据计算结果执行回调:callback(result)

我写了一篇博客文章来描述这个过程:在星巴克参悟异步编程

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

栈,堆和队列。若是你阅读了有关这个主题的书却仍然不彻底理解,能够看看 这个家伙,我保证你就懂了。

Philip 解释了在浏览器中的事件循环,但在 Node.js 中实际上是几乎彻底相同的事情(尽管有一些差别)。

了解一个 Node 进程如何不进如入 sleep 状态,而且当没有什么要作的时候就会结束进程

Node 进程能够空闲,但它从不进入 sleep 状态。它跟踪全部正在等待执行的回调,若是没有能够执行的回调它将直接结束进。为了保持 Node 进程持续运行,你可使用一个 setInterval 函数,由于这将在事件循环中建立一个永久处于挂起状态的回调。

学习可使用的全局变量,如 process、module 和 Buffer

它们都定义在一个全局变量里(一般与浏览器中的 window 变量相比较)。在 Node 的 REPL 中,键入 global。并点击选项卡以查看全部可用的项目(或在空行上的简单双击标签)。其中一些项目是 JavaScript 结构(如 ArrayObject)。其中一些是 Node 库函数(如 setTimeoutconsole 输出到 stdout / stderr),其中一些是 Node 全局对象,你能够将其用于处理某些任务(例如,process.env 可用于读取主机的环境变量)。

你在表中看到大部份内容的都应该理解。

了解你可使用 Node 附带的内置库作什么,以及它们如何专一于“网络”

其中一些人会以为熟悉,好比 Timers,由于他们也存在于浏览器和 Node 模拟的环境中。可是,还有更多要学习的,如 fspathreadlinehttpnetstreamcluster、……(上面的列表已经包含它们)。

例如,你可使用 fs 读、写文件,可使用 “http” 运行流式 Web 服务器,而且能够运行 tcp 服务器和使用 “net” 编程套接字。今天的 Node 比一年前的功能要强大得多,并且它经过社区的代码提交愈来愈好。在为你的任务寻找可用的包以前,请确保你没法首先使用 Node 内置的程序包完成该任务。

event 库特别重要,由于大多数 Node 架构都是事件驱动的。

在这里你能够老是更多地了解 Node API, 因此请继续扩展你的视野吧.

理解 Node 为何要叫 Node

你构建简单的单进程构建块(节点),可使用良好的网络协议组织它们,以使它们彼此通讯并扩展以构建大型分布式程序。简化成 Node 应用不是在此以后——它的名字就是从这里产生的。

阅读并尝试理解为 Node 编写的一些代码

选择一个框架,如 Express,并尝试理解它的一些代码。告诉我你不懂的地方。当条件容许我会试着在 slack 频道回答问题。

最后,用 Node 编写一个 Web 应用,并且不使用任何框架。尝试处理尽量多的状况,使用 HTML 文件,解析查询字符串,接受表单输入,并建立一个以 JSON 响应的终端。

还能够尝试编写聊天服务器,发布 npm 包,并为开源的基于 Node 的项目作出贡献。

祝君码运昌隆!

掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOSReact前端后端产品设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划

相关文章
相关标签/搜索