前端使用node.js,node在前端的应用

  前端使用node.js,node在前端的应用

  如何开发节点扩展?下面的文章将介绍开发Node.js扩展的前期知识,带你了解Node.js扩展开发的介绍。希望对大家有帮助!

  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.js扩展名是二进制文件,文件扩展名为。节点,它本质上是一个动态链接库。可以理解为一种改名。dll或。so文件,可以根据需要加载。

  Node.js模块nodejs.cn/api/modules官方文档…

  

Node.js扩展的三种形式

  扩展类型基本描述:Node.js版本变化时改代码,Node.js版本变化时重新编译,直接写C,直接引用v8,libuv等库进行开发。对,对,NAN用NAN(node . js的原生抽象)不对,对,N-api是用node-addon-api开发的。否(ABI版本需要保持一致)否(ABI版本需要保持一致)。直接写C代码开发插件。Node.js版本变化时,引用的v8、libuv等库的版本可能会发生变化,这些三方库的API也可能会发生变化,导致代码修改。

  NAN方式开发插件,Node.js版本变化时需要重新编译引用nan.h。

  N-API调用Node.js的稳定二进制ABI接口(应用二进制接口),只要ABI版本号一致,就不需要重新编译复制的代码。我们可以从版本历史,官网,Node.js下载页面,NODE_MODULE_VERSION可以看到Node.js版本和ABI版本的对应关系。nodejs.org/zh-cn/downl…

  或者执行process.versions.modules来检查ABI版本;Process.versions查看相关支持版本:

  流程.版本

  {

  节点:“18.0.0”,

  V8:“10 . 1 . 124 . 8-node . 13”,

  紫外线:“1.43.0”,

  zlib:“2011年2月1日”,

  布罗特利:“1.0.9”,

  阿瑞斯:“1.18.1”,

  模块:“108”,

  NGH TTP 2:“1 . 47 . 0”,

  皮娜:“8”,

  llhttp: 6.0.4 ,

  OpenSSL:“3 . 0 . 2 quic”,

  cldr:“41.0”,

  伊斯兰法院联盟:“71.1”,

  tz: 2022a ,

  unicode:“14.0”,

  ngtcp2: 0.1.0-DEV ,

  NGH TTP 3:“0 . 1 . 0-开发”

  }我们来看一下Node.js扩展代码的官方示例:github.com/nodejs/node…对于N-API模式,C语言对应示例代码中的皮娜用例,C对应示例代码中的node-addon-api用例,引用的头文件不同。

  

安装依赖项

  首先需要安装依赖项。正式来说,你可以使用windows-build-tools来安装所有的依赖项。nodejs.cn/api/n-api.h…

  但是公司内网环境安装一直失败,根据文件修改各种参数的尝试仍然失败,可能是公司内网环境的问题。如果遇到类似问题,可以尝试手动安装依赖项。github.com/felixrieseb…

  手动安装步骤如下:

  1.安装节点-gyp

  Npinstall-g node-gyp2。安装Visual Studio生成工具

  你可以参考node-gyp文档中的下载链接和步骤来安装github.com/nodejs/node…

  安装后更新npm配置,比如我安装的版本号是2022。

  Npm配置集msvs_version 2022安装标头。头文件对应的是Node.js的版本,如果已经用nvm等工具切换了Node.js的版本,请重新安装。

  node-gyp install-dist-URL=http://mirrors.tools.huawei.com/Node.js/This步骤会将node_api.h等头文件下载到本地,并根据node.js的版本号区分目录,例如:

  c:\ users \ z 00443016 \ appdata \ local \ node-gyp \ cache \ 18 . 0 . 0 \ include \ node在配置IDE时会用到,目前可以忽略,具体配置会在后续文章中介绍。

  3.安装python

  下载地址:www.python.org/downloads/,官网

  安装后,将python和python/Scripts/directory添加到Path环境变量中。

  更新npm配置,

  Npconfig设置python d: \ runtime \ python复制代码

从hellow world开始

  以C开发为例,将官网示例复制到本地。github.com/nodejs/node…

  执行npm install将自动调用node-gyp来编译并生成build/release/hello.node的目标文件

  在示例文件中执行hello.js将调用hello.cc中定义的hello方法来输出 world 。

  var addon=require( bindings )( hello );

  //或者直接需要hello.node文件

  //var addon=require(。/build/Release/hello . node’);

  console . log(addon . hello());//world 重新编译,可以执行node-gyp rebuild,或者执行node-gyp help获得其他命令。

  至此,一个Node.js扩展演示完成。

  

抛出问题

   Node.js使用非阻塞io方式,可以在一个线程内异步处理多个任务。但是,如果一直在处理一个cpu密集型任务,它会阻塞其他任务,响应时间会更长。

  Node.js官网的解释如下:nodejs.cn/learn/the-n…

  开发Node.js扩展是解决问题的方法之一。最后,我们需要根据我们对Node.js的理解找到最佳实践.在上面的场景中,我们可以使用libuv提供的线程池来异步处理这些cpu密集型任务,以免阻塞其他任务的执行。

  当然,web服务器不适合处理cpu密集型任务。如果这种cpu密集型任务被频繁调用并且非常耗时,那么有必要考虑将其从业务维度中分离出来,并将该任务移动到消息队列使用者。

  

