位置: 编程技术 - 正文

Node.js插件的正确编写方式(nodejs 插件开发)

编辑:rootadmin

推荐整理分享Node.js插件的正确编写方式(nodejs 插件开发),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs工具,nodejs 插件开发,node .js,node .js,node.js组件,node插件 用来记录一个完整流程,nodejs 插件开发,node 插件,内容如对您有帮助,希望把文章链接给更多的朋友!

Node.js在利用JavaScript编写后端方面效果拔群,值得我们多加尝试。不过如果大家需要一些无法直接使用的功能甚至是根本无从实现的模块使用,那么能否从C/C++库当中引入此类成果呢?答案是肯定的,大家要做的就是编写一款插件,并借此在自己的JavaScript代码中使用其它代码库的资源。下面我们就一同开始今天的探询之旅。

介绍

正如Node.js在官方说明文档中所言,插件是以动态方式进行链接的共享式对象,能够将JavaScript代码与C/C++库接驳起来。这意味着我们可以引用任何来自C/C++库中的内容,并通过创建插件的方式将其纳入到Node.js当中。

作为实例,我们将为标准std::string对象创建一套封装。

准备工作

在我们开始编写工作之前,大家首先需要确保自己已经准备好所有后续模块编译所需要的素材。大家需要node-gyp及其全部依赖关系。大家可以利用以下命令安装node-gyp:

在依赖性方面,我们需要为Unix系统准备以下项目:&#; Python (要求2.7版本, 3.x无法正常起效)

&#; make

&#; 一款C++编译器工具链(例如gpp或者g++)

举例来说,在Ubuntu上大家可以利用以下命令安装所有上述项目(其中Python 2.7应该已经预先安装完毕了):

在Windows系统环境下,大家需要的是:

&#; Python (2.7.3版本, 3.x无法正常起效)

&#; 微软Visual Studio C++ (适用于Windows XP/Vista)

&#; 微软Visual Studio C++ for Windows Desktop (适用于Windows 7/8)

强调一点,Visual Studio的Express版本也能正常起效。

binding.gyp文件

该文件由node-gyp使用,旨在为我们的插件生成适当的build文件。大家可以点击此处查看维基百科提供的.gyp文件说明文档,但今天我们要使用的实例非常简单、因此只需使用以下代码即可:

其中target_name可以设置为大家喜欢的任何内容。而sources数组当中包含该插件需要用到的所有源文件。在我们的实例中还包括addon.cc,它的作用在于容纳编译插件及stdstring.cc所必需的代码,外加我们的封装类。

STDStringWrapper类

第一步,我们要做的是在stdstring.h文件当中定义自己的类。如果大家对于C++编程比较熟悉,那么也一定不会对以下两行代码感到陌生。

这属于标准的include guard。接下来,我们需要将以下两个header纳入include范畴:

#include #include第一个面向的是std::string类,而第二个include则作用于全部与Node以及V8相关的内容。

这一步完成之后,我们可以对自己的类进行声明:

