如何使用 Deno 实现可插拔的架构

阅读时长 8 分钟读完

前言

可插拔的架构是面向接口编程思想的一种体现,可以使系统更灵活、更可扩展、更易于维护。传统的服务端语言如Java、Python等都有支持可插拔的实现,如Java的SPI、Python的setuptools,在前端领域,我们可以使用Deno实现可插拔的架构。

本文将介绍如何使用Deno实现可插拔的架构,并通过一个示例来加深理解。

什么是Deno

Deno是一个用 Rust 和 TypeScript 编写的基于V8引擎的JavaScript/TypeScript 运行时环境,它拥有更好的安全性、更好的性能以及更好的开发者体验。

相比于Node.js,Deno有以下特点:

  • 带有内置的模块加载器,不需要任何配置即可使用import载入模块。
  • 支持ES模块。没有模块缓存的问题,更好的类型支持。
  • 内置TypeScript支持,可以直接运行ts文件,无需编译。
  • 更好的权限控制,可以在启动时配置访问与否。

因为Deno本身就支持ES模块,所以它很适合我们用来实现可插拔的架构。

可插拔架构的实现方式

在实现可插拔架构前,我们需要先搞清楚其实现方式。一种常见的实现方式是SPI(Service Provider Interface)。在Java中,SPI是通过扩展java.util.ServiceLoader对应API实现的;在Python中,setuptools提供了对entry_points的支持,用来定义可插拔的接口和实现。

而在Deno中,我们可以通过一个中心化的入口来实现可插拔的架构——注册表。

步骤如下:

  • 定义接口及其方法,定义接口名,并导出接口。
  • 将接口及其方法使用Reflect.defineProperty方法注册到中心化的注册表。
  • 注册的实现需要遵循该接口规范,通过Reflect.has方法检查并注册实现。

实现过程

我们来通过一个简单的示例,来了解如何使用Deno实现这个架构方式。这个示例是实现加密算法的接口及两种实现方式。

加密算法接口定义

先定义一个加密算法的接口Encryptor及其方法encrypt,定义接口名encryptor并导出接口。

注册表实现

我们创建一个名为registry.ts的文件,实现该注册表。它会将所有注册的实现存入一个类Map中。在这个map里,key是对应的接口名,value是对应的实现。

-- -------------------- ---- -------
----- -------- - --- ----
  -------
  - ----- -------- --- -- -- --------- -
----

------ -------- -------------- ------- --------- - ----- -------- --- -- -- --------- --- ---- -
  -- --------------------- -
    ------------------ ----------
  - ---- -
    ----- ---------------- - -------------------
    ------------------ - -------------------- ----------- ---
  -
-

------ -------- ------------------ -------- - ----- -------- --- -- -- --------- - - ---- -
  -- --------------------- -
    ------ -----
  -
  ------ -------------------
-

实现两种加密算法

我们来编写两个加密算法Sha1Encryptor和Md5Encryptor,实现Encryptor接口,分别对应SHA1算法和MD5算法。它们需要在开头写上注册代码。

-- -------------------- ---- -------
--------------------- -
  --------------
  -------------
---

------ ----- ------------- ---------- --------- -
  -------------- -------- ------ -
    ------ ------ - - ------
  -
-

------ ----- ------------ ---------- --------- -
  -------------- -------- ------ -
    ------ ----- - - ------
  -
-

使用

通过以上步骤,我们已经定义好了接口,实现了两个加密算法,并且将其注册到了注册表中。现在我们可以在实际开发时,通过调用getProviders()方法来获取所有加密算法的实现,并进行使用。

-- -------------------- ---- -------
------ - --------- - ---- -----------------
------ - ------------ - ---- ----------------

----- --------- - --------------------------
-- ---------- --- ----- -
  --- ------ -------- -- ---------- -
    ----- ---------- --------- - --- ----------------------
    ------------------------------------ ---------
  -
-

运行

我们可以从命令行运行这个示例:

代码总结

-- -------------------- ---- -------
-- ------------
------ --------- --------- -
  -------------- -------- -------
-

-------------
----- -------- - --- ----------- - ----- -------- --- -- -- --------- -----

------ -------- ---------
  ----- -------
  --------- - ----- -------- --- -- -- --------- --
-- ---- -
  -- --------------------- -
    ------------------ ----------
  - ---- -
    ----- ---------------- - -------------------
    ------------------ - -------------------- ----------- ---
  -
-

------ -------- -------------
  ----- -------
-- - ----- -------- --- -- -- --------- - - ---- -
  -- --------------------- -
    ------ -----
  -
  ------ -------------------
-

------------------
------ - --------- - ---- -----------------
------ - -------- - ---- ----------------

--------------------- -
  --------------
---

------ ----- ------------- ---------- --------- -
  -------------- -------- ------ -
    ------ ------ - - ------
  -
-

-----------------
------ - --------- - ---- -----------------
------ - -------- - ---- ----------------

--------------------- -
  -------------
---

------ ----- ------------ ---------- --------- -
  -------------- -------- ------ -
    ------ ----- - - ------
  -
-

---------
------ - --------- - ---- -----------------
------ - ------------ - ---- ----------------

----- --------- - --------------------------

-- ---------- --- ----- -
  --- ------ -------- -- ---------- -
    ----- ---------- --------- - --- ----------------------
    ------------------------------------ ---------
  -
-

结语

本文介绍了使用Deno实现可插拔的架构的方法,并通过一组简单的示例加深对其的理解。希望能给读者带来一些启发,使得读者在实际开发中能更好地应用这一思想。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e7f646f6b2d6eab33613cf

纠错
反馈