随着前端开发的不断发展,组件化已成为了一种必备的实践方式。截止目前,一些经典的类库和框架,如 React、Vue、Angular 等,已经成为了占据前端开发舞台的主线。在这其中,Angular 作为一款全功能型的、渐进式的框架,拥有着极高的可扩展性和可维护性。而 Custom Elements API 作为一项全新的 Web 技术规范,也在魔改 Web 世界的道路上越走越精。
在这篇文章中,我们将探讨如何基于 Custom Elements 和 Angular 实现一个可维护的组件库,并通过一个具体的示例来说明具体实现。
Custom Elements:原生元素时代的改变
传统的 Web 开发中,我们的开发流程通常是按需引入第三方类库,然后在页面进行调用。但这样做带来了一些很明显的问题:
- 全局域污染
- 冗长的打包体积
- 依赖关系导致版本差异和冲突
而 Custom Elements API 正是为了解决这些问题而生。它提供了一个在浏览器原生元素基础之上的,自定义标签的创建方法。开发人员可以轻松地利用 JavaScript 和 HTML 的组合,自定义出符合业务需求的组件。
Custom Elements 的一个基本实现分为以下几个步骤:
- 定义自定义标签
- 创建具有自定义标签的原生 DOM 元素
- 动态绑定数据操作
Angular 的组件化
Angular 是一个以组件为核心的框架,可以轻松地实现组件化思想。Angular 的组件定义方式十分简单,可以通过 @Component
装饰器来进行定义。
一个最简单的 Angular 组件:
import { Component } from '@angular/core'; @Component({ selector: 'app-hello', template: `<h1>Hello World!</h1>` }) export class HelloComponent { }
这个组件仅仅展示一个静态的字符串,但可以看作是最基本的 Angular 组件了。组件之间可以通过输入和输出属性进行通讯,具有独立、复用等优点。
实现可维护化的组件库
实现一个可维护的前端组件库,可谓是一项做功巨大的事情。我们需要保证组件之间的良好通讯,是组件可以被重用的同时,也要保证代码的可读性、可扩展性等。因此,下面将结合 Custom Elements 和 Angular 来说明如何实现一个可维护的组件库:
自定义标签的实现
在 Angular 中,我们可以通过 ViewEncapsulation
设置组件样式隔离的方式来封装组件内部的 CSS。但是还不够,我们还需要让组件完全干净的,一起带着样式和行为,并且这些应该是可以手动插入到 DOM 中的。这正是 Custom Elements API 可以实现的。
通过以下步骤,我们可以实现一个自定义标签:
定义自定义标签
<ng-template #template> <div>Hello, {{ name }}!</div> </ng-template> <ng-container *ngComponentOutlet="MyCustomElementComponent; ngModuleFactory: moduleFactory; content: bind(template)"> </ng-container>
创建具有自定义标签的原生 DOM 元素
const el = document.createElement('my-custom-element'); el.setAttribute('name', 'Alice'); document.body.appendChild(el);
动态绑定数据操作
进行组件的声明
我们需要为这个组件库创建一个动态加载的模块(dynamic loading module)。然后我们就可以在任何 Angular 应用中加载这个模块,而不需要额外地引入组件库的依赖了。如果你通过传统方式引入,你很快就会遭受打包体积和构建缓慢的折磨。
它的核心是一个抽象类,类的实现会在子模块中完成。我们可以通过 Compiler
来动态编译并返回这个类的实例:
export abstract class MyCustomElement { name!: string; abstract template?: TemplateRef<any>; }
-- -------------------- ---- ------- ----- --------------------- - ------ ---------- ------------------------------------------ - ------ - --------- ---------------------- ---------- - --------------------- - -------- ----------------- ----------- -- -- --- ---------------------- ----------------------------------------- -- ----- ----------- -- -- -- - - ----------- -------- - ------------- -- ------------- - ------------------------- -- -------- - ------------------------- -- -- ------ ----- --------------------- - ------ ---------- ------------------------------------------ - ------ - --------- ---------------------- ---------- - --------------------- - -------- ----------------- ----------- -- -- --- ---------------------- ----------------------------------------- -- ----- ----------- -- -- -- - -
一个具体的示例
以上是一些理论和技术的介绍,下面我们将结合一个具体的示例来说明如何实现一个基于 Custom Elements 和 Angular 的可维护组件库。
安装 Angular
我们首先需要进行 Angular 的安装,可以通过以下命令进行安装:
npm install -g @angular/cli
初始化项目
接下来,我们需要初始化一个 Angular 项目:
ng new my-project --prefix=my-custom --routing=false --strict=true
这里我们使用了一个 prefix
参数,这个参数可以用于指定我们自定义的组件前缀,这在后面创建组件时会使用到。
添加组件
我们现在需要为刚刚初始化的项目添加一个自定义组件:
ng generate component my-custom-element --skipSelector --skipTests
这里我们使用了一个 --skipSelector
参数,这样会让 Angular 不会自动生成选择器。
创建模块
我们现在需要创建一个模块来包含我们的自定义组件:
-- -------------------- ---- ------- ------ - -------- - ---- ---------------- ------ - ------------ - ---- ------------------ ----------- ------------- --------------------------- -------- --------------- -------- -------------------------- -- ------ ----- ---------------------- - -
在这个模块中,我们将会声明我们的自定义组件。
包装为 Custom Element 组件
我们现在需要把我们的 MyCustomElementComponent
包装为一个 Custom Element 组件了:
-- -------------------- ---- ------- ------ - ---------- ----------- --------- ----------------- - ---- ---------------- ------ - ------------------- - ---- -------------------- ------ - ------------------------ - ---- -------------------------------- ------------ --------- ------------------------------ --------- - ------------- ------------------------ -- ------- ------- - -------- -------- ---- -------------- ----------------------- ------- -------- -- ------ ----- ---------------------- - ------ ------- ------------ ------- ----------- ---------- - -- ---------- - ----- -- - --------------------------------------------- - --------- ----------------- ------- ------------------------ -- --- ------------------------------------------ ---- - -
在这个组件中,我们把我们的 MyCustomElementComponent
注册为 Custom Element 组件。
引用 Custom Element 组件
我们现在可以在我们的 HTML 中使用这个组件了:
<my-custom-element name="Alice"></my-custom-element>
这样我们就创建了一个基于 Custom Elements 和 Angular 的可维护组件库。
总结
通过结合 Custom Elements 和 Angular,我们可以实现一个非常优秀的前端组件化方案。这个方案除了具有 Angular 的可扩展性和可维护性之外,还可以最大限度地减小打包体积,让我们的应用更加轻巧和优雅。希望这篇文章能对你有所启发,谢谢!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae690248841e9894a74377