必要に応じて、AngularコンポーネントをReact、Vue、さらにjQueryに実装します

npmでクールなコンポーネントを見つけたが、接頭辞がng、ngx、angularなどである場合は、これについて動揺しないでください。 このコンポーネントを入手するには、多くの解決策があります。 この記事では、Angularチームによって公式にサポートされているソリューション、つまりAngular Elementsについて検討します。

実際には、 Awesome Angularから任意のコンポーネントを選択してください。

シンプルだが非常に興味深い-ngx-avatarを選択しました。 次に、さまざまなソーシャルネットワークのアバターを表示するか、単にユーザーのイニシャルを表示します。
このようなもの:


そして彼はシンプルなAPIを持っています。ここに小さな例を示します:

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

それで、このためのAngularプロジェクトを作成してライブラリを接続しましょう。

 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() { } } 

簡単にするために、入力パラメーターの1つのみを使用しました。

これらすべてからユニバーサルコンポーネントを作成します。 要素を機能させるには、プロジェクトに角度要素を追加する必要があります。

 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() {} } 

いいね! 今、私たちはこのすべての善を集める必要があります。 これを行うには、コンポーネントを1つの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'); })(); 

すべて準備完了です! 収集するだけです。 このようなスクリプトをpackage.jsonに追加します。

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

さて、それだけです! そのようなjsファイル `avatar-lib.js`の重量は、221 kBからgzipで60 KBです。 当然、より多くの角度 /コアが含まれています。 ngx-avatar自体の重量は、gzipで約16.8kBと5.4kBです。 avatar-lib.jsの重量を大幅に削減するには、Ivy Compilerが必要ですが、これは別の記事のトピックです。 (この時点でIvyがリリースされるか、現在入手可能なものから手動で収集することを望みます)。

Angular Elementsは私たちに何を与えましたか?

これは、Webコンポーネントを実装するための便利なAPIです。 実際、それなしでもできます。 以前に何ができたかをご覧ください: Jia Liの記事(現在Zone.jsに積極的に付属しています)

コンポーネントを他のフレームワークに埋め込みます。

Vueで最初に。 便利な方法で接続し、avatar-libをテンプレートに挿入し、標準のvue bingを介してデータを転送します。

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

Outputイベントを整理することも可能です。

Vueデモ: https : //github.com/Jamaks/angular-element/tree/master/ang-el-vue

Reactの時間です! すべてが同じくらい簡単です:

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

React Demo

まあ、一般的に、プロジェクト

現時点でのブラウザのサポートに関して:

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

もちろん、この実装方法を使用するかどうかはあなた次第です。 UIコンポーネントは何にもアタッチせず、同様のサフィックス(ng-、ngx-、v-、react-、rc-など)を付けないようにします。

ボーナス!

コンポーネント(ngx-avatar)のサイズに触発されて、私はまだngtsc、ngccをフィードしてから、ロールアップを使用してアセンブルしようとしました。 しかし、選択したコンポーネントには多くの外部モジュールが必要だったため、試行は失敗しました。 絶望的で、このコンポーネントにいくらか似ていて、その結果はうれしい驚きでした-現時点(7.1.2)では、ライブラリはgzipで〜96kbと〜26kbでした。 当然のことながら、多くの依存関係があり、私のロールアップ構成には多くの要望が残されています。 しかし、それでも、これはIvyのプレゼンテーション中に表示された3kbではありません。 ngccをWebpack(cli)に展開し、ドキュメントを作成するときは、期待されることです。

また、Angularの世界から小さな実験やインサイダーを見つけることもできます

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


All Articles