前言
可插拔的架构是面向接口编程思想的一种体现,可以使系统更灵活、更可扩展、更易于维护。传统的服务端语言如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并导出接口。
export interface Encryptor { encrypt(input: string): string; }
注册表实现
我们创建一个名为registry.ts的文件,实现该注册表。它会将所有注册的实现存入一个类Map中。在这个map里,key是对应的接口名,value是对应的实现。
-- -------------------- ---- ------- ----- -------- - --- ---- ------- - ----- -------- --- -- -- --------- - ---- ------ -------- -------------- ------- --------- - ----- -------- --- -- -- --------- --- ---- - -- --------------------- - ------------------ ---------- - ---- - ----- ---------------- - ------------------- ------------------ - -------------------- ----------- --- - - ------ -------- ------------------ -------- - ----- -------- --- -- -- --------- - - ---- - -- --------------------- - ------ ----- - ------ ------------------- -
实现两种加密算法
我们来编写两个加密算法Sha1Encryptor和Md5Encryptor,实现Encryptor接口,分别对应SHA1算法和MD5算法。它们需要在开头写上注册代码。
-- -------------------- ---- ------- --------------------- - -------------- ------------- --- ------ ----- ------------- ---------- --------- - -------------- -------- ------ - ------ ------ - - ------ - - ------ ----- ------------ ---------- --------- - -------------- -------- ------ - ------ ----- - - ------ - -
使用
通过以上步骤,我们已经定义好了接口,实现了两个加密算法,并且将其注册到了注册表中。现在我们可以在实际开发时,通过调用getProviders()方法来获取所有加密算法的实现,并进行使用。
-- -------------------- ---- ------- ------ - --------- - ---- ----------------- ------ - ------------ - ---- ---------------- ----- --------- - -------------------------- -- ---------- --- ----- - --- ------ -------- -- ---------- - ----- ---------- --------- - --- ---------------------- ------------------------------------ --------- - -
运行
我们可以从命令行运行这个示例:
deno run --allow-read registry.ts sha1Encryptor.ts md5Encryptor.ts main.ts
代码总结
-- -------------------- ---- ------- -- ------------ ------ --------- --------- - -------------- -------- ------- - ------------- ----- -------- - --- ----------- - ----- -------- --- -- -- --------- ----- ------ -------- --------- ----- ------- --------- - ----- -------- --- -- -- --------- -- -- ---- - -- --------------------- - ------------------ ---------- - ---- - ----- ---------------- - ------------------- ------------------ - -------------------- ----------- --- - - ------ -------- ------------- ----- ------- -- - ----- -------- --- -- -- --------- - - ---- - -- --------------------- - ------ ----- - ------ ------------------- - ------------------ ------ - --------- - ---- ----------------- ------ - -------- - ---- ---------------- --------------------- - -------------- --- ------ ----- ------------- ---------- --------- - -------------- -------- ------ - ------ ------ - - ------ - - ----------------- ------ - --------- - ---- ----------------- ------ - -------- - ---- ---------------- --------------------- - ------------- --- ------ ----- ------------ ---------- --------- - -------------- -------- ------ - ------ ----- - - ------ - - --------- ------ - --------- - ---- ----------------- ------ - ------------ - ---- ---------------- ----- --------- - -------------------------- -- ---------- --- ----- - --- ------ -------- -- ---------- - ----- ---------- --------- - --- ---------------------- ------------------------------------ --------- - -
结语
本文介绍了使用Deno实现可插拔的架构的方法,并通过一组简单的示例加深对其的理解。希望能给读者带来一些启发,使得读者在实际开发中能更好地应用这一思想。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e7f646f6b2d6eab33613cf