8 Oracle JET Webコンポーネントの使用
Oracle JET Webコンポーネントは、カスタムHTML要素として埋め込むことができる、再利用可能なユーザー・インタフェース・コードの単位です。Webコンポーネントには、Oracle JETコンポーネント、他のWebコンポーネント、HTML、JavaScriptおよびCSSが含まれます。独自のWebコンポーネントを作成するか、ページに追加できます。
カスタムWebコンポーネントの設計
Oracle JET Webコンポーネントは、複数のコンポーネント・タイプを含むカスタム・コンポーネントです。作成するWebコンポーネントは、アプリケーションで使用することも、Oracle Component Exchangeにアップロードして他の開発者と共有することもできます。
Oracle JETとOracle Component Exchangeでサポートされる様々なコンポーネント・タイプは次のとおりです。
- スタンドアロンWebコンポーネントは、なんらかのUIと定義された一連のプロパティ、メソッド、イベント、スロットを含む従来のUIコンポーネントです。これは、単純で良いボタン・タイプのウィジェットから、カレンダのようにきわめて複雑なページ全面のコンポーネントまで、あらゆるものを表すことができます。
- パック・コンポーネント(JETパック)は、一緒に使用されることを目的とした関連するコンポーネントのバージョン・ストライプを表します。コンシューマがJETパックのメンバーであるコンポーネントを選択すると、コンシューマのアプリケーションは、パック内の個々のコンポーネントではなくパック全体のバージョンと関連付けられます。JETパックによって、そのようなプロジェクトの設定と依存関係の管理が全体的に単純化されます。
- リソース・コンポーネントは、JETパックに含まれるWebコンポーネントによって使用されるアセットの再利用可能ライブラリです。リソース・コンポーネントには、通常、共有イメージ、リソース・バンドル、ユーティリティ・クラスなどが含まれます。リソース・コンポーネントには厳密に事前定義された構造がないため、必要であればなんでも含めることができます。ただし、これによってUIコンポーネントは提供されません。そのかわり、従来のスタンドアロン・コンポーネントが、共有リソースのためにこれらのいずれかを利用します。リソース・コンポーネントはJETパックと連携した使用のみを想定しています。
- 参照コンポーネントは、サードパーティ・コードへの参照を定義します。つまり、参照コンポーネントはコードに対するポインタ(NPMモジュールまたはCDN位置、あるいはその両方)です。参照コンポーネントは、実際にはサードパーティ・ライブラリを含んでおらず、ポイントしているだけです。
特定のアプリケーション・ニーズをサポートするには、スタンドアロンWebコンポーネントを作成できます。また、一緒に使用するためのWebコンポーネントのセットを作成してから、JETパックすなわちパック・コンポーネント・タイプとしてアセンブルすることもできます。パック・コンポーネントには、Webコンポーネントと、パック内の各コンポーネントのバージョン・ストライプを定義する構成ファイルが含まれます。Webコンポーネントがパックの一部である場合は、その定義ファイルを変更して、スタンドアロン・コンポーネントとして使用される同一コンポーネントと区別する必要があります。
ヒント:
少数のパックにコンポーネントをアセンブルすると、コンシューマの観点からは、パスの設定と依存関係の管理がかなり単純になります。
リソース・コンポーネントを使用してJETパック・コンポーネントを拡張できるのは、厳密にUIコンポーネントではないアセットの再利用可能なライブラリがあるときです。リソース・コンポーネントの構造には柔軟性があるため、共有イメージ、リソース・バンドル、ユーティリティ・クラスなど、必要なものを追加できます。
Webコンポーネントでサードパーティ・コードを参照する必要がある場合は、参照コンポーネントを作成できます。参照コンポーネントにサードパーティ・ライブラリは含まれませんが、そのコードに対するポインタをNPMモジュールまたはCDN位置(あるいは両方)として定義できます。所定のコンポーネントのパッケージ化ディストリビューションに、サードパーティ・ライブラリのコードを埋め込むことは可能ですが、分離することによって主に2つのメリットが得られます。
-
依存関係が明確で、事前に宣言されます。サードパーティ・ライブラリおよびライセンスの使用に関心がある組織にとって、これは重要な考慮事項です。また、サードパーティ・コードのセキュリティの脆弱性への対処が非常に容易になります。
-
これらのライブラリ(特にmoment.jsなど共通ライブラリ)の再利用を最大限に活用できます。
パックに含めることができないコンポーネント・タイプは参照コンポーネントのみです。
JETパックを作成する際は、そのコンポーネントが、利用側アプリケーションとの関係において、時間経過とともにどのように変化するかを検討することが重要です。よくある間違いは、コンポーネントのバージョン番号と主要な利用側アプリケーションのバージョン番号を同期して開始することです。この関係は破綻する可能性があります。たとえば、いずれかのコンポーネントでの最新API変更によって、メジャー・バージョンが強制的に変更されると、同期しなくなります。ベスト・プラクティスは、最初からコンポーネントのセマンティック・バージョニング(SemVer)を使用し、利用側アプリケーションのバージョンと同期しないことです。SemVerの動作、特に再リリース・バージョンに関しては、理解できるまで時間をかけてください。詳細は、「バージョン採番の標準」を参照してください。
コンポーネント・セットのソース・コードは、それを使用するアプリケーションとは別に管理する必要があります。時間の経過に伴ってコンポーネントは利用側アプリケーションと違うペースで変化するため、ソース・コードを別のソース・コード・プロジェクトとリポジトリに分離することには大きな意味があることを忘れないでください。
コンポーネント・ソース・プロジェクトの推奨プロジェクト・レイアウトは、Oracle JET CLIツールによって作成されるデフォルト・プロジェクト・レイアウトに基づきます。JET CLIでは、TypeScriptコンポーネントおよび標準ES6ベース・コンポーネントの作成がサポートされます。JETツールによって生成されるプロジェクトのレイアウトに従うと、次のようなツールのメリットがあります。
-
コンポーネントとアップストリーム依存関係の正しいRequireJSパス・マッピングを自動作成(このコンポーネント・ソース・プロジェクトのコンテキストでテストするとき)
-
ojet serve
コマンドを使用する際のライブ編集をサポート(JSおよびTSコンポーネント) -
TypescriptベースのコンポーネントのES6への自動トランスパイル
-
ojet build
コマンドでデバッグ・コンポーネントと縮小コンポーネント両方を自動作成 -
JETパックのコンポーネント・バンドルを自動作成(バンドル化が指定されたとき)
-
Component Exchangeに直接公開する機能(
ojet publish
コンポーネント・コマンドを使用) -
コンポーネントを配布可能なzipファイルに直接パッケージ化する機能(
ojet package
コンポーネント・コマンドを使用)
Webコンポーネントについて
Oracle JET Webコンポーネントは、アプリケーションがRequireJSを使用してロードできるスタンドアロン・モジュールとしてパッケージ化されます。フレームワークは、Webコンポーネントの登録に使用できるAPIを提供します。Knockoutは、現在、一方向および双方向のデータ・バインディング、テンプレート・マークアップおよびWebコンポーネントのアクティブ化を提供しています。
Webコンポーネントを初めて利用する場合、さらに学習するには、Oracle Blogsページ(https://blogs.oracle.com/groundside/cca)にアクセスして、重要な概念について紹介する一連の記事を参照してください。
Webコンポーネント・アーキテクチャ
次の図に、JET Webコンポーネント・アーキテクチャの概要を示します。この例では、Oracle JETアプリケーションがWebコンポーネントを使用していますが、サポートされている他のJavaScriptまたはOracleアプリケーションにWebコンポーネントを追加できます。
Webコンポーネントに含まれるもの:
-
カスタムDOM要素: HTML要素として機能する、名前が付けられた要素。
<my-web-component attribute1="value1" attribute2="value2" ...> </my-web-component>
-
Webコンポーネント・バインディング定義: Webコンポーネントの属性を設定するためのKnockout式。
<my-web-component attribute1="value1" attribute2="[[value2]]" attribute3="{{value3}}"> </my-web-component>
attribute1
の値はプリミティブJavaScript型(boolean、number、string)またはJSONオブジェクトのどちらかであり、attribute2
の値は一方向データ・バインディングを使用し、attribute3
の値は双方向バインディングを使用します。Webコンポーネントでの一方向バインディングは、値が変更された場合に式がアプリケーションのViewModelを更新しないように指定します。双方向バインディングでは、式はアプリケーションのViewModelを更新し、値がViewModelに書き戻されます。次のコード・サンプルでは、Webコンポーネントは、
type
、data
およびaxis-labels
という3つの属性を使用して宣言されています。<my-chart type=bubble data="[[salesData]]" axis-labels={{showAxisLabels}} ... </my-chart>
salesData
式は一方向バインディング([[salesData]]
)を使用して宣言されているため、WebコンポーネントのViewModelによってdata
プロパティが更新された場合に書き戻されません。data
プロパティには現在の値が含まれますが、salesData
式は更新されません。あるいは、axisLabels
プロパティがViewModelによって更新された場合、axisLabel
プロパティと{{showAxisLabels}}
式の両方に更新された値が含まれます。 -
メタデータ: Webコンポーネントの必須プロパティ(
name
、version
およびjetVersion
)を定義するオプションのJSON形式で提供されるデータ。メタデータでは、description
、displayName
、dependencies
、icon
、methods
、events
およびslots
など、オプションのプロパティも定義できます。Webコンポーネントは、ランタイム・メタデータとデザインタイム・メタデータの両方をサポートしています。デザインタイム・メタデータは実行時には必要なく、デザインタイム・ツールやプロパティ・エディタで役立ちます。デザインタイム・ツールでは、Webコンポーネントのメタデータに対してツール固有のメタデータ拡張機能を定義できます。ツール固有のメタデータ拡張機能については、その固有のツールのドキュメントを参照してください。メタデータ・プロパティの詳細は、APIドキュメントの Compositeに関する項を参照してください。
次のサンプルは、いくつかの使用可能なメタデータ・フィールドと、その内容および実行時に使用されていないかどうかに関する説明を示しています。必須のメタデータは太字で強調表示されています。
{ "name": "The component tag name", "version": "The component version. Note that changes to the metadata even for minor updates like updating the jetVersion should result in at least a minor Web Component version change, e.g. 1.0.0 -> 1.0.1.", "jetVersion": "The semantic version of the supported JET version(s). Web Component authors should not specify a semantic version range that includes unreleased JET major versions as major releases may contain non backwards compatible changes. Authors should instead recertify Web Components with each major release and update the component metadata or release a new version that is compatible with the new release changes.", "description": "A high-level description for the component. Not used at run time.", "displayName": "A user friendly, translatable name of the component. Not used at run time.", "properties": { "property1": { "description": "A description for the property. Not used at run time.", "displayName": "A user friendly, translatable name of the property. Not used at run time.", "readOnly": "Boolean that determines whether a property can be updated outside of the ViewModel. False by default.", "type": "The type of the property, following Google's Closure Compiler syntax.", "value": "Object containing an optional default value for a property.", "writeback": "Boolean that determines whether an expression bound to this property should be written back to. False by default.", "enumValues": "An optional array of valid enum values for a string property. An error is thrown if a property value does not match one of the provided enumValues.", "properties": "A nested properties object for complex properties. Subproperties exposed using nested properties objects in the metadata can be set using dot notation in the attribute. See the Subproperties section for more details on working with subproperties." }, "property2": { ... contents omitted } }, "methods": { "method1": { "description": "A description for the method. Not used at run time.", "displayName": "A user friendly, translatable name of the method. Not used at run time.", "internalName": "An optional ViewModel method name that is different from, but maps to this method.", "params": "An array of objects describing the method parameter . Not used at run time.", "return": "The return type of the method, following Closure Compiler syntax. Not used at run time." }, "method2": { ... contents omitted } }, "events": { "event1": { "bubbles": "Boolean that indicates whether the event bubbles up through the DOM or not. Defaults to false. Not used at run time.", "cancelable": "Boolean that Indicates whether the event is cancelable or not. Defaults to false. Not used at run time.", "description": "A description for the event. Not used at run time.", "displayName": "A user friendly, translatable name of the method. Not used at run time.", "detail": { "field name": "Describes the properties available on the event's detail property which contains data passed when initializing the event. Not used at run time." } }, "event2": { ... contents omitted } }, "slots": { "slot1": { "description": "A description for the slot. Not used at run time.", "displayName": "A user friendly, translatable name of the method. Not used at run time." } } }
-
HTMLマークアップ: (必須) Webコンポーネントのレンダリング方法について説明するView定義が含まれます。WebコンポーネントのViewは、WebコンポーネントのViewModelで定義されたpublic変数とともに、いくつかの
$
変数にアクセスします。次に、WebコンポーネントのViewで使用できる変数の一部を示します。変数 説明 $properties
Webコンポーネントの現在のプロパティ値のマップ $slotCounts
スロットに割り当てられた関連付けられた子ノードの数を含むスロット名のマップ $unique
一意のID生成に使用できる各コンポーネント・インスタンスに指定される一意の文字列値 $uniqueId
WebコンポーネントのID (指定された場合)。指定されない場合はuniqueと同じ $props
5.0.0以降では非推奨のため、かわりに $properties
を使用$slotNodeCounts
5.0.0以降では非推奨のため、かわりに $slotCounts
を使用 -
JavaScript: ViewModelおよびカスタム・イベントを定義するためのオプションのスクリプト。
ViewModelでは、Webコンポーネントのライフサイクルの様々なステージのコールバックも定義します。Webコンポーネントは、オプションで次のライフサイクル・メソッドをサポートしています:
activated (context)
、connected (context)
、bindingsApplied (context)
、propertyChanged (context)
およびdisconnected (element)
。ライフサイクル・メソッドの詳細は、Composite - Lifecycleに関する項を参照してください。 -
CSS: Webコンポーネントのオプションのスタイル設定。
CSSはWebコンポーネントをスコープとしていないため、適切にスタイルを定義する必要があります。
-
SCSS: Sass変数を含んだオプションのファイルで、WebコンポーネントのCSSを生成します。
コンポーネントに対して2、3のスタイルしか定義しないとき、手動でCSSを追加することで十分な場合があります。ただし、Sass変数を使用してCSSを生成したいユースケースもあります。それらの場合、SCSSファイルを作成し、Webコンポーネントのフォルダ内に置き、ツールを使用してアプリケーションにnode-sassを追加します。ステップ8「Webコンポーネントの作成」を参照してください。
重要:
Sassファイルは手動でWebコンポーネントのフォルダに追加する必要があります。ツールでは存在するすべてのSassファイルがコンパイルされますが、自動的には作成されません。
Webコンポーネント・ファイル
Webコンポーネントには、アプリケーション要件に応じて変更可能なCSS、HTML、JavaScriptおよびメタデータ・ファイルを含めることができます。
フォルダを作成し、必要なファイルをフォルダ内に追加することによって、Webコンポーネントを手動で作成できます。アプリケーションに必要なファイルを含むWebコンポーネント・フォルダを自動的に生成するOracle JET CLIコマンドojet create component <component-name>
を使用して、Webコンポーネントを作成することもできます。
Webコンポーネントを手動で作成する場合は、Webコンポーネント・タグと同じ名前のWebコンポーネント・ファイルをフォルダに配置します。通常、フォルダはアプリケーション内のjet-composites
フォルダ(app-path/jet-composites/my-web-component/
)に配置します。
Webコンポーネントを別のファイル・ロケーションに置くことや、RequireJSパス・マッピングを使用して別のサーバー上のWebコンポーネントを参照することもできます。例として、Composite - パッケージ化と登録に関する項を参照してください。
-
my-web-component—view.html
: ビュー・テンプレート -
my-web-component—viewModel.js
: ViewModel -
component.json
: メタデータ -
my-web-component-styles.css
: CSSスタイル設定 -
my-web-component-styles.scss
: Webコンポーネント用のCSSを生成するためのSass変数 -
loader.js
: メタデータ、View、ViewModelおよびCSSの依存性を定義するRequireJSモジュール。このファイルにはWebコンポーネントの登録も含める必要があります。
Webコンポーネントのスロッティング
スロットは、ユーザーがマークアップで入力できるWebコンポーネントのプレースホルダとして使用されます。スロットは、WebコンポーネントのコンポーネントJSONファイルで定義されます。
スロッティングを使用して、WebコンポーネントのViewマークアップ内の指定した場所に挿入する子コンポーネント(これもWebコンポーネントになる可能性があります)を追加します。次の例には、demo-columnsという名前のWebコンポーネントのViewマークアップの一部が含まれています。
<div class="oj-flex oj-flex-item-pad">
<div role="group" :aria-label="[[$properties.headers[0]]]"
class="oj-flex-item demo-columns-col-a oj-flex oj-sm-flex-direction-column oj-sm-align-items-center">
<h3>
<oj-bind-text value="[[$properties.headers[0]]]"></oj-bind-text>
</h3>
<oj-bind-slot name="columnA">
</oj-bind-slot>
</div>
... content omitted
</div>
この例では、demo-columns Webコンポーネントは、columnA
という名前でoj-bind-slot
を定義しています。次に示すように、demo-columns Webコンポーネントをページに追加するとき、開発者はcolumnA
という名前のスロットを使用して子コンポーネントを指定できます。
<demo-columns id="composite-container" headers='["Sales", "Human Resources", "Support"]'>
<!-- ko foreach: sales -->
<demo-card slot="columnA" name="[[name]]" work-title="[[title]]"></demo-card>
<!-- /ko -->
... contents omitted
</demo-columns>
Webコンポーネントのテンプレート・スロット
コンポーネントのマークアップ内でtemplate要素が使用されている場合、テンプレート・スロットを使用してテンプレート内にプレースホルダを定義し、そこに必要なマークアップ・フラグメントを挿入できます。
スタンプ済のテンプレートを異なるデータで再利用する必要がある場合は、テンプレート・スロットを使用してコンポーネントのバインディング・コンテキストから追加データを表示できます。
コンポーネントのマークアップ内でtemplate要素が使用されている場合、テンプレート・スロットを使用してテンプレート内にプレースホルダを定義し、そこに必要なマークアップ・フラグメントを挿入できます。スタンプ済のテンプレートを異なるデータで再利用する必要がある場合は、テンプレート・スロットを使用してコンポーネントのバインディング・コンテキストから追加データを表示できます。
Webコンポーネントのテンプレート・スロットは、アプリケーション内で挿入されるコンテンツ用に追加のバインディング・コンテキストを定義する場合に使用されます。テンプレート・スロットを宣言的に定義する場合は、WebコンポーネントのViewマークアップ内で、スタンプ済のテンプレートDOMが含まれるスロットにoj-bind-template-slot
要素を使用します。oj-bind-template-slot
要素はoj-bind-slot
要素と似ていますが、挿入されるコンテンツはアプリケーションDOM内でtemplate
要素の内部にラップされる必要があります。
次の例では、demo-list Webコンポーネントでitem
という名前のoj-bind-template-slot
を定義します。このテンプレート・スロットは、追加プロパティをテンプレートDOMに表示するdata
属性と、$current
変数の別名として使用されるdata-oj-as
属性を備えています。template
要素のdata-oj-as
属性は、デフォルト・テンプレートの内部でのみ参照可能です。
<table>
<thead>
<tr>
<th>
<oj-bind-text value="[[$properties.header]]"></oj-bind-text>
</th>
</tr>
</thead>
<tbody>
<oj-bind-for-each data="{{$properties.data}}">
<template>
<tr>
<td>
<!-- Template slot for list items with default template and an optional alias -->
<oj-bind-template-slot name="item" data="{{'value': $current.data}}">
<!-- Default template -->
<template data-oj-as="listItem">
<span>
<oj-bind-text value='[[listItem.value]]'</oj-bind-text>
</span>
</template>
</oj-bind-template-slot>
</td>
</tr>
</template>
</oj-bind-for-each>
</tbody>
... contents omitted
</table>
oj-bind-template-slot
の子は、WebコンポーネントのViewバインディングの適用時に解決され、その後で、Webコンポーネント提供の追加プロパティで拡張されたアプリケーションのバインディング・コンテキストで解決されます。これらの追加プロパティは、アプリケーション指定のテンプレート・スロット内で$current
変数に対して使用できます。アプリケーションは、テンプレート内で、$current
変数のかわりにオプションのdata-oj-as
属性を別名として使用できます。次の例には、demo-listという名前のアプリケーションのマークアップの一部が含まれています。
<demo-list data="{{groceryList}}" header="Groceries">
<template slot="item" data-oj-as="groceryItem">
<oj-checkboxset>
<oj-option value="bought"><oj-bind-text value='[[groceryItem.value]]'></oj-bind-text></oj-option>
</oj-checkboxset>
</template>
... contents omitted
</demo-list>
Oracle JETクックブックのWebコンポーネントのテンプレート・スロットに関する項には、テンプレート・スロットを使用するための完全な例があります。oj-bind-template-slot APIドキュメントでは、属性およびテンプレート・スロットのその他のプロパティについて説明しています。
Webコンポーネント・イベント
Oracle JET Webコンポーネントは、コンポーネント・メタデータに定義されているプロパティにマップされた自動プロパティ変更イベントを起動できます。これらのコンポーネントは、コンポーネント・メタデータで宣言されているイベントに対してもカスタム・イベントを起動します。
Webコンポーネントは、propertyChanged
ライフサイクル・メソッドを使用して、コンポーネント・メタデータのプロパティにマップされている自動生成されたpropertyChanged
イベントを内部的にリスニングできます。たとえば、propertyChanged
イベントは、プロパティの更新時に起動されます。このpropertyChanged
イベントには、次のプロパティが含まれます。
-
property
: 変更されたプロパティの名前。 -
value
: プロパティの現在の値。 -
previousValue
: 変更されたプロパティの前の値。 -
updatedFrom
: プロパティの更新元となった場所。 -
Subproperty
: 変更されたサブプロパティに関する情報を保持するオブジェクト。
Webコンポーネントに対してカスタム・イベントを宣言的に定義する必要がある場合は、コンポーネントのメタデータ・ファイルでそのイベントを宣言する必要があります。これらのイベントは、WebコンポーネントのコードがdispatchEvent()
メソッドをコールした場合にのみ起動されます。アプリケーションは、イベント・リスナー属性とプロパティ・セッターを宣言することで、これらのイベントをリスニングできます。これらのイベント・リスナーは、宣言的またはプログラム的に追加できます。
イベント・リスナーの宣言的仕様については、属性にon-[event-name]
構文を使用します。たとえば、on-click
やon-value-changed
などです。
<oj-element-name value="{{currentValue}}" on-value-changed="{{valueChangedListener}}"></oj-element-name>
イベント・リスナーのプログラム仕様では、DOM addEventListener
メカニズムを使用するか、カスタム要素プロパティを使用できます。
DOM addEventListener
メカニズムでは、elementName.addEventListener
メソッドを使用します。たとえば:
elementName.addEventListener("valueChanged", function(event) {...});
カスタム要素プロパティでは、プロパティ・セッターに対してelementName.onEventName
構文を使用します。たとえば:
elementName.onValueChanged = function(event) {...};
詳細は、Webコンポーネントのイベントとリスナーに関する項のAPIドキュメントを参照してください。
Webコンポーネントの例
Webコンポーネントには、スロット、データ・バインディング、テンプレート・スロット、ネストされたWebコンポーネントおよびイベントを含めることができます。これらのWebコンポーネントの機能については、Oracle JETクックブックに提供されている例を使用できます。
Oracle JETクックブックには、基本的および高度なWebコンポーネントを作成するための完全な例があります。また、スロッティングおよびデータ・バインディングを使用した例もあります。詳細は、「Webコンポーネント - 基本」を参照してください。
Webコンポーネントのフィールドおよびメソッドの詳細は、APIドキュメントの Compositeに関する項を参照してください。
Webコンポーネント作成のベスト・プラクティス
Oracle JET Webコンポーネントを作成するためのベスト・プラクティスには、必須および推奨のパターン、構成、コーディング事例、バージョン採番およびスタイリング標準が含まれています。ベスト・プラクティスを実践することにより、他のコンポーネントおよびコンシューマ・フレームワークとの相互運用性を確保します。
推奨される標準パターンとコーディング・プラクティス
Oracle JET Webコンポーネント用の推奨パターンおよびコーディング事例には、構成、バージョニング、コーディング、およびアーカイブのための標準が含まれています。
コンポーネントのバージョニング
Webコンポーネントには、セマンティック・バージョン形式でバージョン番号を割り当てる必要があります。
コンポーネントに関連付けられたバージョン番号の割当てや増分を行うときは、必ずセマンティック・バージョンのルールに従って適切にメジャー、マイナーおよびパッチ・バージョン番号を更新してください。こうすることで、コンポーネントのコンシューマがコンポーネントの異なるバージョン間の移行に伴う互換性とコストを明確に理解できるようになります。
Webコンポーネントにバージョン番号を割り当てるには、セマンティック・バージョニングについてを参照してください。
JETバージョンの互換性
サポートされているJETバージョンのjetVersion
を指定するには、セマンティック・バージョンのルールを使用する必要があります。メジャー・リリースには下位互換性のない変更が含まれている可能性があるため、Webコンポーネントの作成者は未リリースのJETメジャー・バージョンを含むセマンティック・バージョン範囲を指定しないでください。かわりに、作成者はメジャー・リリースごとにWebコンポーネントを再認定して、コンポーネントのメタデータを更新するか、または新しいリリースの変更と互換性がある新しいバージョンをリリースするようにしてください。
翻訳可能なリソース
Webコンポーネントの翻訳可能なリソースをローカライズする開発者は、Webコンポーネントの作成時にリソース・バンドル(テンプレート)を取得できるようになりました。これらのコンポーネントでは、ojL10n requireJS
プラグインを使用して標準のOracle JETメカニズムを使用する必要があります。翻訳バンドルは、Webコンポーネントのフォルダのリソース文字列を含むwebcomponentname/resources/nls/root
サブディレクトリのピアであるwebcomponentname/resources/nls
サブディレクトリに格納する必要があります。Webコンポーネントのメタデータでサポートする言語とロケールを宣言できます。
ピア・ツー・ピア通信
コンポーネントで複雑な統合を処理する場合は、どんな種類のシークレット伝達メカニズムよりも、コンシューマが提供する共有のobservableを優先する必要があります。たとえば、フィルタ・コンポーネントやデータ表示コンポーネントなどです。共有のobservableを使用することで、コンポーネントを事前にシードし、プログラムでフィルタを介してコンポーネントと対話できます。
または、使用されている次のいずれかのアプローチに基づいてイベントとパブリック・メソッドを使用できます。
-
イベントのソースと受信側の階層関係
-
受信側に渡されるソースのアイデンティティ
一部のランタイム・プラットフォームでは、ワイヤリングを行う開発者がコンポーネントのIDにアクセスできず、関連するアイデンティティを渡せない場合があることに注意してください。
-
コンポーネントがドキュメント・レベルでアタッチしたリスナー
この場合は、これらのリスナーのクリーン・アップや重複の管理などを行う責任があります。また、このようなリスナーは、中間ノードによってオーバーライドされる可能性があるクリックなどの一般的なイベントではなく、Webコンポーネント・イベントに基づいて定義することをお薦めします。
ノート:
Webコンポーネントの標準(Shadow DOM)では、イベントがコンポーネントとコンシューマのビュー間の境界を越えるときに、イベントのターゲットが再設定されます。つまり、発生元の要素の見かけ上のアイデンティティが変更される可能性があります。特に、ネストされているWebコンポーネント・アーキテクチャでは、内側のWebコンポーネントではなく外側のWebコンポーネントを表す要素でイベントがタグ付けされます。したがって、ドキュメント・レベルでリスニングする場合は、event.target
属性を使用してWebコンポーネント・ソースのアイデンティティを識別しないでください。かわりに、event.deepPath
属性を使用してイベントの実際のオリジンを確認できます。
外部データへのアクセス
Webコンポーネントでは、Knockoutバインディング階層を使用してWebコンポーネントのコンテキストの外部($root
や$parent[1]
など)からデータを取得できません。コンポーネントに出入りするすべてのデータ転送は、正式なプロパティ、メソッドおよびイベントを使用して行う必要があります。
オブジェクト・スコープ
Webコンポーネントのすべてのプロパティおよび関数は、ビュー・モデルのスコープに限定する必要があります。ウィンドウ・スコープ・オブジェクトやグローバル・スコープ・オブジェクトは作成しないでください。同様に、Webコンポーネントの作成者はウィンドウ・スコープ・オブジェクトの存在を前提としないでください。ウィンドウ・レベルまたはグローバル・レベルで外部定義されたコンシューマWebコンポーネントが読取りや書込みのために必要な場合は、コンシューマのビュー・モデルが正式なプロパティを使用してそのコンポーネントを渡す必要があります。コンポーネントの外部で既知のグローバル参照が必要な場合でも、必須のdefine()
関数を使用して正式に参照を挿入し、Webコンポーネントのメタデータで参照を依存性として宣言する必要があります。
外部参照
Webコンポーネントから外部コンポーネントを参照する必要がある場合は、それをコンポーネントの正式なAPIの一部にする必要があります。この正式なAPIは、プロパティを介してコンポーネント参照を渡します。たとえば、Webコンポーネント・コードでリスナーを登録できるようにするには、外部で定義されたコンポーネント参照が必要です。Webコンポーネントでハードコードされた値、グローバル・ストレージ、またはDOMの検索結果からIDを取得しないでください。
サブコンポーネントID
フレームワーク内に特定のIDを必要とするコンポーネントがある場合は、context.unique
またはcontext.uniqueId
の値を使用してIDを生成します。このIDは、ページのコンテキスト内で一意です。
IDの格納
生成されたIDを呼出しにまたがってローカル・ストレージやCookieなどに格納しないでください。特定のWebコンポーネントのcontext.unique
の値は、特定のビューが実行されるたびに変更される可能性があります。
ローカル・ストレージ
アプリケーション内でWebコンポーネントの一意のインスタンスを一貫して識別するのは困難です。そのため、Webコンポーネントがブラウザのローカル・ストレージを使用して、そのWebコンポーネントのインスタンスに特有の情報を保持しないようにすることをお薦めします。ただし、アプリケーションがコンポーネントのパブリック・プロパティを介して一意のキーを提供する場合は、コンポーネントの一意のインスタンスを識別できます。
また、ローカル・ストレージをコンポジット間のシークレット伝達メカニズムとして使用しないでください。この機能の可用性を保証できないため、コンポーネントのパブリックAPIの一部である共有のJavaScriptオブジェクトまたはイベントを介して情報を交換することをお薦めします。
文字列のオーバーライド
多くの場合、WebコンポーネントはUIやメッセージに対するデフォルトのニーズに対応するため、内部で文字列リソースを取得します。しかし、場合によっては、コンシューマがこれらの文字列をオーバーライドできるようにする必要があります。そのためには、コンポーネントでこの目的に合うプロパティを公開します。慣例により、このようなプロパティはtranslations
と呼ばれ、その内部に、コンポーネントの必須プロパティに関連する個々の翻訳可能文字列(requiredHint
やrequiredMessageSummary
など)に対応するサブプロパティを含めることができます。これらのプロパティは、コンポーネント・タグでサブプロパティ参照を使用して設定できます。たとえば:
"properties" : {
"translations": {
"description": "Property to allow override of default messages",
"writeback" : false,
"properties" : {
"requiredHint": {
"description": "Change the text of the required hint",
"type": "string"
},
"requiredMessageSummary": {
"description": "...",
"type": "string"
},
"requiredMessageDetail": {
"description": "...",
"type": "string"
}
}
}
}
}
ロギング
console.log()
に優先してコードからログ・メッセージを書き込むには、Logger
を使用します。Webコンポーネントでは、利用側アプリケーションのロギング・レベルを尊重し、変更しないでください。コンポーネントから発行されたすべてのログ・メッセージの先頭にソースWebコンポーネントのIDを付けるのが理想的です。プリファレンスとして、Webコンポーネント名を使用できます。利用側アプリケーションで定義されたライターをコンポーネントでオーバーライドしないでください。
高コストの初期化
Webコンポーネントでは、コンストラクタ関数の内部で実行する処理を最小限に抑える必要があります。コストの高い初期化は、activated
以降のライフサイクル・メソッドまで延期してください。コンポーネントが実際には表示可能なDOMに追加されていない場合でも、Webコンポーネントのコンストラクタは呼び出されます。たとえば、Knockoutのif
ブロック内でコンストラクタが呼び出された場合などです。以降のライフサイクル・フェーズは、コンポーネントが実際に必要になった場合にのみ発生します。
サービス・クラス
グローバル・サービス・クラスの使用、つまり複数のWebコンポーネントで共有される機能により、Webコンポーネントのコンシューマが知る必要がある非表示の規約を構成することができます。これを回避するため、次のようにすることをお薦めします。
-
すべてのWebコンポーネントが明示的に
require()
ブロックとして設定できるモジュールとしてサービスを作成します。これにより、コンシューマは他の場所でこのサービスを実行する必要がなくなります。 -
サービス・クラスの初期化(リモート・サービスからのデータのフェッチなど)に時間がかかる場合に発生するタイミングの問題を考慮してください。このような場合は、サービス・オブジェクトにPromiseを返して、情報が実際に利用可能になる前にコンポーネントが情報の使用を安全に回避できるようにする必要があります。
ojModuleの使用
WebコンポーネントでojModule
を使用し、アプリケーションの外部にWebコンポーネントを配布する場合は、Webコンポーネントの場所を基準にした相対的な場所から使用するojModule
をロードするための追加ステップを実行する必要があります。ViewおよびViewModelインスタンスをojModule
に直接渡さない場合は、必須関数インスタンスとビューおよびビュー・モデルの相対パスを提供する必要があります。必須関数インスタンスは、Webコンポーネント・ローダー・モジュールで依存性としてrequire
を指定することで取得する必要があります。
<div data-bind="ojModule: {require: {instance: require_instance, viewPath: "path_to_Web_Component_Views", modelPath: "path_to_cWeb_Component_ViewModels"}}"></div>
requireオプション | タイプ | 説明 |
---|---|---|
|
関数 |
必須インスタンスを定義する関数 |
|
文字列 |
WebコンポーネントのViewへのパスを含む文字列 |
|
文字列 |
WebコンポーネントのViewModelへのパスを含む文字列 |
ojModule
の使用の詳細は、 ojModuleを参照してください。
配布用のWebコンポーネントのアーカイブ
パッケージ化のためにzipファイルを作成する場合は、コンポーネント自体と同じ名前でアーカイブを作成します。操作上の理由でzipファイル名にバージョンを識別するための接尾辞を追加することもできます。Webコンポーネントのアーティファクトは、zipファイルのルートに配置する必要があります。ファイルに到達するまでの中間にディレクトリ構造を作成しないでください。
ライフサイクル・メソッドの使用
WebコンポーネントにViewModelが指定されている場合は、Webコンポーネントのライフサイクルの各ステージでコールされる次のコールバック・メソッドを、そのViewModelにオプションで定義できます。使用可能なコールバック・メソッドの一部を次に示します。
-
activated(context)
: ViewModelが初期化された後に呼び出されます。 -
connected(context)
: ViewがDOMに最初に挿入された後に呼び出され、以降はWebコンポーネントが切断された後でDOMに再接続されるたびに呼び出されます。 -
bindingsApplied(context)
: バインディングがViewに適用された後に呼び出されます。 -
propertyChanged(context)
: プロパティの更新時、[property]Changed
イベントが発生する前に呼び出されます。 -
disconnected(element)
: このWebコンポーネントがDOMから切断されるときに呼び出されます。
Webコンポーネントのライフサイクル・メソッドの詳細は、Composite - Lifecycleに関する項を参照してください。
テンプレートの別名
インライン・テンプレートをサポートするJETコンポーネントでは、オプションのdata-oj-as
属性を使用して、$current
変数にテンプレート固有の別名をアプリケーション・レベルで指定できるようになりました。チャート・コンポーネントや表コンポーネントなど、コンポーネントで複数のテンプレート・スロットをサポートする必要があるインスタンスでは、1つの別名では不十分な場合があります。このような場合は、template要素でオプションのdata-oj-as
属性を使用できます。テンプレート・スロットでこのオプション属性を使用する方法の詳細は、oj-bind-template-slot APIドキュメントを参照してください。
CSSおよびテーマ適用の標準
Oracle JET Webコンポーネントは、他のWebコンポーネントおよび利用側アプリケーションとの相互運用性を確保するため、推奨されるスタイリング標準のすべてに準拠する必要があります。
CSSおよびテーマを使用する際の一般的なベスト・プラクティスの詳細は、「CSSおよびテーマを使用するためのベスト・プラクティス」を参照してください。
標準 | 詳細 | 例 |
---|---|---|
スタイルが設定されていないコンテンツのフラッシュを防止する |
Oracle JETは、メタデータ・プロパティが解決された後、 これは要素セレクタであり、 |
|
スコープ指定の追加 |
要素セレクタを使用して、あなたのコンポーネントの外部でクラスの1つが誰かに使用され、あなたが行った内部の実装に依存するようになる可能性を最小限に抑えます。右側の例で、 |
重要: コンポーネントにダイアログも含まれている場合、表示時にそのダイアログはメイン・ドキュメントのDOMツリーにアタッチされ、Webコンポーネントの子にはなりません。したがって、コンポーネントで定義されたダイアログに適用するスタイルを定義する場合、コンポーネントはダイアログ表示時の実際のコンテナではないため、コンポーネント名に対してスコープ指定できません。 これを解決するには、かわりにコンポーネント名を接頭辞として使用します。
|
要素のスタイリングの回避 |
アプリケーションは、ヘッダーやリンクなどのHTMLタグ要素をスタイリングすることがよくあります。アプリケーションとの調和のため、Webコンポーネントでこれらの要素をスタイリングしないようにします。 |
|
バージョン採番の標準
すべてのタイプのWebコンポーネント(スタンドアロン・コンポーネント、JETパック、リソース・コンポーネントなど)にはバージョン番号が必要であり、この番号はセマンティック・バージョニング(SemVer)スキームに準拠する必要があります。そうすることで、開発チームの標準がOracle JETリリース・バージョン管理で採用されたアプローチに従うことになります。
参照コンポーネントは少し特別なケースです。参照コンポーネントのバージョンは、それが参照しているNPMライブラリのバージョンと必ず一致するためです。
他のすべてのWebコンポーネント・タイプは、セマンティック・バージョニングを利用してコンポーネントのバージョンを指定します。セマンティック・バージョニングで定義されるバージョン番号には、3つの主要セグメントとオプションの4つ目のセグメントが含まれます。最初の3つのセグメントはMAJOR.MINOR.PATCHと定義され、意味は次のとおりです。
-
MAJORバージョン: 互換性のないAPI変更を行うとき
-
MINORバージョン: 下位互換性を維持して機能を追加するとき
-
PATCHバージョン: 下位互換性があるバグ修正を行うとき
ノート:
セマンティック・バージョニングの背景情報は、https://semver.orgを参照してください。
Webコンポーネントのバージョン番号を定義するときは、これら3つの主要セグメントをすべて定義する必要があります。
1.0.0
さらに、PATCHバージョンの後に、2種類の追加情報を含むオプションの拡張セグメントを付けることができます。
-
ハイフンの後のセグメント(プレリリース・バージョンを割り当てることができる)
-
プラス記号(+)の後のセグメント(純粋に情報のみ、GITコミット・ハッシュや他の制御情報を含めることができる)。このセグメントは、コンポーネント・バージョンの比較には使用されません。
次に示すのは、コンポーネントのプレリリース・バージョンのすべてが定義されたバージョン番号の例です。
1.0.1-beta.1+332
このケースでは、beta.1
がプレリリース・インジケータ、332
がビルド番号です。
Webコンポーネントのバージョン番号の変更により、新しいバージョンを使用するリスク・レベルをコンシューマに示す必要があります。コンシューマは、コードを修正せずにコンポーネントの新しいMINORリリースまたはPATCHリリースを組み込むことができるかどうかを認識する必要があります。Webコンポーネントのソース・コードを変更することで、WebコンポーネントのディレクトリのリフレッシュまたはCDN参照の変更以外の処理を利用側アプリケーションが強制される場合は、MAJORバージョンを改訂してそのことを示す必要があります。
Webコンポーネント・メタデータ・ファイルcomponent.json
を使用して、コンポーネントが使用できるOracle JETのサポートされるバージョンを定義できます。これがjetVersion
属性であり、npm-semverで定義される特定のバージョンまたはバージョン範囲を設定できます。たとえば、jetVersion
属性に次のいずれかを設定できます。
-
推奨: MAJORリリース番号の変更が行われるまでのすべてのMINORバージョンとPATCHバージョン。たとえば、
"jetVersion:: "^9.1.0"
です。そのリリースと、次のMAJORリリースまでの(このMAJORリリースは含まれない)それ以降すべてのMINORバージョンとPATCHバージョンがサポートされることを示します。これは、">=9.1.0 <10.0.0"
と同じです。 -
WebコンポーネントがサポートするOracle JETの正確なバージョンの正確なセマンティック・バージョン。たとえば、
"jetVersion" : "9.1.0"
です。このWebコンポーネントではOracle JET 9.1.0のみがサポートされることを意味します。 -
Oracle JETの特定のMAJOR.MINORリリース内のすべてのPATCHバージョン。たとえば、
"jetVersion" : "9.0.x"
です。このWebコンポーネントではJET 9.0.0からJET 9.1.0の前まで(JET 9.1.0そのものは含まれない)のJETのすべてのリリースがサポートされることを意味します。 -
Oracle JETバージョンの特定の範囲。たとえば、
"jetVersion" : "9.0.0 -9.1.0"
です。このWebコンポーネントではJET 9.0.0からJET 9.1.0までのJETのすべてのリリースがサポートされることを意味します(つまりJET 9.2.0やJET 8.0.0などは含まれません)。
ヒント:
Oracle JETの推奨形式は、"^9.1.0"
のように定義される最初のケースです。JETそのものがセマンティック・バージョニング・ルールに従っているため、MINORバージョンまたはPATCHバージョンの変更により、Webコンポーネントのソース・コードが影響を受けることはありません。つまり、Oracle JETのMINORリリースごとに、すべてのWebコンポーネントの更新をリリースする必要がないことを意味します(新機能を使用することを選択しない場合)。
ノート:
npm-semverの背景情報は、このWebサイト(https://docs.npmjs.com/about-semantic-versioning)にあるnpmのドキュメントを参照してください。
JETパックの場合は、パックに含まれるcomponent.json
ファイルのdependencies
属性に注意する必要があります。パックにバンドルされている様々なコンポーネントは一緒に使用されるようにしてください。そのように指定するために、バージョン範囲ではなく特定のバージョンとの依存関係を定義する必要があります。たとえば、このケースでは、バージョン1.0.2
のdemo-memory-gameコンポーネントがホストするのはバージョン1.0.2
のdemo-memory-cardのみです。
{
"name": "demo-memory-game",
"version": "1.0.2",
"type": "pack",
"displayName": "JET Memory Game",
"description": "A memory game element with a configurable card set and attempt counter.",
"dependencies": {
"demo-memory-card": "1.0.2"
}
}
Webコンポーネントの作成
Oracle JETでは、カスタムWebコンポーネントの様々なコンポーネント・タイプがサポートされます。スタンドアロンWebコンポーネントを作成できます。または、一緒に使用するためのWebコンポーネントのセットを作成できます。その後、それらをJETパックすなわちパック・コンポーネント・タイプとしてアセンブルできます。リソース・コンポーネントを作成してJETパックを拡張できるのは、厳密にUIコンポーネントではないアセットの再利用可能なライブラリがあるときです。また、スタンドアロン・コンポーネントでサードパーティ・コードを参照する必要がある場合は、参照コンポーネントを作成して、そのコードへのポインタを定義できます。
スタンドアロンWebコンポーネントの作成
Oracle JETコマンドライン・インタフェース(CLI)を使用して、JavaScriptまたはTypeScriptとして実装されるOracle JET Webコンポーネント・テンプレートを作成し、コンテンツを移入できます。ツールを使用しない場合、WebコンポーネントのファイルとフォルダをOracle JETアプリケーションに手動で追加できます。
次の図は、demo-card
という名前の単純なWebコンポーネントを示しています。このコンポーネントは、連絡先の名前と画像(もしあれば)を備えた連絡先カードを表示します。ユーザーがカードを選択すると、コンテンツが裏返り、連絡先に関するその他の詳細が表示されます。
次の手順は、このdemo-card
コンポーネントを例として使用した、Webコンポーネントを作成するための大まかなステップのリストです。簡潔さを優先してコードの一部を省略していますが、Webコンポーネントの基礎に関する項で完全な例を参照できます。デモ・ファイルは、クックブックのダウンロード・ボタン()をクリックすればダウンロードできます。
始める前に:
- Oracle JET CLIをインストールするステップについては、「Oracle JETツールのインストール」を参照してください
- Oracle JET CLIを使用してOracle JETアプリケーションにWebコンポーネントを追加するステップについてよく理解します。「Webアプリケーション・ワークフローの理解」を参照してください。
- 使用できないWebコンポーネントの予約名のリストについては、「valid custom element name」を参照してください
-
既存のWebコンポーネントのプロパティ、イベントおよびメソッドのリストについては、「HTMLElement properties, event listeners, and methods」を参照してください
-
グローバル属性およびイベントのリストについては、「Global attributes」を参照してください
Webコンポーネントを作成するには:
markdownについては、GitHubのドキュメントを参照してください。
demo-card WebコンポーネントCSSスタイルの完全なコードは、Webコンポーネントの基礎に関する項のクックブック・サンプルにあるdemo-card-styles.css
を参照してください。
メソッドとイベントを定義するWebコンポーネント・メタデータの追加の詳細は、Webコンポーネントのイベントに関する項のクックブック・サンプルを参照してください。
JETパックの作成
コンシューマが選んだコンポーネントが1つ以上のコンポーネントに関連する可能性がある場合、JETパックを作成するとプロジェクト管理が単純化されます。個々のJETパックで、特定のバージョンの参照コンポーネントが必要になることがあります。
基本的に、JETパックは関連するWebコンポーネントのライブラリです。それらのアセットが直接含まれるわけではなく、コンポーネントの特定バージョン・ストライプの索引として存在します。
ノート:
関連するコンポーネントの参照メカニズムとしてのパックには例外が1つあります。パックには、1つ以上のRequireJSバンドル・ファイルを含めることができます。これは、最適化された形式のコンポーネント・セットを、少数の物理的ダウンロードにパッケージ化したものです。ただし、これは常に、Oracle Component Exchangeで独立エンティティとして提供される実際のコンポーネントと合せて使用されます。
JETパックで参照されるコンポーネントは一緒に使用するためのものであり、その使用方法は個別のコンポーネント・バージョンによって制限されます。したがって、作成するJETパックによって、各コンポーネントの特定のバージョンと、同じセット内の他のコンポーネントの特定の固定バージョンとの関係が結ばれます。つまり、JETパックそのものにバージョン・ストライプがあり、これによってユーザーがアプリケーションにインポートする特定のコンポーネントが決まります。個々のコンポーネントのバージョン番号は異なる可能性があるため、JETパックによって、コンシューマが自らのアプリケーションとパック全体のバージョン(パックに含まれる個別のコンポーネントではない)を関連付けることが保証されます。
JETパックのバージョン管理の詳細は、「バージョン採番の標準」を参照してください。
JETパックのリソース・コンポーネントの作成
JETパックにアセンブルするWebコンポーネント全体でアセットを再利用する場合は、リソース・コンポーネントを作成します。リソース・コンポーネントは、複数のJETパックで再利用できます。
複雑なコンポーネントのセットを扱うときは、複数のコンポーネント間で特定のアセットを共有できると役立つことがあります。そのような場合、コンポーネントすべてを1つのJETパックに含めて、共有アセットを保持するためにリソース・コンポーネントをパックに追加できます。パックに格納できる内容に制限はありません。通常、共有されるJavaScript、CSS、JSONのファイルとイメージが公開されます。通常、サードパーティ・ライブラリは参照コンポーネントから参照する必要があることに注意してください。リソース・コンポーネントには組み込まないでください。
リソース・コンポーネントを作成するためにツールは必要ありません。便利な場所にフォルダを作成する必要があります。最終的にはこのフォルダを圧縮して、配布可能なリソース・コンポーネントを作成します。このフォルダの内部には、望みの構造で任意のコンテンツを含めることができます。
リソース・コンポーネントを作成するには:
Webコンポーネントの参照コンポーネントの作成
Webコンポーネントで使用するためにサードパーティ・ライブラリへのポインタを取得する必要があるときは、参照コンポーネントを作成します。
参照コンポーネントの作成
参照コンポーネントを作成するためにツールは必要ありません。便利な場所にフォルダを作成して、そこでcomponent.json
ファイルの参照コンポーネントのメタデータを定義する必要があります。最終的にはこのフォルダを圧縮して、配布可能な参照コンポーネントを作成します。
参照コンポーネントは通常はスタンドアロンであるため、作成するcomponent.json
ファイルをJETパックに含めないでください。
参照コンポーネントを作成するには:
参照コンポーネントの使用
Webコンポーネントが、これらの参照コンポーネントのいずれかに定義されたサードパーティ・ライブラリにアクセスする必要があるときは、component.json
のdependency属性のメタデータを使用して、参照コンポーネントの明示的なバージョンを示すか、セマンティック範囲を指定します。ここで示すのは、特定のバージョンの2つの参照コンポーネントを使用するコンポーネントの単純な例です。
{
"name":"calendar",
"pack":"oj-sample",
"displayName": "JET Calendar",
"description": "FullCalendar wrapper with Accessibility added.",
"version": "1.0.2",
"jetVersion": "^9.0.0",
"dependencies": {
"oj-ref-moment":"2.24.0",
"oj-ref-fullcalendar":"3.9.0"
},
...
前述のコンポーネントがOracle JETまたはOracle Visual Builderプロジェクトに追加されるとき、この依存関係情報が使用されて、参照コンポーネントとしてポイントされるサードパーティ・ライブラリの正しいRequireJSパスが作成されます。
セマンティック・バージョンの使用方法の詳細は、「バージョン採番の標準」を参照してください。
または、参照コンポーネントに依存するWebコンポーネントをインストールし、Oracle JET CLIを使用すると、ツールによって自動的にnpmインストールが実行され、ライブラリがローカルになります。ただし、同じコンポーネントがOracle Visual Builderで使用されるときは、CDN位置を使用する必要があります。つまり、参照コンポーネントはVisual Builderで使用できるようにCDNに存在する必要があります。
Webコンポーネントのテーマ適用
Oracle JET Webコンポーネントでは、背景色など、色スタイルのテーマを適用可能な利用側アプリケーションからスタイルを継承する必要がある場合があります。Webコンポーネントでテーマ適用を有効にして、利用側アプリケーションで指定されたスタイルをカスタマイズできるようにすることもできます。テーマ適用サポートをWebコンポーネントに追加し、CSS変数を定義してコンポーネントのルック・アンド・フィールのカスタマイズをサポートできます。
Webコンポーネントのテーマ適用について
Webコンポーネントにテーマを適用する場合、SASS部分ファイルを使用してスタイル・クラスを定義し、JETツールを使用して最適化されたCSSを導出することで、CSS変数を介してスタイルを公開します。
作成するカスタム・コンポーネントおよびコンポーネント・パックにテーマを適用することは必ず必要なわけではありません。多くの場合、カスタム・テーマを有効にする必要はありません。たとえば、追加のユーザー・インタフェースを使用せずに一部のコアJETコンポーネントのみをラップする必要がある場合、テーマ適用は必要ありません。この2つのユースケースが示すように、利用側アプリケーションでコンポーネントがどのように使用されるかによって異なります。
-
コンポーネントで色スタイルがテーマ適用可能である必要がある背景色など、コンポーネントが利用側アプリケーションからスタイルを継承する必要がある場合は、カスタム・コンポーネントまたはコンポーネント・パックをテーマ対応にします。
-
コンポーネントが独自のスタイル・クラスを定義し、そのスタイルをカスタマイズのために利用側アプリケーションでテーマ適用可能にする必要がある場合は、カスタム・コンポーネントまたはコンポーネント・パックをテーマ対応にします。
Oracle JETは、アプリケーションのテーマ適用でCSS変数に依存します。CSS変数を使用したWebコンポーネントのテーマ適用では、利用側アプリケーションへの容易な統合がサポートされています。テーマ適用プロセスを合理化し、最適化されたスタイルシートの生成をサポートするために、WebコンポーネントはSASS部分ファイルおよびSCSS処理に依存します。
Webコンポーネントを作成した後、ojet add theming
コマンドを実行して、コンポーネントを追加するベース・アプリケーションにscss処理のサポートをインストールします。その後、ojet create
コンポーネント・コマンドを使用して、コンポーネントをjet-composites
フォルダに追加できます。新しいコンポーネント・プロジェクトには、次のように、テーマ・フォルダと、SASS部分ファイルを含むbase
、redwood
、stable
の3つのサブフォルダが含まれます:
-
baseフォルダ - テーマ間で共通のコンポーネントのスタイル・クラスを定義するベースSASS部分ファイルが含まれます。スタイル・クラスはCSS変数を参照し、その値は通常、テーマ固有のSASS部分ファイルによって提供されます。
-
redwoodフォルダ - Redwoodテーマのテーマ固有のSASS部分ファイルが含まれます。ここでは、コンポーネントのスタイル設定を定義します。具体的には、テーマのバリアントがベースの
_myComponent.scss
部分ファイルに設定する必要があるCSS変数値を設定するために使用します。RedwoodテーマはOracleアプリケーションのルック・アンド・フィールを実装し、Oracleの要件に対応するために将来の変更が行われます。 -
stableフォルダ - Stableテーマのテーマ固有のSASS部分ファイルが含まれます。ここでは、コンポーネントのスタイル設定を定義します。具体的には、テーマのバリアントがベースの
_myComponent.scss
部分ファイルに設定する必要があるCSS変数値を設定するために使用します。将来のテーマの更新がカスタム・テーマに影響を与える可能性を減らしたい場合は、カスタム・テーマのベース・テーマとしてStableテーマをお薦めします。
これらのフォルダ間で分割されたSASS部分は、コア・スタイル定義と変数駆動のテーマ固有の定義の分離をサポートしています。この構造を使用すると複数のテーマを定義できますが、実際には、Redwoodテーマがモバイル・デバイス上のiOSやデスクトップ・マシン上のWindowsなどのプラットフォームおよび環境にまたがって実行されるJET Webアプリケーションの要件ではありません。
生成されたテーマ・フォルダに加えて、各コンポーネントには、コンポーネント・フォルダのルートに、テーマSASS部分から最終CSSを生成するためにJETツールで処理されるSCSSファイル(myComponent-styles.SCSS
)もあります。ルート.scss
ファイルには、次の単一行が含まれます。
@import "themes/redwood/_myComponent.scss";
Webコンポーネントのテーマ適用のガイドライン
JETでは、テーマ適用の主要手段としてCSS変数を使用しているため、サポートされている単一のテーマ構成でも、利用側アプリケーションのニーズに適応できます。
Webコンポーネントのテーマを適用する場合は、プロセスを導くための次の考慮事項に従ってください。
- 目的は、ほとんどの場合、テーマが適用されたWebコンポーネントを即時利用可能な状態で動作させ、利用側アプリケーションにより引き続きそのコンポーネントにテーマを適用できるようにすることです。コンポーネント・セット全体で単一のデフォルト・テーマを維持します。
- Webコンポーネントには、即時利用可能な状態で動作する単一のデフォルト・テーマを用意する必要がありますが、コンポーネント内で複数のテーマの設定を定義することもできます。直接実行時に使用するためにコンポーネントに対しアクティブにして表示できるのは、1つのテーマのみです。
- サポートされているテーマをコンポーネントまたはパックのreadmeファイルにドキュメント化します。この情報は、
component.json
で指定するコンポーネント・メタデータと組み合せて、利用側アプリケーションが満たす必要がある規定を指定します。 - CSS変数を使用して、テーマ内で構成可能にするものを外部化します。これにより、必要に応じてコンポーネント・インスタンス・スタイルのオーバーライドがサポートされ、コンポーネントのカスタム・テーマの作成も簡略化されます。
- JET Redwoodのコア・テーマからできるだけ多くの情報(色ランプやサイズ設定など)を継承します。これにより、Webコンポーネントのテーマ適用がアプリケーションに存在するすべてのコアJETコンポーネントと調和し、コンポーネントがカスタム・テーマに適切に適応できるようになります。可能な場合は、JETまたは他のパブリック・レイアウト・スタイルによって提供される
oj-flex
クラスを使用してレイアウトを管理します。これにより、パディングなどのテーマの細かい属性の一貫性が保証されます。 - CSSの使用は、JETパック・レベルまたはアプリケーション・レベルで統合できるように最適化する必要があります。CSS変数を使用すると、CSS統合がサポートされます。
アプリケーションまたはインスタンス・レベルで利用側アプリケーションがオーバーライドできるように、テーマ適用されたコンポーネントがCSS変数を介して構成されている場合は、コンポーネントREADME.md
のThemingというセクションにこれらの変数を追加し、それらの動作と設定内容をドキュメント化します。この方法でドキュメント化されると、変数はコンポーネントAPIの正式な部分になり、変更を加える場合は通常のセマフォ・ルールに従う必要があります。デフォルト・テーマに対する変更は、セマンティック・バージョン番号のMAJORバージョン番号変更としてクラス化する必要があります。
Webコンポーネントのテーマ適用
Oracle JETツールを使用して、カスタムWebコンポーネント・プロジェクトをテーマ対応にし、CSS変数を使用して、プロジェクトに追加するカスタム・コンポーネントにテーマを適用できます。
JETツールを使用して、含まれているプロジェクトにテーマ適用サポートを追加することで、新しいWebコンポーネント・プロジェクトまたはJETパック・プロジェクトのテーマ適用を有効にします。このツールは、CSS生成プロセスを合理化するために使用されるSASS部分ファイルを追加し、ベース・テーマへの変更をサポートするカスタム・コンポーネントまたはパックを作成するための前提条件ステップです。
プロジェクト・ルートでojet add theming
コマンドを実行して含まれているプロジェクトをテーマ対応にすると、プロジェクトで作成する新しいカスタム・コンポーネントには、themes
フォルダと、それぞれに変更する単一のSASS部分ファイルが含まれるサブフォルダが含まれます:
/<componentName>/themes/base/_<componentName>.sccs
は、テーマ間で共通のままにするコンポーネントのカスタム・スタイルを定義します。テーマのバリエーションを使用して変更する必要があるスタイル設定部分は、CSS変数値を介して挿入され、ベースJETテーマまたはコンポーネント・テーマ固有の設定から取得されます。/<componentName>/themes/redwood/_<componentName>.sccs
には、コンポーネントのテーマ固有の設定が含まれます。具体的には、このファイルで、Redwoodテーマに基づくカスタム・テーマが基本部分に設定する必要があるCSS変数値を指定できます。/<componentName>/themes/stable/_<componentName>.sccs
には、コンポーネントのテーマ固有の設定が含まれます。具体的には、このファイルで、Stableテーマに基づくカスタム・テーマが基本部分に設定する必要があるCSS変数値を指定できます。
また、テーマ対応プロジェクトのカスタム・コンポーネントにも、コンポーネントのルート・フォルダに<componentName>.scss
SASSファイルが含まれます。このファイルは、JETビルド・プロセスがSASS部分ファイルから生成するCSSファイルをインポートするために使用されます。
ノート:
ojet add theming
を実行する前にパックまたはコンポーネントを作成すると、CSSビルド・エラーが発生する場合があります。add theming
コマンドを使用すると、SCSSコンパイルでCSSを生成できます。パックまたはコンポーネントを作成する前に、必ずadd theming
を実行してください。
始める前に:
- Webコンポーネントのカスタム・セレクタを直接定義する際に使用するCSS変数および値の概要は、JET APIリファレンス・ドキュメントのJET CSS変数を参照してください。
- CSS変数の使用例については、Oracle JETクックブックのCSS変数を参照してください。
- この対話形式のデモ・アプリケーションで使用可能なCSS変数について理解を深める場合は、必要に応じてCSS変数テーマ・ビルダー - 「指示」タブ・アプリケーションをダウンロードしてインストールします。CSS変数のオーバーライドによってデモ・ツールUIがどのように変化するかを学習するには、オンラインの指示に従ってテーマ定義ファイルを変更します。
テーマのサポートを追加し、コンポーネントにテーマを適用するには:
JETパックのCSSの統合
JETパック内のカスタム・コンポーネントのスタイルシートを単一のCSSファイルに統合できます。
カスタムWebコンポーネントをJETパックに追加すると、最初は各コンポーネントに独自のCSSファイルが用意されます。このアプローチは機能しますが、本番アプリケーションでは、サーバーへの物理的なラウンドトリップ回数を減らし、ブラウザ・キャッシュとCDNを最大限に活用することが最適です。ラウンドトリップ数を減らすには、パックに追加する共有リソース・コンポーネントを使用して、単一のCSSファイルからのロードを有効にします。
始める前に:
- JETパックのリソース・コンポーネントの作成の説明に従って、作業フォルダ
common
およびそのcomponent.json
ファイルを含むリソース・コンポーネントを作成します。
パックに単一の共有CSSファイルを作成するには:
利用側アプリケーションでスタイルを提供できるようにCSSを最適化
利用側アプリケーションのテーマCSSのコンポーネント・スタイルのロードを最適化できます。
テーマを適用したコンポーネントのダウンストリーム使用をサポートするには、Webコンポーネントでコンポーネントに必要な規約を確立する必要があります。テーマを適用したカスタム・コンポーネントをアプリケーションに使用する開発者は、スタイルを変更せずに組み込み、テーマ・スタイルを独自のスタイルでオーバーライドし、オプションでCSS最適化を実行して単一のCSSファイルからのロードを有効にできます。
これらの使用を有効にするには、ダウンストリーム開発者がアプリケーションにコンポーネントを追加するときに従う規約を確立する必要があります。
規約を定義してサポートするには、コンポーネントが公開するテーマSCSS部分を指定するメタデータでカスタム・コンポーネントを装飾し、コンポーネントCSSのデフォルト・ローダー・スクリプトを変更して、構成可能なojcss
プラグインでCSS requireJSプラグインを指定します。
始める前に:
- JETパックのCSSの統合の説明に従って、パック・レベルで作成したリソース・コンポーネントを使用して、コンポーネント・スタイルシートの統合を設定します。
コンポーネントのテーマ使用規約を定義するには:
利用側アプリケーションへのテーマ・コンポーネントの組込み
利用側アプリケーションのテーマのスタイル・クラスを変更することで、適切にテーマ適用されたWebコンポーネントのCSS変数をオーバーライドできます。
たとえば、アプリケーションのカスタム・テーマでデフォルトのRedwoodテーマの色ランプを変更する場合、アプリケーションに追加するテーマ適用可能なカスタム・コンポーネントで同じ色が継承されるようにする必要があります。利用側アプリケーションによってカスタム・コンポーネントのCSS変数をオーバーライドするこのプロセスでは、使用する各コンポーネントによって提供される部分を組み込む必要があります。このプロセスは静的に定義されるため、テーマ適用を必要とする新しいコンポーネントを利用側アプリケーションに追加するたびに再実行する必要があります。
このプロセスは、基礎となるRedwoodテーマを変更する必要がなく、コアRedwoodスタイルと、使用するカスタム・コンポーネントに定義されている追加のスタイルの両方を統合することでCSSファイルの数を最適化するだけの場合にも使用できます。
始める前に:
- テーマ作成プロセスの実行に使用する作業プロジェクトを作成します。
ojet create redwood-plus-theme-source --template=basic
この例では、作業プロジェクトの名前は
redwood-plus-theme-source
です。 - プロジェクトにテーマのサポートを追加し、カスタム・テーマを作成します。
ojet add theming ojet create theme redwood-plus --basetheme=redwood
この例では、テーマ名
redwood-plus
によって、カスタム・テーマとすぐに使用できるredwood
テーマ名が区別されます。JETは、リリース11.0.0の時点で、すぐに使用できるredwood
テーマに対する将来の変更の影響を受けにくいもう1つのすぐに使用できるテーマ(stable
)をサポートしています。利用側アプリケーションがstable
テーマに基づくテーマを使用する場合は、--basetheme
引数値としてstable
を選択します。 - Oracle Component Exchangeを使用してWebコンポーネントを追加する場合は、Component Exchangeへのアクセスを設定します。
ojet configure --exchange-url=https://xxxxx-cloud01.developer.ocp.oraclecloud.com/xxxxx-cloud01/s/xxxxx-cloud01_sharedcomponentcatalog_8325/compcatalog/0.2.0
-
テーマに含めるコンポーネントを追加します。このプロセスにより、テーマ・ソース・プロジェクトのルートにある
/jet_components
キャッシュ・フォルダにコンポーネントがダウンロードされます。コンポーネントを1つずつ追加できます。
ojet add component oj-sample-metric@^4.0.0
または、パック全体を一度に追加することもできます。
ojet add pack oj-sample@^4.0.0
この例では、この項の前のトピックで示した例のコンポーネント名とパック名を再利用します。
コンポーネントまたはパックを追加する場合は、必要なバージョンを指定する必要があります。コアJETテーマの使用方法と同様に、コンポーネントまたはパックのメジャー・バージョン番号に変更がある場合は、テーマを再構築して再生成できます。
テーマ適用可能なコンポーネントをカスタム・テーマに組み込むには:
Webコンポーネントのテスト
クライアント側のJavaScriptアプリケーション用の好みのテスト・ツールを使用して、Oracle JET Webコンポーネントをテストします。
選択したテスト方法に関係なく、テストでWebコンポーネントの次のものが完全に実行されるようにしてください。
-
ViewModel (存在する場合)
コード・カバレッジ番号を使用してテスト結果を検証することをお薦めします。
-
HTMLビュー
条件付きでレンダリングされる場合があるすべてのDOMブランチを追加し、デフォルト・コンテンツあり/なしですべてのスロットをテストしてください。
-
プロパティおよびプロパティ値
-
イベント
-
メソッド
-
アクセシビリティ
-
セキュリティ
Oracle JETアプリケーションのテストの詳細は、「Oracle JETアプリケーションのテスト」を参照してください。
ページへのWebコンポーネントの追加
Oracle JET Webコンポーネントを使用するには、Webコンポーネントのローダー・ファイルをアプリケーションに登録する必要があり、アプリケーションのHTMLにWebコンポーネント要素を含める必要もあります。必要に応じて、サポートするCSSまたはファイルを追加できます。
Webコンポーネントのビルド
Oracle JET Webコンポーネントを作成することで、ファイルを最適化し、コンシューマと共有可能なコンポーネントの縮小フォルダを生成できます。
Webコンポーネントを構成し、様々なアプリケーションで使用する準備ができたら、スタンドアロンWebコンポーネント、JETパックおよびリソース・コンポーネントといったタイプのWebコンポーネントをビルドできます。JETツールを使用してこれらのコンポーネントをビルドすると、最適化されたコンポーネント・ファイルを含む縮小コンテンツが生成されます。この縮小バージョンのコンポーネントは、コンシューマと簡単に共有して使用できます。たとえば、Oracle Component Exchangeに公開する前にコンポーネントをビルドします。Webコンポーネントをビルドするには、コンポーネントを含むJETアプリケーションのルート・フォルダから次のコマンドを使用します:
ojet build component my-web-component-name
たとえば、Webコンポーネント名がdemo-card-example
の場合は、次のコマンドを使用します。
ojet build component demo-card-example
JET Packの場合は、パック名を指定します。
ojet build component my-pack-name
パック内の個別のコンポーネントのビルドはサポートされていないことに注意してください。パック全体を一度にビルドする必要があります。
このコマンドによって、Oracle JET Webアプリケーションのweb/js/jet-composites/demo-card-example/x.x.x
ディレクトリに/min
フォルダが作成されます。ここで、x.x.x
はコンポーネントのバージョン番号です。/min
フォルダにはWebコンポーネント・ファイルの縮小(リリース)バージョンが含まれます。
参照コンポーネントでは縮小やバンドルは必要ないため、ビルドする必要はありません。
Webコンポーネントをビルドする場合:
-
JETアプリケーションに複数のコンポーネントが含まれる場合、コンポーネントを含むJETアプリケーションをビルドし、すべてのコンポーネントをまとめてビルドして最適化できます。コンポーネント名を指定して
build component
コマンドを実行すると、単一コンポーネントをビルドできます。 -
オプションで、buildコマンドとともに
--release
フラグを使用することはできますが、build
コマンドではコンポーネントのデバッグと縮小バージョンの両方が生成されるため、必須ではありません。 -
デバッグに適した可読性の高いコンパイル出力を生成する場合は、オプションで
build
コマンドとともに--optimize=none
フラグを使用できます。コンポーネントのloader.js
ファイルには縮小アプリケーション・ソースが含まれますが、元のソースの改行および空白が保持されるため、内容の可読性は向上します。
VComponentベースのWebコンポーネントのAPIドキュメントの生成
Oracle JET CLIには、開発するVComponentベースのWebコンポーネント(VComponent)のAPIドキュメントの生成を支援するためのコマンド(ojet add docgen
)が含まれています。
プロジェクトのルートからコマンドを実行すると、JSDoc NPMパッケージがインストールされ、apidoc_template
ディレクトリがプロジェクトのsrc
ディレクトリに追加されます。apidoc_template
ディレクトリには、後でVComponent用に生成するAPIリファレンス・ドキュメントの適切なタイトル、サブタイトルおよびフッター情報(コピーライト情報など)でカスタマイズできる次のファイルが含まれています。
footer.html
header.html
main.html
次の例のように、VComponentのソース・ファイルにコメントを記述します:
import { ExtendGlobalProps, registerCustomElement } from "ojs/ojvcomponent";
. . .
type Props = Readonly<{
message?: string;
address?: string;
}>;
/**
*
* @ojmetadata version "1.0.0"
* @ojmetadata displayName "A user friendly, translatable name of the component"
* @ojmetadata description "<p>Write a description here.</p>
<p>Use HTML tags to put in new paragraphs</p>
<ul>
<li>Bullet list item 1</li>
<li>Bullet list item 2</li></ul>
* <p>Everything before the closing quote is rendered</p>
* "
*
*/
function StandaloneVcompFuncImpl({ address = "Redwood shores",
message = "Hello from standalone-vcomp-func" }: Props) {
return (
<div>
. . .
</div>
);
}
ソース・ファイルでのVComponentのAPIの文書化が完了したら、コンポーネントがJETパック(ojet build component component-name
またはojet build component jet-pack-name
)の一部である場合、コンポーネントまたはJETパックに対してbuild
コマンドを実行し、appRootDir/web/js/jet-composites/component-or-pack-name/vcomponent-version/docs
ディレクトリにAPIリファレンス・ドキュメントを生成します。
次の/docs
ディレクトリ・リストは、スタンドアロンVComponentに対してOracle JET CLIによって生成されるファイルを示しています。コンポーネントを含むOracle JETアプリケーションをビルドして、APIドキュメントを生成することはできません。個々のVComponentまたはVComponentを含むJETパックをビルドする必要があります。Oracle JET CLI ojet add docgen
コマンドを使用して、CCAベースのWebコンポーネントのAPIドキュメントを生成することもできません。
appRootDir/web/js/jet-composites/standalone-vcomp-func/1.0.0/docs
| index.html
| jsDocMd.json
| standalone-vcomp-func.html
| standalone.StandaloneVcompFunc.html
|
+---scripts
| | deprecated.js
| |
| \---prettify
| Apache-License-2.0.txt
| lang-css.js
| prettify.js
|
\---styles
| jsdoc-default.css
| prettify-jsdoc.css
| prettify-tomorrow.css
|
\---images
bookmark.png
linesarrowup.png
linesarrowup_blue.png
linesarrowup_hov.png
linesarrowup_white.png
oracle_logo_sm.png
なお、生成されたAPIドキュメントの外観を変更するために代替ロゴまたはCSSスタイル(あるいはその両方)を含める場合は、ディレクトリappRootDir/node_modules/@oracle/oraclejet/dist/jsdoc/static/styles/
のコンテンツを更新してください。
Webコンポーネントのパッケージ化
コマンドライン・インタフェースで、縮小Oracle JET Webコンポーネントの共有可能なzipファイル・アーカイブを作成できます。
/web
のjet-composites
サブフォルダに含まれる生成済出力のアーカイブ・ファイルを作成できます。スタンドアロンWebコンポーネントまたはリソース・コンポーネントをビルドしたら、JETツールを使用してpackage
コマンドを実行し、Webコンポーネントのコンパイル済の縮小ソースを含むzipファイルを作成します。ojet package component my-web-component-name
/jet-composites/<packName>
サブフォルダ内の出力には、ネストされたコンポーネント・フォルダが含まれますが、ツールを使用すると確実にコンポーネントごとに独自のzipファイルが作成されるためです。ojet package pack my-JET-Pack-name
package
コマンドは、/web/js/jet-composites
ディレクトリからコンポーネントの縮小ソースをパッケージ化し、それを含むアプリケーションのルートにある/dist
フォルダ内のzipファイルとして使用できるようにします。このzipファイルの/min
サブフォルダには、指定されたコンポーネントとそのコンポーネントの縮小バージョンの両方が含まれます。
参照コンポーネントでは縮小やバンドルは必要ないため、ビルドする必要はありません。コンポーネントのフォルダの単純なzipアーカイブを作成することで、参照コンポーネントをアーカイブできます。
パッケージ化されたコンポーネントのzipアーカイブは、たとえば、「Oracle Component ExchangeへのWebコンポーネントの公開」に示したように、Oracle Component Exchangeで共有するために適しています。公開するコンポーネントを編成するために、JETツールにより、JETパックと個々のコンポーネントのcomponent.json
ファイルのversion
プロパティの値がdist
フォルダ内の生成されたzipに追加されます。たとえば、version
値が1.0.0
であるコンポーネント・パックmy-component-pack
があり、パック内の個々のコンポーネント(my-widget-1
など)のバージョン値も1.0.0
の場合、生成されたファイルのzipファイル名は次のようになります:
appRootDir/dist/
my-web-component-name_1-0-0.zip
my-component-pack_1-0-0.zip
my-component-pack-my-widget-1_1-0-0.zip
my-component-pack-my-widget-2_1-0-0.zip
my-component-pack-my-widget-3_1-0-0.zip
コンポーネントをCDNにアップロードするときに、アーカイブ・ファイルも生成できます。CDNの場合は、「CDNでのWebコンポーネントのアップロードおよび消費」で説明しているように、コンポーネントを共有するために追加のステップが必要です。
共有Oracle Component Exchangeをホストするためのプロジェクトの作成
他の開発者が再利用できるように様々なマシンにWebコンポーネントを格納して共有する場合、Oracle Visual Builder Studioで作成するコンポーネント交換を使用できます。
Webコンポーネントを共有する場合は、一般に、共有交換をホストする専用プロジェクトを設定する必要があります。Oracle Visual Builder Studio内のすべてのプロジェクトにはプライベートのコンポーネント交換インスタンスがありますが、共有交換の場合は、アップロードされたコンポーネントに他の開発者がアクセスできます。同じプロジェクトを共有交換で使用して、コンポーネントのソース・コード・リポジトリをホストできます。
共有交換を作成するには:
Oracle Component ExchangeへのWebコンポーネントの公開
他の開発者が再利用できるように様々なマシンにWebコンポーネントを格納して共有する場合、Oracle JET CLI (コマンドライン・インタフェース)を使用して、Oracle Visual Builder Studioで定義された共有コンポーネント交換へのアクセスを構成してから、公開プロジェクトにコンポーネントを公開できます。
Webコンポーネントを共有する場合、Oracle JET CLIを使用して、ターゲット・コンポーネント交換へのURLを指定することで、共有コンポーネント交換へのアクセスを構成できます。特定のコンポーネント交換用のJETツールを構成したら、JET CLIでpublish component
コマンドを実行して、指定したコンポーネントをアップロードできます。アクセス権を持つユーザーは、CLIを使用して、コンポーネント交換でコンポーネントをキーワードで検索し、コンポーネントをWebアプリケーション・プロジェクトに追加できます。
始める前に:
-
「共有Oracle Component Exchangeをホストするプロジェクトの作成」の説明に従って、共有コンポーネント交換でプロジェクトを作成します。
-
コンポーネントにアクセスする必要があるすべてのユーザーとプロジェクトを共有するには、コンポーネントをメンバーとしてプロジェクトに追加します。「共有Oracle Component Exchangeをホストするプロジェクトの作成」を参照してください。共有コンポーネント交換にアクセスするには、ユーザーが自分のユーザー名とパスワードを作成する必要があります。
コンポーネントを共有コンポーネント交換に公開するには:
search exchange
コマンドを実行することで、構成されたコンポーネント交換を検索できます。また、構成されたコンポーネント交換に対してadd component
コマンドを実行することで、コンポーネントをWebアプリケーションに追加できます。詳細を確認するには、JET CLIでojet help
を使用します。
CDNでのWebコンポーネントのアップロードおよび消費
Webコンポーネントをパッケージ化してコンテンツ配信ネットワーク(CDN)で使用できるようにし、アプリケーションでコンポーネントを再利用できます。
コンポーネントのCDNでの位置は、コンポーネントのcomponent.json
ファイルで定義されるコンポーネント・メタデータに含めることができます。これにより、Oracle JETツールやOracle Visual Builderなどのツールは、リリース・モードでアプリケーションをビルドする際に、CDNの場所を指すことができます。
CDN情報は、component.json
ファイルのpaths
属性を使用してエンコードされます。典型的な例は、次のようになります。
{
"name": “demo-samplecomponent",
"displayName": “Sample component",
"version": "1.0.0",
"paths": {
"cdn": {
"min": "https://static.example.com/cdn/jet/components/demo-samplecomponent/1.0.0/min",
"debug": "https://static.example.com/cdn/jet/components/demo-samplecomponent/1.0.0"
}
},
...
次のノートは、指定するpaths
属性に適用されます:
-
CDNの正確なルートの場所はCDNプロバイダによって異なります。これは必要な場所の最後の部分です。
-
この場所のフォルダにはコンポーネントと同じ名前が付き(この例では
demo-samplecomponent
)、その後にコンポーネントのバージョン番号(1.0.0
)が続きます。コンポーネントの新しいバージョンをリリースすると、コンポーネント・ルートの下に新しいバージョン番号のフォルダが作成されます。 -
コンポーネントに
min
パスとdebug
パスの両方を指定できます。debug
パスはオプションです。
CDN配布の準備をするには、Oracle JETコマンドライン・インタフェースでpackage component
コマンドを実行してコンポーネントをパッケージ化します。これにより、コンポーネントと同じ名前のzipファイル(たとえば、demo-samplecomponent.zip
)が、それを含むOracle JETアプリケーションの/dist
フォルダに生成されます。このzipファイルの/min
サブフォルダには、指定されたコンポーネントとそのコンポーネントの縮小バージョンの両方が含まれます。
component.json
ファイルで指定される、CDNの/<component-name>/<version>
フォルダの下に作成したzipファイルを解凍します。
CDNでコンポーネントが使用できるようになったら、コンポーネントのrequireJSパスをコンポーネントに対して指定したCDNの場所に指定して、JETアプリケーションで使用できます。Oracle JETツールを使用すると、自動的に指定されます。ただし、requireJSパスを手動で定義する必要がある場合、main.js
ファイルのこのマッピングは次のようになります:
requirejs.config(
{
baseUrl: 'js',
paths:
{
'demo-samplecomponent': '"https://static.example.com/cdn/jet/components/demo-samplecomponent/1.0.0/min',
...
コンポーネントへの参照は、パス<component-name>/loader
を使用して作成できます。