рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, Vue рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ jQuery рдореЗрдВ рдХреЛрдгреАрдп рдШрдЯрдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ

рдпрджрд┐ рдЖрдкрдХреЛ рдПрдирдкреАрдПрдо рдореЗрдВ рдПрдХ рд╢рд╛рдВрдд рдШрдЯрдХ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдПрдирдЬреА, рдПрдирдПрдХреНрд╕рдПрдХреНрд╕, рдХреЛрдгреАрдп рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╣реИ, рддреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВред рдЗрд╕ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдгреАрдп рдЯреАрдо, рдЕрд░реНрдерд╛рддреН рдХреЛрдгреАрдп рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред

рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА рдХреЛрдгреАрдп рд╕реЗ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдХреЛ рдЪреБрдиреЗрдВред

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк - рдПрдирдПрдХреНрд╕рдПрдХреНрд╕-рдЕрд╡рддрд╛рд░ рдЪреБрдирд╛ ред рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЕрд╡рддрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЖрджреНрдпрд╛рдХреНрд╖рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:


рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рд╣реИ, рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

<ngx-avatar facebookId="1508319875"></ngx-avatar> <ngx-avatar src="assets/avatar.jpg"></ngx-avatar> <ngx-avatar name="John Doe"></ngx-avatar> 

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдгреАрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

 ng new avatar-lib --minimalN npm i ngx-avatar --save 

рдкреИрдХреЗрдЬ рдХреЛ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред

 import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; // Import your AvatarModule import { AvatarModule } from 'ngx-avatar'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, // Specify AvatarModule as an import AvatarModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } 

рдЕрдм рдПрдХ рд╕рд░рд▓ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ `AvatarModule` рдЕрдкрдиреЗ рдПрдХрдорд╛рддреНрд░ рдШрдЯрдХ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

 ng gc avatar 

 import { Component, ViewEncapsulation, Input } from '@angular/core'; @Component({ selector: 'app-avatar', template: ` <ngx-avatar [name]="name"></ngx-avatar> `, styles: [], encapsulation: ViewEncapsulation.ShadowDom }) export class AvatarComponent { @Input() name: string; constructor() { } } 

рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рд╣рдо рдЗрд╕ рд╕рдм рд╕реЗ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдШрдЯрдХ рдмрдирд╛рдПрдВрдЧреЗред рд╣рдорд╛рд░реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдгреАрдп рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

 ng add @angular/elements 

рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдХрдорд╛рдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддрддреНрд╡реЛрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рддрддреНрд╡реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рднреА рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ред

 "scripts": [{ "input": "node_modules/document-register-element/build/document-register-element.js" }] 