环境配置

   vsCode安装c intelliSense扩展应用程序

  配置。vscode/c _ CPP _ properties.json,主要配置includePath中的headers路径。

  {

  配置:[

  {

  名称: Win32 ,

  includePath: [

  $ {工作空间文件夹}/** ,

   c:\ Users \ $ { userName } \ AppData \ Local \ node-gyp \ Cache \ 18 . 0 . 0 \ include \ node ,

   d:\ tool \ nvm \ v 18 . 0 . 0 \ node _ global \ node _ modules \ node-addon-API

  ],

  定义:[

  _调试,

  UNICODE ,

  _UNICODE

  ],

  c标准: c17 ,

  CPP标准: c 17 ,

  “智能感知模式”:“windows-msvc-x64”

  }

  ],

  版本:4

  }配置vscode/launch.json,完成调试配置后可以在断点处进行调试。

  {

  版本: 0.2.0 ,

  配置:[

  {

  名称: c启动,

  类型: lldb ,

  请求:启动,

  程序: D:\runtime\nodejs\node.exe ,

  args :[ $ { workspace folder }/src/hello . js ],

   stopAtEntry: true,

  CWD : $ {文件目录名} ,

  环境:[],

   externalConsole: true,

  MIMode: lldb ,

  setupCommands: [

  {

  描述:为gdb启用整洁打印,

  文本:-启用-美化-打印,

   ignoreFailures :真

  }

  ]

  }

  ]

  }

asyncWork扩展开发

  可以参考官网的例子,在项目中的Execute方法中添加自定义代码。你不妨自己做这件事。github.com/nodejs/node…

  

node-gyp构建工具

   node-gyp是Node.js的扩展构建工具,依赖于python和Visual Studio构建工具。它是基于谷歌的gyp(生成你的项目)工具。chromium、v8等项目也在和gyp一起建设。也可以使用CMake.js等工具进行编译和构建。

  npm配置集msvs_version 2022

  npconfig set python d:\ runtime \ python在package.json中定义了 gypfile : true,执行npm install时会自动调用ndoe-gyp执行构建操作。github.com/nodejs/node…

  {

  名称: hello_world ,

  版本: 0.0.0 ,

  描述: Node.js附加示例#1 ,

  main: hello.js ,

   private :对,

  依赖项:{

  绑定: ~1.2.1 ,

  “节点-插件-API”:^1.0.0

  },

  脚本:{

  测试: node hello.js

  },

  “gypfile”:没错

  }

node-pre-gyp预构建

  由于编译是基于操作系统和硬件平台的。node-gyp生成的节点动态链接库是不能跨平台的,所以我们在使用node.js扩展时,通常是以依赖包的形式引入项目。当执行npm安装时,会自动调用node-gyp来生成。当前环境中可用的节点扩展包。

  上述方法需要立即编译,这无疑会减慢npm的安装过程。于是node-pre-gyp预建工具出现了,直接从仓库下载当前环境下可用的Node.js扩展包。

  以Xprofiler为例,根据Node.js的当前系统、硬件平台和ABI版本生成下载地址,在package.json的二进制字段中定义:

  二进制:{

  模块名: xprofiler ,

  模块路径“:”。/build/binding/{ configuration }/{ node _ ABI }-{ platform }-{ arch }/,

  远程路径“:”。/v{version}/,

  package _ name :{ module _ name }-v { version }-{ node _ ABI }-{ platform }-{ arch } . tar . gz ,

  host : https://github . com/X-Profiler/X Profiler/releases/download

  },mirrors . tools . Huawei . com/x profiler/v…

  

其他形式的扩展 napi-rs

   rust语言非常流行,也有成为Node.js开发领域基础设施的趋势。比如Node.js作者的新项目Deno就是用rust语言开发的;用swc开发的编译工具代替Babel来提高性能;Rust支持编译成Webassembly,前台后台都可以执行,前景不错。

  很多公司都很重视锈语。比如下图中的TOP Company成为了rust Foundation的白金会员,用实际行动支持rust language的发展。foundation.rust-lang.org/

  C中类似的项目使用皮娜开发Node.js扩展,社区中出现了皮娜-rs项目支持rust语言开发Node.js扩展。github.com/napi-rs/nap…

  

直接调用动态链接库 node-ffi

   FFI(对外函数接口)语言接口。用一种编程语言编写的程序可以调用用另一种编程语言编写的函数,成熟的编程语言基本上都支持。从而可以在Node.js中直接调用c/c、go、rust等语言编译的动态链接库例子如下:github.com/node-ffi/no…

  例如,libmylibrary.so的代码或libmylibrary.so动态链接库。C语言的h头文件描述了:

  double do _ some _ number _ fudging(double a,int b);

  myobj * create _ object();

  double do _ stuff _ with _ object(myobj * obj);

  void use _ string _ with _ object(myobj * obj,char * value);

  void delete _ object(myobj * obj);使用js中的ffi进行相应的描述:

  var FFI=require( FFI );

  var MyLibrary=ffi。库( libmylibrary ,{

  do _ some _ number _ fudging :[ double ,[ double , int ] ],

  create_object: [ myobjPtr,[] ],

  do_stuff_with_object: [ double ,[ myobjPtr ] ],

  use_string_with_object: [ void ,[ myobjPtr, string ] ],

  delete_object: [ void ,[ myobjPtr ] ]

  });然后,可以在js中调用它:

  var RES=my library . do _ some _ number _ fudging(1.5,5);

  var fun _ object=my library . create _ object();

  if (fun_object.isNull()) {

  console.log(哦不!无法创建对象!\ n’);

  }否则{

  my library . use _ string _ with _ object(fun _ object, Hello World!);

  var fun=my library . do _ stuff _ with _ object(fun _ object);

  my library . delete _ object(fun _ object);

  }更多关于node的信息,请访问:nodejs教程!Node.js的拓展开发就是这样的更多前期知识分享详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: