译序:本文指出了目前大部分人在学习 Node.js 过程的误区,点出了目前大部分 Node.js 学习者知识点中的缺陷。
Ryan Dahl 的视频是我学习 Node.js 的开始,然而一年之后我甚至还不会本文中的许多问题。如果你真能回答出本文的所有问题,要给你的 Node.js 功力点赞。来来来,我们交个朋友吧。
为什么我会认为对于我们中的很多人来说这是一个挑战呢?是因为大部分人学习的 Node 的方法是错误的。大部分 Node 教程、书籍以及网络教学都关注在 Node 生态圈而不是 Node 运行时本身。关注的是使用 Node 时能用所有的 npm 包来完成什么功能,比如 Express 啦 Socket.IO 啦等等,而没有教授 Node 运行本身的功能。
原因很简单。Node 是原生且灵活的。它虽然没有提供完整的方案,但是却提供了一个强大的运行时,利用强大的运行时是可以实现自己的方案的。
传统的观点认为只有那些需要写类似 Express.js、Socket.IO 之类的库的人才需要了解 Node.js 运行时的方方面面。但我不这么认为,在使用这些完整方案之前最好了解 Node.js 运行时本身。至少,你有能力和信心通过一个 npm 包的代码来判断它(的优劣)。
上述也是我使用纯 node 创建 Pluralsight 课程的原因。在为课程做研究的过程中,我把可以检测 Node 运行时相关知识是否足够的特殊问题整理成一个列表,当然这个列表可以继续完善。
如果您能自主回答出大部分,而且当前你正在求职中,可以联系我!否则,大部分问题的答案都出乎你的意料,那么你可能需要考虑优先补充学习一下 Node 运行时本身相关的知识。这些知识会让你成为一个值得尊敬的开发者。
Node.js 知识大挑战
这些问题有的短小或很容易,有的答案较复杂或需要较深的原理。下面的列表并没有按难易程度排列,仅仅是列出而已。
臣妾知道小主们读完问题列表之后想立马知道答案。下面「建议」一节有一部分答案,但是我更倾向在这篇文章之后的 freeCodeCamp 系列文章中解答所有的这些问题。但是让我先来测一下你!
- 请说明 Node.js 和 V8 的关系?Node 没有 V8 能否正常运行?
- How come when you declare a global variable in any Node.js file it’s not really global to all modules?
- Export 一个 Node 模块的 API 时,为什么有时可以用
exports
有时却必须使用module.exports
? - 不用相对路径是否可以实现 require 本地文件(local files)?
- 一个应用是否可以同时使用某个包的多个不同版本?
- 什么是 Event Loop?它是 V8 的一部分吗?
- 什么是调用栈 (Call Stack)?它是 V8 的一部分吗?
setImmediate
和process.nextTick
的区别?- How do you make an asynchronous function return a value?
- 回调能和 promise 一起使用吗?如果能的话,有几种方式?
- What Node module is implemented by most other Node modules?
spawn
、exec
与fork
的主要区别?- cluster 模块如何工作?它跟负载均衡的区别是?
--harmony-*
标志是什么?- 如何读取并检查 Node.js 进程的内存使用情况?
- 当调用栈和事件循环都为空时,Node 将会发生什么?
- V8 对象和函数模板是什么?
- 什么是 libuv? Node.js 怎么使用它的?
- 如何使 Node 的 REPL 始终使用 JavaScript 严格模式?
- 什么是
process.argv
?它拥有哪些数据? - 如何实现在 Node 进程退出前执行最后一个操作?这个能异步执行吗?
- 有哪些可以在 Node REPL 中使用的内置 dot commands?
- 除了 V8 与 libuv,Node 还有其它外部依赖吗?
- 进程
uncaughtException
事件有什么问题?它与exit
事件有什么不同? - Node REPL 中
_
的含义? - Node 缓冲区(buffer)占用 V8 内存吗?它们大小可调吗?
Buffer.alloc
与Buffer.allocUnsafe
的区别?- 缓冲区 (buffer) 上的
slice
与数组(array)上的区别? string_decoder
模块的作用?它与转换缓冲区为字符串有什么区别?- require 函数的五个主要步骤?
- 如何检查本地模块 (local module) 是否存在?
package.json
中main
属性的作用?- 什么是循环模块引用?如何避免?
- require 函数支持的自动尝试文件后缀是哪三个?
- 创建一个 http server 并且返回一个响应,为什么
end()
函数是必须的? - 什么场景下能使用
*Sync
方法? - 如何仅打印多层嵌套对象的第一层?How can you print only one level of a deeply nested object?
node-gyp
包的作用?- 如何实现
exports
,require
和module
在每个模块中均全局可用,但是在每个模块中却不同? - 假设执行一个只有一行
console.log(arguments);
的 node 脚本,请问输出是什么? - 如何实现一个模块既能被其他模块 require 引用又能直接通过
node
命令行调用? - 请给出一个 node 中既可读又可写的内置流 (stream) 的例子?
- 在 node 脚本中执行
cluster.fork()
将会发生什么? - What’s the difference between using event emitters and using simple callback functions to allow for asynchronous handling of code?
console.time
的作用?- What’s the difference between the Paused and the Flowing modes of readable streams?
- Node 命令的
--inspect
参数的作用? - 如何从已经连接的套接字中读取数据?
require
函数总会缓存引用的模块。如果需要多次执行所引用模块中的代码,你会怎么做?- 使用流 (stream) 时,什么场景下使用 pipe 函数?什么场景下使用事件?这两种方法可以一起使用吗?
(未完待续)
本文根据 Samer Buna 的《Before you bury yourself in packages, learn the Node.js runtime itself》所译,整个译文带有我们自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:https://medium.freecodecamp.com/before-you-bury-yourself-in-packages-learn-the-node-js-runtime-itself-f9031fbd8b69 。欢迎加入 Node.js&前端交流群