序二

我跟死月相识于GitHub,那时我们经常会向Node.js贡献一些代码,彼此也会在微信上讨论一些技术问题。当我听说死月在写一本关于Node.js C++扩展相关的图书时,激动得几乎要从床上蹦起来。因为我深知一个对Node.js与V8引擎都如此了解之人,愿意将他所知所想分享出来,这将是给予社区的一份大礼。

从我个人的角度来看,这本书非常适合这类开发者:他们对于Node.js的使用已经了然于胸,但却苦于没有底层开发经验,对整个V8虚拟机也一知半解。这时,他们可以从第3章开始读起。本书用了很长的篇幅介绍JavaScript代码究竟在虚拟机里是怎么运行的,它们又都分别对应着哪一类数据结构等。因为作者深知,只有把这些基础理解透了,则无论是开发C++扩展,还是写纯JavaScript代码,大家都能更得心应手。

本书像是在述说着Node.js在C++扩展这一课题中曲折而又有趣的历史进程。首先从最原始的V8 API时代开始。对于每个原始时代,开发者最痛苦的莫过于解决各种版本的兼容问题。之后迎来的是NAN时代。它解决了原始时代的接口抽象问题,接口也更丰富多样,异步接口也封装在内。最后,是还在路上的N-API。它与NAN一脉相承,拥有更官方的支持和更友好的接口。

另外,我们通常在写一个C++扩展时,多数情况下会跟异步打交道,这其中包含着如何非阻塞地调用底层接口,如何将异步的结果返回到JavaScript的回调函数中,以及如何正确地在异步封装中释放你的资源。对这些内容特别感兴趣的读者,可以打开第6章一睹为快。

Node.js已快走完它的第一个10年,尽管被人诟病于其回调地狱、虚假繁荣、超高并发场景下的不适应性,以及低端设备上的内存等问题,但这仍旧无法阻止它前进的步伐。然而对于我们Node.js工程师来说,除了掌握好这门语言之外,学习如何写C++扩展、了解它如何运转将是我们下一阶段的重要功课。相信《Node.js:来一打C++扩展》将会成为常伴大家左右的另一本《代码大全》。

——刘亚中(Yorkie),Rokid系统工程师,tensorflow-nodejs作者

2018年3月22日于杭州