这篇文章主要讲解了“怎么进行Node.js扩展开发”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么进行Node.js扩展开发”吧!1.Node.js不适合cpu密集型业务,开发扩展使用libuv线程池做异步计算2.需要更高的执行性能,例如使用c++、Rust等比javascript更高效的语言3.已有c++库,直接封装成Node.js扩展提供给javascript调用,避免重复开发4.通过javascript无法实现的能力,开发扩展增强Node.js能力Node.js扩展是文件扩展名为.node的二进制文件,本质上是动态链接库,可以理解为改了名的.dll或.so文件,可以被require加载Node.js module官方文档 nodejs.cn/api/modules…我们可以从Node.js官网历史版本下载页面,NODE_MODULE_VERSION看到Node.js版本与ABI版本的对应关系,nodejs.org/zh-cn/downl…或者执行process.versions.modules查看免费云主机、域名ABI版本;process.versions查看相关配套版本:我们来看下官方的Node.js扩展代码示例:github.com/nodejs/node… 对于N-API方式来说,c语言对应示例代码中的napi案例,c++对应示例代码中的node-addon-api案例,引用的头文件不同。首先,需要安装依赖,按官方的说法可以使用windows-build-tools安装所有依赖。 nodejs.cn/api/n-api.h…但是,公司内网环境一直安装失败,按照文档尝试改了各种参数还是失败,可能是公司内网环境问题。如果你也遇到类似问题,可以尝试手动安装依赖。 github.com/felixrieseb…手动安装步骤如下:1.安装node-gyp2.安装Visual Studio Build Tools安装完成后更新npm配置,例如我安装的版本号是2022安装headers,头文件和Node.js版本是对应的,如果用nvm等工具切换过Node.js版本,请重新安装此步骤会将node_api.h等头文件下载到本地,按Node.js版本号区分目录,例如:配置IDE时会需要用到,当前可以忽略,后续的文章会再介绍具体配置3.安装python安装完成后将python和python/Scripts/目录加入到Path环境变量更新npm配置,以c++开发为例,复制官网示例到本地。github.com/nodejs/node…执行npm install会自动调用node-gyp编译,生成build/Release/hello.node的目标文件,这个文件就是最终被js引用的扩展包,可以被require调用。执行示例文件中的hello.js,会调用hello.cc中定义的hello方法输出’world’。如需重新编译,可以执行node-gyp rebuild,或者执行node-gyp help了解其他命令至此,一个Node.js扩展demo就完成了。Node.js使用非阻塞io的方式,在一个线程内可以异步处理多个任务,但是如果有一个cpu密集型的任务一直在处理,那么就会阻塞其他任务,响应时间变长。Node.js官网的解释如下 nodejs.cn/learn/the-n…开发Node.js扩展是解决问题的方式之一,最终使用什么方式去解决问题,需要基于我们对Node.js的理解,找到最佳实践。在上述场景中,我们可以使用libuv提供的线程池来异步处理这些cpu消耗较高的任务,从而不会阻塞其他任务的执行。当然了,web server并不适合处理cpu密集型任务,如果这个cpu密集型的任务调用频繁且耗时较高,就需要考虑从业务维度拆分,将任务挪到消息队列消费端执行。vsCode安装c++ intelliSense扩展应用配置.vscode/c_cpp_properties.json,主要在includePath中配置好headers路径配置.vscode/launch.json,完成调试配置就可以断点调试了。可以参考官网示例,在项目中的Execute方法中添加自定义代码,不妨动手一式。github.com/nodejs/node…node-gyp是Node.js扩展的构建工具,依赖python和Visual Studio Build Tools,基于google的gyp(Generate Your Projects)工具,chromium、v8等项目也在使用gyp构建。还可以使用CMake.js等工具进行编译构建。在package.json中定义”gypfile”: true,执行npm install时会自动调用ndoe-gyp执行build操作。github.com/nodejs/node…由于编译是基于操作系统和硬件平台进行的,node-gyp构建生成的.node动态链接库不能跨平台,所以通常我们在使用Node.js扩展时以依赖包的形式引入项目,当执行npm install时,自动调用node-gyp生成当前环境可用的.node扩展包。上述方式需要即时编译,无疑会拖慢npm install过程。于是就出现了node-pre-gyp预构建工具,直接从仓库下载当前环境可用的Node.js扩展包。以Xprofiler为例,根据当前系统、硬件平台、Node.js的ABI版本生成下载地址,定义在package.json的binary字段:mirrors.tools.huawei.com/xprofiler/v…rust语言非常火爆,在Node.js开发领域也大有成为基础设施的趋势。比如,Node.js作者的新项目Deno就是用rust语言开发的;使用swc开发的编译工具替代Babel提升性能;rust支持编译成Webassembly,在前后台都能执行,具有很好的前景。很多公司对rust语言十分重视,例如下图中的TOP公司已经成为rust基金会白金会员,用实际行动支持rust语言的发展。foundation.rust-lang.org/类似c++项目使用napi开发Node.js扩展,社区出现了napi-rs项目来支持rust语言开发Node.js扩展。github.com/napi-rs/nap…FFI(Foreign Function Interface)语言交互接口,用一种编程语言写的程序能调用另一种编程语言写的函数,基本上成熟的编程语言都支持。使得我们可以在Node.js中直接调用c/c++、go、rust等语言编译生成的动态链接库,示例如下: github.com/node-ffi/no…例如libmylibrary.dll或libmylibrary.so动态链接库的代码,c语言中的.h头文件描述:js中使用ffi进行对应描述:然后,就可以在js中调用了:感谢各位的阅读,以上就是“怎么进行Node.js扩展开发”的内容了,经过本文的学习后,相信大家对怎么进行Node.js扩展开发这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!
相关推荐: javascript DOM节点属性知识点有哪些
这篇文章主要介绍了javascript DOM节点属性知识点有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript DOM节点属性知识点有哪些文章都会有所收获,下面我们一起来看看吧。DOM节点的属性取决于它们的类…