Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
[Cette rubrique fait partie de la documentation en version préliminaire et peut faire l’objet de modifications.]
Ce didacticiel montre comment créer un composant de code pour les applications pilotées par modèle qui dépend des bibliothèques contenues dans un autre composant. En savoir plus sur la version préliminaire des bibliothèques dépendantes
Goal
Suivez les étapes de ce didacticiel pour créer un contrôle de bibliothèque et un contrôle qui en dépend. Ce didacticiel contient les étapes suivantes :
- Générer le composant de la bibliothèque : créez un composant qui ne contient que la bibliothèque réutilisable. Pour simplifier, ce contrôle ne contient que la bibliothèque réutilisable. Il n’y a aucune raison pour qu’il ne puisse pas également fournir des fonctionnalités.
- Générer le contrôle dépendant : créez un composant qui utilise la bibliothèque définie dans le contrôle de bibliothèque et ajoutez-le au formulaire d’une application pilotée par modèle pour vérifier son bon fonctionnement.
- Charger la bibliothèque dépendante à la demande : développez l’exemple pour que le composant dépendant charge la ressource de la bibliothèque à la demande au lieu que l’infrastructure charge la bibliothèque lors du chargement du contrôle.
Prérequis
Vous devez déjà savoir comment :
- Créer un composant de code
- Créer un package de composant de code
- Ajouter des composants de code à une application pilotée par modèle
1. Générer le composant de bibliothèque
Ce composant ne fournit aucune fonctionnalité par lui-même. Il s’agit simplement d’un conteneur pour la bibliothèque.
La première étape consiste à créer un nouveau composant à l’aide de la commande pac pcf init :
pac pcf init -n StubLibrary -ns SampleNamespace -t field -npm
Définir la bibliothèque
Vous avez besoin d’un nouveau fichier de déclaration (d.ts) pour décrire les objets et les fonctions contenus dans votre bibliothèque. Créez un nouveau fichier dans le dossier racine de votre projet nommé
myLib.d.ts:declare module 'myLib' { export function sayHello(): string; }Nous allons exposer notre bibliothèque en tant que module UMD, et nous devons placer la variable dans la portée globale. Pour cela, nous avons besoin d’un nouveau fichier de déclaration (d.ts). Créez un nouveau fichier dans le dossier racine de votre projet nommé
global.d.ts:/* eslint-disable no-var */ declare global { var myLib: typeof import('myLib'); } export { };Mettez à jour tsconfig.json pour autoriser les modules UMD et le code JavaScript comme suit :
Ajouter la bibliothèque
Dans votre nouveau dossier de contrôle, ajoutez un nouveau dossier pour contenir vos bibliothèques libs ; pour cet exemple, créez un nouveau fichier JavaScript. Cet exemple utilise une bibliothèque nommée myLib-v_0_0_1.js qui a une seule fonction sayHello.
// UMD module pattern
var myLib = (function (exports) {
"use strict";
function sayHello() {
return "Hello from myLib";
}
exports.sayHello = sayHello;
return exports;
})(/** @type {import('myLib')} */ ({}));
Ajouter des données de configuration
Ajoutez un fichier nommé
featureconfig.jsondans le dossier racine du projet.Ajoutez le texte suivant au fichier
featureconfig.json:{ "pcfAllowCustomWebpack": "on", "pcfAllowLibraryResources": "on" }Ajoutez un nouveau fichier
webpack.config.jsdans le dossier racine de votre projet. Ces données de configuration garantissent que les bibliothèques ne sont pas regroupées avec la sortie de contrôle. Le regroupement n’est pas nécessaire, car elles sont déjà mises en package séparément lorsque vous créez le projet./* eslint-disable */ "use strict"; module.exports = { externals: { "myLib": "myLib" }, }Ajoutez une référence à la bibliothèque sous
resourcesdans le manifeste du contrôle.
Ajouter la bibliothèque à la fenêtre
La dernière étape consiste à modifier le fichier index.ts du contrôle pour lier la bibliothèque à la fenêtre.
import { IInputs, IOutputs } from "./generated/ManifestTypes";
export class StubLibrary
implements ComponentFramework.StandardControl<IInputs, IOutputs>
{
constructor() {
// Empty
}
public init(
context: ComponentFramework.Context<IInputs>,
notifyOutputChanged: () => void,
state: ComponentFramework.Dictionary,
container: HTMLDivElement
): void {
// Add control initialization code
}
public updateView(context: ComponentFramework.Context<IInputs>): void {
// Add code to update control view
}
public getOutputs(): IOutputs {
return {};
}
public destroy(): void {
// Add code to cleanup control if necessary
}
}
Le projet de la bibliothèque devrait se présenter comme suit :-
Générer et créer un package pour le composant de la bibliothèque
Pour terminer le composant de la bibliothèque, effectuez les étapes suivantes comme d’habitude :
- Créer et générer le composant de code
- Créer un package de composant de code
- Déployer le composant de code
2. Générer le contrôle dépendant
Maintenant que vous disposez d’un contrôle de bibliothèque, vous avez besoin d’un contrôle qui en dépende.
Créez un nouveau composant en utilisant cette commande :
pac pcf init -n DependencyControl -ns SampleNamespace -t field -fw react -npmAjoutez un nouveau fichier de contrôle de fonctionnalité dans le dossier racine de votre projet appelé
featureconfig.jsoncontenant le texte suivant :{ "pcfResourceDependency": "on" }Ajoutez la ressource dépendante dans le manifeste du contrôle.
Utilisez le
schemaNamedu contrôle dépendant[solution prefix]_[namespace].[control name], que vous pouvez trouver dans le fichiersolution.xmldu composant dépendant. Le code XML contenu dans le fichier solution.xml peut ressembler à ceci :<RootComponents> <RootComponent type="66" schemaName="samples_SampleNamespace.StubLibrary" behavior="0" /> </RootComponents>
<resources>
<code path="index.ts"
order="1" />
<platform-library name="React"
version="16.14.0" />
<platform-library name="Fluent"
version="9.46.2" />
</resources>
Ajouter Global.d.ts
Étant donné que la StubLibrary est exposée en tant que module UMD, nous devons placer la variable dans la portée globale. Pour cela, nous avons besoin d’un nouveau fichier de déclaration (d.ts). Créez un nouveau fichier dans le dossier racine de votre projet nommé global.d.ts :
/* eslint-disable no-var */
interface MyLib {
sayHello(): string;
}
declare global {
var myLib: MyLib;
}
export { };
Utiliser la fonction de la bibliothèque
Mettez à jour le fichier HelloWorld.tsx du composant afin qu’il utilise une fonction de la bibliothèque dépendante. La bibliothèque est chargée dans l’objet Window au moment de l’exécution.
import * as React from 'react';
import { Label } from '@fluentui/react-components';
export interface IHelloWorldProps {
name?: string;
}
export class HelloWorld extends React.Component<IHelloWorldProps> {
public render(): React.ReactNode {
return (
<Label>
{this.props.name}
</Label>
)
}
}
Générer et empaqueter le composant dépendant
Pour terminer le composant dépendant, effectuez les étapes suivantes comme d’habitude :
- Créer et générer le composant de code
- Créer un package de composant de code
- Déployer le composant de code
Ajouter le composant à un formulaire
Accédez au formulaire et vous devriez voir le composant afficher le texte
Hello from myLib from Dependency.
3. Charger la bibliothèque dépendante à la demande
Vous pouvez développer cet exemple en modifiant le composant dépendant pour qu’il charge la ressource de bibliothèque à la demande, plutôt que de demander à l’infrastructure de charger la bibliothèque lors du chargement du composant. Le comportement de chargement à la demande est utile si les bibliothèques utilisées par le contrôle sont volumineuses et augmentent le temps de chargement du formulaire.
Spécifier le comportement de chargement à la demande
Pour spécifier le comportement de chargement à la demande, modifiez le manifeste de contrôle du composant créé en 2. Créer le contrôle dépendant.
<resources>
<dependency type="control"
name="samples_SampleNamespace.StubLibrary"
order="1" />
<code path="index.ts"
order="2" />
<platform-library name="React" version="16.14.0" />
<platform-library name="Fluent" version="9.46.2" />
</resources>
Modifier le composant dépendant pour charger la bibliothèque à la demande
Modifiez le fichier HelloWorld.tsx pour ajouter un état et des méthodes pour le mettre à jour une fois la dépendance chargée.
import * as React from 'react';
import { Label } from '@fluentui/react-components';
export interface IHelloWorldProps {
name?: string;
}
export class HelloWorld extends React.Component<IHelloWorldProps> {
public render(): React.ReactNode {
return (
<Label>
{ window.myLib.sayHello() + " from Dependency" || "Hello World"}
</Label>
)
}
}
Mise à jour de index.ts
Lorsque le script est chargé à la demande, vous devez apporter de légers ajustements à la façon dont le composant est créé et initialisé. Par exemple, de nouvelles variables pour les références au contexte et au conteneur pour mettre à jour l’état.
Plus important encore, ajoutez une méthode getActions pour réagir au chargement et demander le chargement du contrôle dépendant.
import { IInputs, IOutputs } from "./generated/ManifestTypes";
import { HelloWorld, IHelloWorldProps } from "./HelloWorld";
import * as React from "react";
export class DependencyControl implements ComponentFramework.ReactControl<IInputs, IOutputs> {
private notifyOutputChanged: () => void;
constructor() {
// Empty
}
public init(
context: ComponentFramework.Context<IInputs>,
notifyOutputChanged: () => void,
state: ComponentFramework.Dictionary
): void {
this.notifyOutputChanged = notifyOutputChanged;
}
public updateView(context: ComponentFramework.Context<IInputs>): React.ReactElement {
const props: IHelloWorldProps = { name: 'Power Apps' };
return React.createElement(
HelloWorld, props
);
}
public getOutputs(): IOutputs {
return { };
}
public destroy(): void {
// Add code to cleanup control if necessary
}
}
Étapes finales
- Mettez à jour le numéro de version du contrôle dans le fichier
ControlManifest.Input.xmlet la version dans le fichierSolution.xml - Regénérez, empaquetez, déployez et publiez la solution avec le contrôle mis à jour.
Vérifier les résultats
Maintenant, lorsque la page se charge, vous voyez le contrôle se charger avec Loading....
Une fois la page chargée, le contrôle se met à jour pour afficher Hello from myLib Dependency On Demand Load.