本篇文章给大家分享的是有关如何构建JavaScript插件系统,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
插件是库和框架的常见功能,并且有一个很好的使用它的理由:它们允许开发人员以安全,可扩展的方式添加功能。这就使核心项目更具价值,这种开放形势可以帮助项目建立社区,并且不会为我们增加额外的维护负担。
本文就使用JavaScript来构建一个我们自己的插件系统。
这里我使用的是“pluginn”一词,但这些东西有时也称为其他名称,例如“扩展”,“附件”或“模块”,无论你叫什么,它的含义(和收益)都是相同的。
<强>让我们构建一个插件系统强>
让我们从一个名为<代码> BetaCalc> 代码的示例项目开始。<代码> BetaCalc> 代码的目标是成为一个简约的JavaScript <代码> 代码>计算器,其他开发人员可以在其中添加“按钮”。下面是一些基本的代码,可以帮助我们入门:
//计算器 const betaCalc={ currentValue: 0, setValue (newValue) { 这一点。currentValue=https://www.yisu.com/zixun/newValue; console.log (this.currentValue); }, +(加数){ this.setValue(这一点。currentValue +加数); }, -(减数){ this.setValue(这一点。currentValue -减数); } };//使用计算器 betaCalc.setValue (3);//=> 3 betaCalc.plus (3);//=> 6 betaCalc.minus (2);//4=>
为了简单起见,我们将计算器定义为<代码>对象> 代码。该计算器通过<代码>控制台。日志> 代码打印结果。
现在功能真的很简单。我们有一个<代码> setValue 代码>方法,它接受一个数字并将其显示在“屏幕”上。我们还有<代码>和代码>和<代码> - 代码>方法,它们将对当前显示的值执行操作。
是时候添加更多的功能了。让我们从创建一个插件系统开始。
<强>世界上最小的插件系统
强>
我们将从创建一个<代码> 代码>注册方法开始,其他开发人员可以使用它在<代码> BetaCalc> 代码上注册插件。这个方法的原理很简单:获取外部插件,获取其<代码>执行代码>功能,并将其作为新方法附加到我们的计算器上:
//计算器 const betaCalc={//渌扑闫鞔? 注册(插件){ const{名称、exec}=插件; 这[名字]=执行; } };
这是一个示例插件,为我们的计算器提供了一个<代码> 代码>按平方钮:
//定义插件 const squaredPlugin={ 名称:& # 39;平方# 39; 执行:函数(){ this.setValue(这一点。currentValue * this.currentValue) } };//注册插件 betaCalc.register (squaredPlugin);
在许多插件系统中,插件通常分为两个部分:
- <李>要执行的代码李> <李>元数据(例如名称,描述,版本号,依赖项等)李>
在我们的插件中,<代码>执行代码>函数包含我们的代码,名称是我们的元数据。当插件注册时,<代码>执行代码>函数直接作为方法附加到<代码> betaCalc> 代码对象上,从而使其可以访问<代码> betaCalc 代码>的<代码> 代码>。
现在,<代码> betaCalc> 代码有一个新的<代码> 代码>按平方钮,可以直接调用:
betaCalc.setValue (3);//=比;3. betaCalc.plus (2);//=比;5 betaCalc.squared ();//=比;25 betaCalc.squared ();//=比;
这625个系统有很多优点。该插件是一种简单的对象字面量,可以传递给我们的函数。这意味着可以通过<代码> npm> 代码下载插件并将其作为<代码> ES6 代码>模块导入。
但是我们的系统有一些缺陷。
通过为插件提供对<代码> BetaCalc 代码>的<代码> 代码>访问权限,插件可以对所有<代码> BetaCalc> 代码的代码进行读/写访问。虽然这对于获取和设置<代码> currentValue> 代码很有用,但也很危险。如果某个插件要重新定义内部函数(如<代码> setValue> 代码),则它可能会对<代码> BetaCalc> 代码和其他插件产生意外的影响。这违反了开放闭合原则,该原则规定,软件实体应该对扩展开放,对修改关闭。
同样的,<代码> 代码>函平方数通过产生副作用发挥作用。这在<代码> JavaScript代码>中并不少见,但感觉不是很好,特别是当其他插件可能在处理同一内部状态时。一种更实用的方法将大大有助于使我们的系统更安全,更可预测。
<强>更好的插件架构