问天翼三 發表於 2020-9-10 14:36:00

使用Angular 10 创建Web Component全解析

<p>摘要:使用原生js,html,css封装web component比较麻烦,在angular 10.0中,提供了一种使用angular elements把angular component转换成web component的能力。</p>
<p>这是一篇介绍如何使用angular创建web component的文章。</p>
<h2>你将会看到:</h2>
<ol>
<li>
<p>使用angular创建web component的原理</p>
</li>
<li>
<p>如何使用angular创建web component</p>
<ol>
<li>
<p>新建angular工程</p>
</li>
<li>删除app.component组件及更新app.module</li>
<li>
<p>安装依赖包:angular custom elements</p>
</li>
<li>
<p>新建angular component</p>
</li>
<li>
<p>添加到entryComponent中</p>
</li>
<li>
<p>使用createCustomElement()函数创建自定义元素</p>
</li>
<li>
<p>使用customElements.define()函数把自定义元素挂载到浏览器上的customElementRestory</p>
</li>
</ol></li>
<li>
<p>打包项目</p>
</li>
<li>
<p>优化打包过程</p>
</li>
<li>
<p>在原本的angular项目中使用</p>
</li>
<li>
<p>在其他angular项目中使用</p>
</li>
<li>
<p>在普通的html中使用</p>
</li>
<li>
<p>在react项目中使用</p>
</li>
<li>使用angular来封装web component的一些问题</li>
<li>
<p>如何使用web component实现微前端</p>
</li>
</ol>
<h2>版本:</h2>
<p>demo使用的是新版 angular 10.04版本。</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903162535233-805580431.png"></p>
<h2>一.&nbsp;工作原理:</h2>
<p>angular提供了createCustomElement()函数,它把angular component的各种功能转换成web component标准的各种接口。</p>
<p>然后使用原生的customElements.define()函数把自定义的元素注册到浏览器的CustomElementRegistry中。</p>
<p>这样,当页面上出现这个自定义的元素时,浏览器会把CustomElementRegistry中的相对应的元素实例化,实例化出的对象其实是使用angular component的语法,包括数据绑定和变更检测。</p>
<p>&nbsp;</p>
<h2>二. 具体步骤:</h2>
<h4>1.新建angular工程:ng new custom-elements-demo</h4>
<p>执行:ng new custom-elements-demo</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903155855097-1466402298.png"></p>
<p>&nbsp;等待安装包完成:</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903161131942-1402917423.png"></p>
<p>&nbsp;看一下现在的目录结构:</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903161312874-1440319534.png"></p>
<p>&nbsp;项目初始化已经完成了。</p>
<p>&nbsp;此处正常情况应该有叹息的,毕竟安装包需要挺长长长长时间的的的的~~~</p>
<h4>2.删除不必要的app.component</h4>
<p>在原来的angular项目中,app.component是作为入口组件的,现在我们只是为了生成web component,就没有必要有入口组件了。删除与app.component相关的内容。</p>
<ul>
<li>
<p>删除src/app/app.component.html</p>
</li>
<li>
<p>删除src/app/app.component.scss</p>
</li>
<li>
<p>删除src/app/app.component.ts</p>
</li>
<li>
<p>删除src/app/app.component.spec.ts</p>
</li>
<li>
<p>更新src/app/app.module.ts</p>
</li>
</ul>
<p>目录结构:</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903165508127-1005450162.png"></p>
<p>&nbsp;</p>
<p>&nbsp;app.module.ts内容</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