class STDStringWrapper : public node::ObjectWrap { 对于所有我们打算包含在插件当中的类来说,我们必须扩展node::ObjectWrap类。

现在我们可以开始定义该类的private属性了:

除了构造函数与解析函数,我们还需要为std::string定义一个指针。这是该技术的核心所在,能够被用于将C/C++代码库与Node相对接——我们为该C/C++类定义一个私有指针,并将在随后的所有方法中利用该指针实现操作。

现在我们声明的constructor静态属性,它将为我们在V8中创建的类提供函数:

static v8::Persistent constructor; 感兴趣的朋友可以点击此处参阅模板说明方案以获取更多细节信息。

现在我们还需要一个New方法,它将被分配给前面提到的constructor,同时V8会对我们的类进行初始化:

static v8::Handle New(const v8::Arguments& args); 作用于V8的每一个函数都应该遵循以下要求:它将接受指向v8::Arguments对象的引用,并返回一个v8::Handle>v8::Value>——这正是我们在使用强类型C++编码时,V8处理弱类型JavaScript的一贯方式。

在此之后,我们还需要将另外两个方法插入到对象的原型当中:

其中toString()方法允许我们在将其与普通JavaScript字符串共同使用时获得s_的值而非[Object object]的值。

最后,我们将引入初始化方法(此方法将由V8调用并指派给constructor函数)并关闭include guard:

其中exports对象在JavaScript模块中的作用等同于module.exports。

stdstring.cc文件、构造函数与解析函数

现在来创建stdstring.cc文件。我们首先需要include我们的header:

下面为constructor定义属性(因为它属于静态函数):

这个为类服务的构造函数将分配s_属性:

而解析函数将对其进行delete,从而避免内存溢出:

再有,大家必须delete掉所有与new一同分配的内容,因为每一次此类情况都有可能造成异常,因此请牢牢记住上述操作或者使用共享指针。

Node.js插件的正确编写方式(nodejs 插件开发)

Init方法

该方法将由V8加以调用,旨在对我们的类进行初始化(分配constructor,将我们所有打算在JavaScript当中使用的内容安置在exports对象当中):

void STDStringWrapper::Init(v8::Handle exports) { 首先,我们需要为自己的New方法创建一个函数模板:

v8::Local tpl = v8::FunctionTemplate::New(New); 这有点类似于JavaScipt当中的new Function——它允许我们准备好自己的JavaScript类。

现在我们可以根据实际需要为该函数设定名称了(如果大家漏掉了这一步,那么构造函数将处于匿名状态,即名称为function someName() {}或者function () {}):

tpl->SetClassName(v8::String::NewSymbol("STDString")); 我们利用v8::String::NewSymbol()来创建一个用于属性名称的特殊类型字符串——这能为引擎的运作节约一点点时间。

在此之后,我们需要设定我们的类实例当中包含多少个字段:

tpl->InstanceTemplate()->SetInternalFieldCount(2); 我们拥有两个方法——add()与toString(),因此我们将数量设置为2。现在我们可以将自己的方法添加到函数原型当中了:

tpl->PrototypeTemplate()->Set(v8::String::NewSymbol("add"), v8::FunctionTemplate::New(add)->GetFunction()); tpl->PrototypeTemplate()->Set(v8::String::NewSymbol("toString"), v8::FunctionTemplate::New(toString)->GetFunction());这部分代码量看起来比较大,但只要认真观察大家就会发现其中的规律:我们利用tpl->PrototypeTemplate()->Set()来添加每一个方法。我们还利用v8::String::NewSymbol()为它们提供名称与FunctionTemplate。

最后,我们可以将该构造函数安置于我们的constructor类属性内的exports对象中:

New方法

现在我们要做的是定义一个与JavaScript Object.prototype.constructor运作效果相同的方法:

我们首先需要为其创建一个范围:

在此之后,我们可以利用args对象的.IsConstructCall()方法来检查该构造函数是否能够利用new关键词加以调用:

如果可以,我们首先如下所示将参数传递至std::string处:

……这样我们就能将它传递到我们封装类的构造函数当中了:

在此之后,我们可以利用之前创建的该对象的.Wrap()方法(继承自node::ObjectWrap)来将它分配给this变量:

最后,我们可以返回这个新创建的对象:

如果该函数无法利用new进行调用,我们也可以直接调用构造函数。接下来,我们要做的是为参数计数设置一个常数:

现在我们需要利用自己的参数创建一个数组:

然后将constructor->NewInstance方法的结果传递至scope.Close,这样该对象就能在随后发挥作用(scope.Close基本上允许大家通过将对象处理句柄移动至更高范围的方式对其加以维持——这也是函数的起效方式):

add方法

现在让我们创建add方法,它的作用是允许大家向对象的内部std::string添加内容:

首先,我们需要为我们的函数创建一个范围,并像之前那样把该参数转换到std::string当中:

现在我们需要对该对象进行拆包。我们之前也进行过这种反向封装操作——这一次我们是要从this变量当中获取指向对象的指针。

接着我们可以访问s_属性并使用其.append()方法:

最后,我们返回s_属性的当前值(需要再次使用scope.Close):

由于v8::String::New()方法只能将char pointer作为值来接受,因此我们需要使用obj->s_->c_str()来加以获取。

这时大家的插件文件夹中还应该创建出一个build目录。

测试

现在我们可以对自己的插件进行测试了。在我们的插件目录中创建一个test.js文件以及必要的编译库(大家可以直接略过.node扩展):

下一步,为我们的对象创建一个新实例:

下面再对其进行操作,例如添加或者将其转化为字符串:

在运行之后,大家应该在控制台中看到以下执行结果:

结论

我希望大家能在阅读了本教程之后打消顾虑,将创建与测试以C/C++库为基础的定制化Node.js插件视为一项无甚难度的任务。大家可以利用这种技术轻松将几乎任何C/C++库引入Node.js当中。如果大家愿意,还可以根据实际需求为插件添加更多功能。std::string当中提供大量方法,我们可以将它们作为练习素材。

实用链接

感兴趣的朋友可以查看以下链接以获取更多与Node.js插件开发、V8以及C事件循环库相关的资源与详细信息。

&#; Node.js插件说明文档

&#; V8说明文档

&#; libuv (C事件循环库),来自GitHub

英文:

Nodejs+express+html5 实现拖拽上传 一、前言文件上传是一个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传。给用户体验带

Node.js入门教程:在windows和Linux上安装配置Node.js图文教程 本章节我们将向大家介绍在window和Linux上安装Node.js的方法。本安装教程以Node.jsv0..版本为例。Node.js安装包及源码下载地址为:

Node.js中使用计时器定时执行函数详解 如果你熟悉客户端JavaScript编程,你可能使用过setTimeout和setInterval函数,这两个函数允许延时一段时间再运行函数。比如下面的代码,一旦被加载到Web页

标签: nodejs 插件开发

本文链接地址:https://www.jiuchutong.com/biancheng/370848.html 转载请保留说明!

上一篇:如何正确使用Nodejs 的 c++ module 链接到 OpenSSL(如何正确使用农药芸苔素)

下一篇:Nodejs+express+html5 实现拖拽上传

  • 餐饮业小规模开发票开什么
  • 电费的增值税税率是多少
  • 在途物资什么科目
  • 跨月的增值税普票作废步骤
  • 回购股票不注销没有意义
  • 核定征收生产经营所得税率
  • 企业购买的雇主责任险
  • 高薪技术企业研发人员人数
  • 背书转让的电子承兑汇票开收据还是发票
  • 打官司失败了要赔偿原告诉讼费吗?
  • 京东电子商务平台业务流程
  • 销售中央空调并安装账务处理
  • 企业的商品产品包括
  • 护栏发票税点
  • 福利费申报个人所得税该如何进行?
  • 税收编码更改的依据是什么
  • 小规模纳税人附加税会计分录
  • 个体户的公账怎么操作
  • 结算会计和往来账的区别
  • 城镇土地使用税税率
  • 如何绕开压缩包密码
  • 公司基本户注销流程
  • 公司强制要求转部门合法吗
  • php中的函数可以分为哪几种
  • 一般计税方法增值税
  • 公司的净资产总值怎么算
  • Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
  • 延期支付土地款利息会计处理
  • 商业汇票贴现时贴现额的大小受贴现期长短的影响
  • 微信公众号开发php源码
  • Cookie 的 SameSite 属性
  • 微信小程序实现文件上传
  • 员工预支款计入什么科目
  • 软件企业高新技术产品证明材料
  • golang 调用动态库
  • 收到电子银行承兑汇票计入什么科目
  • php生成器和迭代器理解
  • 不单独计价的包装物是什么意思
  • 企业给员工报销的个人消费支出如何计税
  • 小规模纳税人能开专票吗2023
  • 单位租的个人房怎么入账
  • 车保险里面的车船税
  • 关联方往来款如何处理
  • 计提福利费是什么意思
  • 虚开发票但是没有成本如何做账?
  • 从银行取现金是什么凭证
  • 小企业会计准则主要按照什么计量
  • 某酒店住宿费用定价分析
  • 投资收益怎么做帐
  • 企业和职工之间的财务关系属于
  • 征收率和税率的区别举例
  • MySQL 5.0.96 for Windows x86 32位绿色精简版安装教程
  • sqlserver存储过程怎么查看
  • 安装完xp系统直接蓝屏怎么办
  • centos7 nis
  • 如何清理注册表的垃圾文件
  • Win7系统打开设备和打印机里面什么都没有
  • centos wi-fi
  • win10系统打开ie浏览器变百度怎么改回ie浏览器了
  • 笔记本上的声卡
  • mac菜单栏不见了
  • new folder.exe是什么
  • win7旗舰版怎么改成专业版
  • win10wifi打开后自动关闭
  • linux命令使用例子
  • win8 embedded
  • linux就要这样学
  • 何为黄金茶
  • perl模块下载
  • 关于中秋节的古诗
  • 批处理列出文件名
  • 如何用jquery
  • UIAutomator在AndroidStudio中的使用
  • 四川医保网上怎么缴费支付宝
  • 河南税务公众号缴费养老保险
  • 简述进料加工对中国的意义
  • 国内进口税最低是哪里
  • 国家税务总局令第52号 ,税务稽查案件办理程序规定
  • 融资租赁 合同
  • 新一轮税制改革的背景是什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设