企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
对于前段工程师来说,C/C++扩展模块或许生成比较生疏和晦涩,但是如果你了解了它,在模块出现性能瓶颈时将会对你有极大帮助。 JavaScript的一个典型弱点就是位运算。JavaScript的位运算参照Java的位运算实现,但是Java位运算是在int型数字的基础上进行的,而JavaScript中只有double型的数据类型,在进行位运算的过程中,需要将double型转换为int型,然后再进行。所以,在JavaScript层面上做位运算的效率并不高。 在应用中,会频繁出现位运算的需求,包括转码、编码等过程,如果通过JavaScript来实现,CPU资源将会耗费很多,这时编写C/C++扩展模块来提升性能的机会来了。 C/C++扩展模块属于文件模块中的一类。前面讲述文件模块的编译部分时提到,C/C++模块通过预先编译为.node文件,然后调用process.dlopen()方法加载执行。在这一节中,我们将分析整个C/C++扩展模块的编写、编译、加载、导出的过程。 在开始编写扩展模块之前,需要强调的一点是,Node的原生模块一定程度上是可以跨平台的,其前提条件是源代码可以支持在 `*nix` 和Windows上编译,其中,`*nix`下通过g++/gcc等编译器编译为动态链接共享对象文件(.so),在Windows下则需要通过Visual C++ 的编译器编译为动态链接库文件(.dll),如图: ![](https://box.kancloud.cn/2016-08-26_57bf1fe3d5827.png) 这里有一个让人迷惑的地方,那就是引用加载时却是.node文件。其实.node文件的扩展名只是为了看起来更自然一点,不会因为平台差异产生不同的感觉。实际上,在Windows下它是一个.dll文件,在`*nix上`它是一个.so文件。为了实现跨平台,dlopen()方法在内部实现时区分了平台,分别用的是加载.so和.dll的方式。上图中,为扩展模块在不同平台上编译和加载的详细过程。 值得注意的是,一个平台下的.node文件在另一个平台下是无法加载执行的,必须重新用各自平台下的编译器编译为正确的.node文件。