@NgModule({
declarations: [],
imports: [
    BrowserModule
],
providers: [],
bootstrap: []
})
export class AppModule { }
</pre>
</div>
<p>  </p>
<h4>3.安装依赖包:ng add @angular/elements</h4>
<p>@angular/elements是angular自定义元素的工具包,我们来安装一下。</p>
<p>执行:ng add @angular/elements</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903163708816-1601167702.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;可以看到,当你安装@angular/elements,会默认安装document-register-element腻子脚本,并且添加到src/polyfills.ts中。</p>
<p>那么为什么需要添加腻子脚本呢?原因是:目前不是所有浏览器都支持自定义元素的,要想让不支持自定义元素的浏览器正常使用,需要添加腻子脚本。</p>
<p>我们来对比一下代码:</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903164315191-1860029211.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;会安装2个依赖:@angular/elements和document-register-element</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903164525647-409224683.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;修改了src/polyfills.ts这个文件,添加腻子脚本到项目中。</p>
<h4>4.新建angular component: ng g c custom-card</h4>
<p>新建一个空的angular component</p>
<p>执行: ng g c custom-card</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200903170154153-71527498.png"></p>
<p>&nbsp;完成custom-card组件,这里就直接贴一下代码了。</p>
<p>custom-card.component.html</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>{{name}}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="info"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">3</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>{{info.age}}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">4</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>{{info.phone}}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="select"</span><span style="color: rgba(255, 0, 0, 1)"> (click)</span><span style="color: rgba(0, 0, 255, 1)">="onSelectUser()"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>选择用户<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>custom-card.component.scss</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(128, 0, 0, 1)">:host </span>{
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(255, 0, 0, 1)">    display</span>:<span style="color: rgba(0, 0, 255, 1)"> flex</span>;
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(255, 0, 0, 1)">    flex-direction</span>:<span style="color: rgba(0, 0, 255, 1)"> column</span>;
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(255, 0, 0, 1)">    width</span>:<span style="color: rgba(0, 0, 255, 1)"> 200px</span>;
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(255, 0, 0, 1)">    height</span>:<span style="color: rgba(0, 0, 255, 1)"> 200px</span>;
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(255, 0, 0, 1)">    border</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px solid gray</span>;
<span style="color: rgba(0, 128, 128, 1)"> 7</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(255, 0, 0, 1)">    padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(255, 0, 0, 1)">    .info {
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(255, 0, 0, 1)">      padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(255, 0, 0, 1)">      span {
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(255, 0, 0, 1)">            display</span>:<span style="color: rgba(0, 0, 255, 1)"> block</span>;
<span style="color: rgba(0, 128, 128, 1)">13</span>         }
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(128, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(128, 0, 0, 1)">}</span></pre>
</div>
<p>&nbsp;</p>
<p>custom-card.component.ts</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 0, 1)">import </span>{<span style="color: rgba(255, 0, 0, 1)"> Component, OnInit, Input, Output, EventEmitter </span>}<span style="color: rgba(128, 0, 0, 1)"> from '@angular/core';
import </span>{<span style="color: rgba(255, 0, 0, 1)"> UtilService </span>}<span style="color: rgba(128, 0, 0, 1)"> from '../util.service';
@Component(</span>{<span style="color: rgba(255, 0, 0, 1)">
selector</span>:<span style="color: rgba(0, 0, 255, 1)"> 'app-custom-card',
templateUrl: './custom-card.component.html',
styleUrls: ['./custom-card.component.scss']
</span>}<span style="color: rgba(128, 0, 0, 1)">)
export class CustomCardComponent implements OnInit </span>{<span style="color: rgba(255, 0, 0, 1)">
@Input() name = '';
@Input() info = {
    age</span>:<span style="color: rgba(0, 0, 255, 1)"> 0,
    phone: ''
</span>}<span style="color: rgba(128, 0, 0, 1)">;
@Output() selectUser = new EventEmitter();

constructor(
    private util: UtilService
) </span>{ }<span style="color: rgba(128, 0, 0, 1)">
ngOnInit(): void </span>{<span style="color: rgba(255, 0, 0, 1)">
    this.util.log();
</span>}<span style="color: rgba(128, 0, 0, 1)">
onSelectUser(): void </span>{<span style="color: rgba(255, 0, 0, 1)">
    this.selectUser.emit({...this.info, name</span>:<span style="color: rgba(0, 0, 255, 1)"> this.name</span>}<span style="color: rgba(128, 0, 0, 1)">);
}
}</span></pre>
</div>
<p>&nbsp;</p>
<p>这里card显示user的name age phone,其中name是单独作为字符串传递进card 组件的,而age 和 phone是包装在info对象中的,只是为了演示传递值的区别。</p>
<p>当用户点击选择user的button时,会把当前的user信息发送出来,这是为了演示怎么响应web component的事件。</p>
<h4>5.添加到entryComponent</h4>
<p>有一类组件被包含在模板中,它们是声明式加载的;另一类组件你会命令式加载它,这就是入口组件。对于入口组件,需要添加到module.entryComponent中。</p>
<p>app.module.ts</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { CustomCardComponent } from './custom-card/custom-card.component';

@NgModule({
declarations: ,
imports: [
    BrowserModule
],
providers: [],
bootstrap: [],
entryComponents:
})
export class AppModule { }</pre>
</div>
<h4>6.使用createCustomElement()函数创建自定义元素</h4>
<p>@angular/elements包导出的createCustomElement()函数原来把angular component转换成浏览器能够识别的自定义元素。</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">const customCardEle = createCustomElement(CustomCardComponent, {injector});  </pre>
</div>
<h4>7.使用customElements.define()函数把自定义元素挂载到浏览器上的customElementRestory</h4>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">customElements.define('custom-card', customCardEle);
</pre>
</div>
<p>&nbsp;第一个参数是自定义元素的tag名称,第2个参数就是自定义元素。</p>
<p>&nbsp;</p>
<p>创建自定义元素的代码放在哪里?</p>
<p>angular项目都需要有一个启动组件,一般的angular项目定义在NgModule.bootstrap中,对于对于web component的组件,NgModule.bootstrap是空的。</p>
<p>这个时候,启动组件其实是AppModule这个类中的ngDoBootstrap()函数,我们可以把定义web component的代码放到这个函数中。</p>
<div class="cnblogs_Highlighter">
<pre class="brush:javascript;gutter:true;">import { BrowserModule } from '@angular/platform-browser';
import { NgModule, Injector } from '@angular/core';
import { createCustomElement } from '@angular/elements';
import { CustomCardComponent } from './custom-card/custom-card.component';

@NgModule({
declarations: ,
imports: [
    BrowserModule
],
providers: [],
bootstrap: [],
entryComponents:
})
export class AppModule {
constructor(
    private injector: Injector
) {
}
ngDoBootstrap(): void {
    const customCardEle = createCustomElement(CustomCardComponent, {injector: this.injector});
    customElements.define('custom-card', customCardEle);
}
}
</pre>
</div>
<p>  </p>
<p>&nbsp;</p>
<p>至此,在angular中创建web component已经完成了,下面我们来看一下如何打包及使用。</p>
<h2>三. 打包项目</h2>
<p>1.执行:<em id="__mceDel">ng&nbsp;build&nbsp;--prod=true&nbsp;--outputHashing=none</em></p>
<p><em>  </em>--prod=true可以让angular优化打包的项目,例如&nbsp;tree-shaking</p>
<p>  --outputHashing=none原本打包的文件名有hash值,使用这个设置可以去掉hash</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200904100329294-1115986448.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;可以看到生成3个js文件,一个css文件。</p>
<p>我们新建一个html文件,把生成的runtime.js main.js polyfills.js和styles.css导入到这个html中。</p>
<p>test.html</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html </span><span style="color: rgba(255, 0, 0, 1)">lang</span><span style="color: rgba(0, 0, 255, 1)">="en"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="viewport"</span><span style="color: rgba(255, 0, 0, 1)"> content</span><span style="color: rgba(0, 0, 255, 1)">="width=device-width, initial-scale=1.0"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>Document<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 7</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style </span><span style="color: rgba(255, 0, 0, 1)">href</span><span style="color: rgba(0, 0, 255, 1)">="dist/custom-elements-demo/style.css"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="dist/custom-elements-demo/main.js"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="dist/custom-elements-demo/polyfills.js"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">src</span><span style="color: rgba(0, 0, 255, 1)">="dist/custom-elements-demo/runtime.js"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">14</span>         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>正被选择的用户:<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">15</span>         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">span </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="user"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">17</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">custom-card </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="1"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">custom-card</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">custom-card </span><span style="color: rgba(255, 0, 0, 1)">id</span><span style="color: rgba(0, 0, 255, 1)">="2"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">custom-card</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      const user </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementById(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">user</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      const card </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementById(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">1</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card.name </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">wt</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card.info </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {age: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">25</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, phone: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">111-222-3333</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card.addEventListener(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">selectUser</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, (e) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">            user.innerText </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> e.detail.name;
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      });
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      const card1 </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementById(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">2</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">28</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card1.name </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">syc</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card1.info </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {age: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">18</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, phone: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">555-666-3333</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      card1.addEventListener(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">selectUser</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, (e) </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">            user.innerText </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> e.detail.name;
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">      });
</span><span style="color: rgba(0, 128, 128, 1)">33</span>   <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>可以看到,custom-card这个web component的使用和一般的html元素并没有区别。</p>
<p>下面是显示的结果:</p>
<p><img src="https://img2020.cnblogs.com/blog/2086094/202009/2086094-20200904140026839-225148694.png"></p>
<p>&nbsp;</p>
<p>&nbsp;我们可以看到,默认情况下,angular使用ng build是把项目打成4个文件的,3个js文件和一个css文件,一般的项目使用没问题,但是定义web component项目,4个文件有点不方便,如果只使用一个文件就好了。</p>
<p>我们来使用webpack来再次打包一下,目标是合成一个文件。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;修改build 命令:&nbsp;<em id="__mceDel">ng&nbsp;build&nbsp;--prod=true&nbsp;--outputHashing=none&nbsp;--single-bundle</em></p><br><br>
来源:https://www.cnblogs.com/JasonWang-code/p/13606137.html
頁: [1]
查看完整版本: 使用Angular 10 创建Web Component全解析