学习 Node.js 运行时——迷失在 npm 包的海洋之际

Unless otherwise indicated, the text of documents in this site is available under the Creative Commons Attribution 3.0 Unported License, or any later version. Copyright 2009 - 2017 leopku.

译序:本文指出了目前大部分人在学习 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 系列文章中解答所有的这些问题。但是让我先来测一下你!

  1. 请说明 Node.js 和 V8 的关系?Node 没有 V8 能否正常运行?
  2. How come when you declare a global variable in any Node.js file it’s not really global to all modules?
  3. Export 一个 Node 模块的 API 时,为什么有时可以用 exports 有时却必须使用 module.exports
  4. 不用相对路径是否可以实现 require 本地文件(local files)?
  5. 一个应用是否可以同时使用某个包的多个不同版本?
  6. 什么是 Event Loop?它是 V8 的一部分吗?
  7. 什么是调用栈 (Call Stack)?它是 V8 的一部分吗?
  8. setImmediateprocess.nextTick 的区别?
  9. How do you make an asynchronous function return a value?
  10. 回调能和 promise 一起使用吗?如果能的话,有几种方式?
  11. What Node module is implemented by most other Node modules?
  12. spawnexecfork 的主要区别?
  13. cluster 模块如何工作?它跟负载均衡的区别是?
  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 中使用的内置 dot commands?
  23. 除了 V8 与 libuv,Node 还有其它外部依赖吗?
  24. 进程 uncaughtException 事件有什么问题?它与 exit 事件有什么不同?
  25. Node REPL 中 _ 的含义?
  26. Node 缓冲区(buffer)占用 V8 内存吗?它们大小可调吗?
  27. Buffer.allocBuffer.allocUnsafe 的区别?
  28. 缓冲区 (buffer) 上的 slice 与数组(array)上的区别?
  29. string_decoder 模块的作用?它与转换缓冲区为字符串有什么区别?
  30. require 函数的五个主要步骤?
  31. 如何检查本地模块 (local module) 是否存在?
  32. package.jsonmain 属性的作用?
  33. 什么是循环模块引用?如何避免?
  34. require 函数支持的自动尝试文件后缀是哪三个?
  35. 创建一个 http server 并且返回一个响应,为什么 end() 函数是必须的?
  36. 什么场景下能使用 *Sync 方法?
  37. 如何仅打印多层嵌套对象的第一层?How can you print only one level of a deeply nested object?
  38. node-gyp 包的作用?
  39. 如何实现 exports, requiremodule 在每个模块中均全局可用,但是在每个模块中却不同?
  40. 假设执行一个只有一行 console.log(arguments); 的 node 脚本,请问输出是什么?
  41. 如何实现一个模块既能被其他模块 require 引用又能直接通过 node 命令行调用?
  42. 请给出一个 node 中既可读又可写的内置流 (stream) 的例子?
  43. 在 node 脚本中执行 cluster.fork() 将会发生什么?
  44. What’s the difference between using event emitters and using simple callback functions to allow for asynchronous handling of code?
  45. console.time 的作用?
  46. What’s the difference between the Paused and the Flowing modes of readable streams?
  47. Node 命令的 --inspect 参数的作用?
  48. 如何从已经连接的套接字中读取数据?
  49. require 函数总会缓存引用的模块。如果需要多次执行所引用模块中的代码,你会怎么做?
  50. 使用流 (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&前端交流群