- 原文地址:Before you bury yourself in packages, learn the Node.js runtime itself
- 原文做者:该文章已得到做者 Samer Buna 受权
- 译文出自:掘金翻译计划
- 译者:fghpdf
- 校对者:rccoder,reid3290
这篇文章将挑战你 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
其中一些问题简短而容易,而另外一些则须要更长的答案和更深刻的知识。它们的排名不分前后。ios
我知道你会在阅读这个列表后想要它们的答案。下面的建议部分有一些答案,但我也将在这篇的 freeCodeCamp 文章以后回答全部这些问题。 但让我试试你的底!git
exports
有时候用 module.exports
?setImmediate
和 process.nextTick
的区别在哪里?spawn
、 exec
和 fork
的主要区别是什么?--harmony-*
标志是什么?process.argv
? 它拥有什么类型的数据?uncaughtException
事件的问题是什么? 它和 exit
事件的区别是什么?_
意味着什么?Buffer.alloc
和 Buffer.allocUnsafe
的区别是什么?slice
在 buffer 上与在 array 上有什么不一样?string_decoder
模块有什么用? 它和 buffer 转字符串有何不一样?package.json
的 main
属性有什么用?end()
函数是必须的?*Sync
方法?node-gyp
包有什么用?exports
、 require
和 module
在全部模块中都是全局的但在每个模块中它们都不相同. 这是怎么作到的?console.log(arguments);
的 Node 脚本文件 , 实际 Node 会输出什么?node
命令执行?console.time
函数有什么用?--inspect
参数对于 node 命令有什么用?require
函数老是缓存它依赖的模块. 若是须要屡次执行所需模块中的代码,你能够作什么?学习 Node.js 可能很具备挑战性。如下的一些指南但愿能在这个旅程中帮到你:github
Node 是一个基于 VM 引擎的能够编译 JavaScript 的库,因此不言而喻,JavaScript 自己的重要功能是 Node 的重要功能的一个子集。故你应该从 JavaScript 自己开始学习之旅。
你理解函数、做用域、绑定这个关键字以及新的关键字,闭包、类、模块模式、原型、回调和 promise 吗?你知道能够在 Number、String、Array、Set、Object 和 map 上使用的各类方法吗?适应这个列表上的项目,将使得学习 Node API 更容易。例如,在你很好地理解回调以前,试图学习 'fs' 模块方法可能会致使没必要要的混乱。
回调和 promise(以及 generators/async 模式)对于 Node 特别重要。异步操做是你在 Node 中的第一课。
你能够将一个 Node 程序中的几行代码的非阻塞性质你订购星巴克咖啡的方式(在商店中,而不是得来速)相比较:
({whippedCream: false})
({whippedCream: false}, callback)
callback(result)
我写了一篇博客文章来描述这个过程:在星巴克参悟异步编程
栈,堆和队列。若是你阅读了有关这个主题的书却仍然不彻底理解,能够看看 这个家伙,我保证你就懂了。
Philip 解释了在浏览器中的事件循环,但在 Node.js 中实际上是几乎彻底相同的事情(尽管有一些差别)。
Node 进程能够空闲,但它从不进入 sleep 状态。它跟踪全部正在等待执行的回调,若是没有能够执行的回调它将直接结束进。为了保持 Node 进程持续运行,你可使用一个 setInterval
函数,由于这将在事件循环中建立一个永久处于挂起状态的回调。
它们都定义在一个全局变量里(一般与浏览器中的 window
变量相比较)。在 Node 的 REPL 中,键入 global
。并点击选项卡以查看全部可用的项目(或在空行上的简单双击标签)。其中一些项目是 JavaScript 结构(如 Array
和 Object
)。其中一些是 Node 库函数(如 setTimeout
或 console
输出到 stdout
/ stderr
),其中一些是 Node 全局对象,你能够将其用于处理某些任务(例如,process.env
可用于读取主机的环境变量)。
你在表中看到大部份内容的都应该理解。
其中一些人会以为熟悉,好比 Timers,由于他们也存在于浏览器和 Node 模拟的环境中。可是,还有更多要学习的,如 fs
、path
、readline
、http
、net
、stream
、cluster
、……(上面的列表已经包含它们)。
例如,你可使用 fs
读、写文件,可使用 “http
” 运行流式 Web 服务器,而且能够运行 tcp 服务器和使用 “net
” 编程套接字。今天的 Node 比一年前的功能要强大得多,并且它经过社区的代码提交愈来愈好。在为你的任务寻找可用的包以前,请确保你没法首先使用 Node 内置的程序包完成该任务。
event
库特别重要,由于大多数 Node 架构都是事件驱动的。
在这里你能够老是更多地了解 Node API, 因此请继续扩展你的视野吧.
你构建简单的单进程构建块(节点),可使用良好的网络协议组织它们,以使它们彼此通讯并扩展以构建大型分布式程序。简化成 Node 应用不是在此以后——它的名字就是从这里产生的。
选择一个框架,如 Express,并尝试理解它的一些代码。告诉我你不懂的地方。当条件容许我会试着在 slack 频道回答问题。
最后,用 Node 编写一个 Web 应用,并且不使用任何框架。尝试处理尽量多的状况,使用 HTML 文件,解析查询字符串,接受表单输入,并建立一个以 JSON 响应的终端。
还能够尝试编写聊天服务器,发布 npm 包,并为开源的基于 Node 的项目作出贡献。
祝君码运昌隆!
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、React、前端、后端、产品、设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划。