рдкрд░рд┐рдгрд╛рдореА app.module.ts:

 import { BrowserModule } from '@angular/platform-browser'; import { NgModule, Injector } from '@angular/core'; import { createCustomElement } from '@angular/elements'; import { AvatarComponent } from './avatar.component'; import { AvatarModule } from 'ngx-avatar'; @NgModule({ declarations: [AvatarComponent], imports: [AvatarModule, BrowserModule], entryComponents: [AvatarComponent] }) export class AppModule { constructor(private injector: Injector) { //    Angular Element const avatarComponent = createCustomElement(AvatarComponent, { injector }); //     customElements.define('avatar-lib', avatarComponent); } ngDoBootstrap() {} } 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдПрдХ js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреИрдХ рдХрд░реЗрдЧрд╛:

 const fs = require('fs-extra'); const concat = require('concat'); (async function build() { const files = [ './dist/avatar-lib/runtime.js', './dist/avatar-lib/polyfills.js', './dist/avatar-lib/scripts.js', './dist/avatar-lib/main.js' ]; await fs.ensureDir('elements'); await concat(files, 'elements/avatar-lib.js'); })(); 

рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ! рдпрд╣ рдХреЗрд╡рд▓ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред jsonред

 "build:elements": "ng build --prod --output-hashing none && node build.js" 

рдЦреИрд░, рдпрд╣ рдмрд╛рдд рд╣реИ! рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА js рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓реА 'avatar-lib.js' рд╡рдЬрди ~ 221kB рдФрд░ ~ 60kb рдЧрдЬрд╝рд┐рдк рдореЗрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХрдИ рдФрд░ рдХреЛрдгреАрдп / рдХреЛрд░ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдирдПрдХреНрд╕рдПрдХреНрд╕-рдЕрд╡рддрд╛рд░ рдХрд╛ рд╡рдЬрд╝рди рд▓рдЧрднрдЧ 16.8kB рдФрд░ 5.4kB рд╣реИред рдЕрд╡рддрд╛рд░-lib.js рдХреЗ рд╡рдЬрди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЖрдЗрд╡реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред (рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдЗрд╡реА рдЗрд╕ рдХреНрд╖рдг рддрдХ рдЬрд╛рд░реА рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдореИрдВ рдЕрдм рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЙрд╕рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реВрдВрдЧрд╛)ред

рд╣рдореЗрдВ рдХреЛрдгреАрдп рддрддреНрд╡реЛрдВ рдиреЗ рдХреНрдпрд╛ рджрд┐рдпрд╛?

рдпрд╣ рд╡реЗрдм рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЖрд╕рд╛рди рдПрдк рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рднреА рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рдереЗ: рдЬрд┐рдпрд╛ рд▓реА рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ (рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЕрдм рдЬрд╝реЛрди рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ) ред

рд╣рдо рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдЕрдиреНрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ Vue рдореЗрдВред рд╣рдо рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЕрд╡рддрд╛рд░-рд▓рд┐рдм рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдорд╛рдирдХ vue bings рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 <avatar-lib :name = 'myName'></avatar-lib> 

рдЖрдЙрдЯрдкреБрдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

Vue рдбреЗрдореЛ: https://github.com/Jamaks/angular-element/tree/master/ang-el-vue

рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рдордп рд╣реИ! рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:

 <avatar-lib name = {this.myName}></avatar-lib> 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдбреЗрдореЛ

рдЦреИрд░, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛

рдлрд┐рд▓рд╣рд╛рд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП:

https://angular.io/guide/elements#browser-support-for-custom-elements
https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/define

рдмреЗрд╢рдХ, рдпрд╣ рдЖрдкрдХреЛ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпреВрдЖрдИ рдШрдЯрдХ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рд╕реЗ рди рдЬреБрдбрд╝реЗ рд╣реЛрдВ рдФрд░ рд╕рдорд╛рди рдкреНрд░рддреНрдпрдп рди рд╣реЛрдВ: рдПрдирдЬреА-, рдПрдирдЬреАрдПрдХреНрд╕-, рд╡реА-, рд░рд┐рдПрдХреНрд╢рди-, рдЖрд░рд╕реА- рдЗрддреНрдпрд╛рджрд┐ред

рдмреЛрдирд╕!

рдШрдЯрдХ рдХреЗ рдЖрдХрд╛рд░ (ngx-avatar) рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рдЕрднреА рднреА ngtsc, ngcc рдХреЛ рдлреАрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд░реЛрд▓рдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рдпрд╛рд╕ рдЕрд╕рдлрд▓ рд░рд╣реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЪрдпрдирд┐рдд рдШрдЯрдХ рдХреЛ рдХрдИ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╣рддрд╛рд╢, рдиреЗ рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдХреБрдЫ рдЕрдВрд╢ рдмрдирд╛рдпрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реБрдП - рдлрд┐рд▓рд╣рд╛рд▓ (7.1.2), рдкреБрд╕реНрддрдХрд╛рд▓рдп ~ 96kb рдФрд░ ~ 26 gzip рдореЗрдВ рдерд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рд╕рд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдереАрдВ, рдФрд░ рдореЗрд░реЗ рд░реЛрд▓рдЕрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ 3kb рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЖрдЗрд╡реА рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рджреМрд░рд╛рди рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдХрд┐ рдЬрдм рд╡реЗ рд╡реЗрдмрдкреИрдХ (рд╕реАрдПрд▓рдЖрдИ) рдХреЗ рд▓рд┐рдП рдПрдирд╕реАрд╕реА рдХреЛ рддреИрдирд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЖрдк рдпрд╣рд╛рдВ рдкрд░ рдХреЛрдгреАрдп рджреБрдирд┐рдпрд╛ рдХреЗ рдЫреЛрдЯреЗ рдкреНрд░рдпреЛрдЧ рдФрд░ рдЕрдВрджрд░реВрдиреА рдЬрд╛рдирдХрд╛рд░реА рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

Source: https://habr.com/ru/post/hi432664/


All Articles