Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
[Este tópico faz parte da documentação de pré-lançamento e está sujeito a alterações.]
Este tutorial mostra como criar um componente de código para aplicativos controlados por modelos que dependem de bibliotecas contidas em outro componente. Saiba mais sobre a versão prévia das bibliotecas dependentes
Goal
Siga as etapas neste tutorial para criar um controle de biblioteca e um controle que depende dele. Este tutorial contém as seguintes etapas:
- Crie o componente de biblioteca: crie um componente que contenha apenas a biblioteca reutilizável. Para simplificar, esse controle contém apenas a biblioteca reutilizável. Não há razão para que ele também não pudesse fornecer funcionalidade.
- Crie o controle dependente: crie um componente que use a biblioteca definida no controle de biblioteca e adicione-o a uma forma de um aplicativo controlado por modelos para verificar se ele funciona.
- Carregar biblioteca dependente sob demanda: expanda o exemplo para fazer com que o componente dependente carregue o recurso de biblioteca sob demanda em vez de fazer com que a estrutura carregue a biblioteca quando o controle for carregado.
Pré-requisitos
Você já deve saber como:
- Criar e construir um componente de código
- Empacotar um componente de código
- Adicionar componentes de código a um aplicativo controlado por modelos
1. Criar o componente de biblioteca
Esse componente não fornece recursos por si só. É simplesmente um contêiner para a biblioteca.
A primeira etapa é criar um novo componente usando o comando pac pcf init:
pac pcf init -n StubLibrary -ns SampleNamespace -t field -npm
Definir a biblioteca
Você precisa de um novo arquivo de declaração (d.ts) para descrever os objetos e funções contidos em sua biblioteca. Crie um novo arquivo na pasta raiz do seu projeto chamado
myLib.d.ts:declare module 'myLib' { export function sayHello(): string; }Vamos expor nossa biblioteca como um módulo UMD e precisamos colocar a variável no escopo global. Para isso, precisamos de um novo arquivo de declaração (d.ts). Crie um novo arquivo na pasta raiz do seu projeto chamado
global.d.ts:/* eslint-disable no-var */ declare global { var myLib: typeof import('myLib'); } export { };Atualize tsconfig.json para permitir módulos UMD e código javascript da seguinte maneira:
Adicionar a biblioteca
Em sua nova pasta de controle, adicione uma nova pasta para conter suas bibliotecas libs para este exemplo, crie um novo arquivo JavaScript. Este exemplo usa uma biblioteca chamada myLib-v_0_0_1.js que tem uma única sayHello função.
// UMD module pattern
var myLib = (function (exports) {
"use strict";
function sayHello() {
return "Hello from myLib";
}
exports.sayHello = sayHello;
return exports;
})(/** @type {import('myLib')} */ ({}));
Adicionar dados de configuração
Adicione um arquivo nomeado
featureconfig.jsonna pasta raiz do projeto.Adicione o seguinte texto ao
featureconfig.jsonarquivo:{ "pcfAllowCustomWebpack": "on", "pcfAllowLibraryResources": "on" }Adicione um novo
webpack.config.jsarquivo na pasta raiz do projeto. Esses dados de configuração garantem que as bibliotecas não sejam agrupadas com a saída do controle. Não é necessário gerar um bundle, porque eles já são empacotados separadamente quando você compila o projeto./* eslint-disable */ "use strict"; module.exports = { externals: { "myLib": "myLib" }, }Adicione uma referência à biblioteca sob o
resourcesno manifesto de controle.
Adicionar a biblioteca à janela
A última etapa é editar o index.ts controle para associar a biblioteca à janela.
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
}
}
O projeto de biblioteca deve ter esta aparência:-
Compilar e empacotar o componente da biblioteca
Para concluir o componente de biblioteca, conclua as seguintes etapas como de costume:
- Criar e compilar o componente de código
- Empacotar o componente de código
- Implante o componente de código.
2. Criar o controle dependente
Agora que você tem um controle de biblioteca, precisa de um controle para depender dele.
Crie um novo componente usando este comando:
pac pcf init -n DependencyControl -ns SampleNamespace -t field -fw react -npmAdicione um novo arquivo de controle de recurso na pasta raiz do seu projeto chamada
featureconfig.jsoncontendo o seguinte texto:{ "pcfResourceDependency": "on" }Adicione o recurso dependente no manifesto de controle.
Use o
schemaNamedo controle dependente[solution prefix]_[namespace].[control name], que você pode encontrar no arquivosolution.xmldo componente dependente. O XML no arquivo solution.xml pode ter esta aparência:<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>
Adicionar Global.d.ts
Como o StubLibrary é exposto como um módulo UMD, precisamos colocar a variável no escopo global. Para isso, precisamos de um novo arquivo de declaração (d.ts). Crie um novo arquivo na pasta raiz do seu projeto chamado global.d.ts:
/* eslint-disable no-var */
interface MyLib {
sayHello(): string;
}
declare global {
var myLib: MyLib;
}
export { };
Usar a função de biblioteca
Atualize o arquivo de componente HelloWorld.tsx para que ele use uma função da biblioteca dependente. A biblioteca é carregada no objeto Window em tempo de execução.
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>
)
}
}
Compilar e empacotar o componente dependente
Para concluir o componente dependente, conclua as seguintes etapas como de costume:
- Criar e compilar o componente de código
- Empacote o componente de código
- Implante o componente de código.
Adicionar o componente a um formulário
Navegue até o formulário e você deverá ver o componente mostrar o texto
Hello from myLib from Dependency.
3. Carregar a biblioteca dependente quando necessário
Você pode expandir este exemplo alterando o componente dependente para carregar o recurso de biblioteca sob demanda em vez de fazer com que a estrutura carregue a biblioteca quando o componente for carregado. O comportamento de carga sob demanda será útil se as bibliotecas que estão sendo usadas pelo controle forem grandes e aumentarem o tempo de carga do formulário.
Especificar o comportamento de carga sob demanda
Para especificar o comportamento de carga sob demanda, modifique o manifesto de controle do componente criado em 2. Crie o controle dependente.
<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>
Modificar o componente dependente para carregar a biblioteca sob demanda
Modifique o HelloWorld.tsx para adicionar um estado e métodos para atualizá-lo quando a dependência for carregada.
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>
)
}
}
Atualizar index.ts
Quando o script é carregado sob demanda, você precisa fazer pequenos ajustes na forma como o componente é criado e inicializado. Por exemplo, novas variáveis para referências ao contexto e ao contêiner para atualizar o estado.
O mais importante é adicionar um getActions método para reagir ao On Load e solicitar que o controle dependente seja carregado.
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
}
}
Etapas finais
- Atualize o número da versão do controle em
ControlManifest.Input.xmle a versão emSolution.xml - Recompile, empacote, implante e publique a solução com o controle atualizado.
Verificar os resultados
Agora, quando a página é carregada, você vê a carga de controle com Loading... exibida.
Depois que a página carrega, o controle é atualizado para mostrar Hello from myLib Dependency On Demand Load.