Verwenden von Fluid mit Teams
Am Ende dieses Tutorials können Sie jede Fluid-basierte Anwendung in Teams integrieren und in Echtzeit mit anderen zusammenarbeiten.
In diesem Abschnitt lernen Sie die folgenden Konzepte kennen:
- Integrieren sie einen Fluid-Client in die Teams-Registerkartenanwendung.
- Führen Sie Ihre Teams-Anwendung aus, und verbinden Sie sie mit einem Fluid-Dienst (Azure Fluid Relay).
- Erstellen Und abrufen Sie Fluidcontainer, und übergeben Sie sie an eine React Komponente.
Weitere Informationen zum Erstellen komplexer Anwendungen finden Sie unter FluidExamples.
Voraussetzungen
Für dieses Tutorial müssen Sie mit den folgenden Konzepten und Ressourcen vertraut sein:
- Übersicht über Fluid Framework
- Fluid Framework–Schnellstart
- Die Grundlagen von React und React Hooks
- Erstellen einer Microsoft Teams-Registerkarte
Erstellen des Projekts
Öffnen Sie eine Eingabeaufforderung, und navigieren Sie zu dem übergeordneten Ordner, in dem Sie das Projekt erstellen möchten,
/My Microsoft Teams Projects
z. B. .Erstellen Sie eine Teams-Registerkartenanwendung, indem Sie den folgenden Befehl ausführen und eine Kanalregisterkarte erstellen:
yo teams
Navigieren Sie nach dem Erstellen mit dem folgenden Befehl
cd <your project name>
zum Projekt.Das Projekt verwendet die folgenden Bibliotheken:
Bibliothek Beschreibung fluid-framework
Enthält den IFluidContainer und andere verteilte Datenstrukturen , die Daten clientübergreifend synchronisieren. @fluidframework/azure-client
Definiert das Startschema für den Fluid-Container. @fluidframework/test-client-utils
Definiert den , der InsecureTokenProvider
zum Erstellen der Verbindung mit einem Fluid-Dienst erforderlich ist.Führen Sie den folgenden Befehl aus, um die Bibliotheken zu installieren:
npm install @fluidframework/azure-client fluid-framework @fluidframework/test-client-utils
Programmieren des Projekts
Öffnen Sie die Datei
/src/client/<your tab name>
in Ihrem Code-Editor.Erstellen Sie als eine neue Datei,
Util.ts
und fügen Sie die folgenden Importanweisungen hinzu://`Util.ts import { IFluidContainer } from "fluid-framework"; import { AzureClient, AzureClientProps } from "@fluidframework/azure-client"; import { InsecureTokenProvider } from "@fluidframework/test-client-utils";
Definieren von Fluid-Funktionen und -Parametern
Diese App soll im Kontext von Microsoft Teams mit allen Fluid-bezogenen Importen, Initialisierungen und Funktionen verwendet werden. Dies bietet eine verbesserte Benutzererfahrung und erleichtert die Verwendung in Der Zukunft. Sie können den Importanweisungen den folgenden Code hinzufügen:
// TODO 1: Define the parameter key(s).
// TODO 2: Define container schema.
// TODO 3: Define connectionConfig (AzureClientProps).
// TODO 4: Create Azure client.
// TODO 5: Define create container function.
// TODO 6: Define get container function.
Hinweis
Die Kommentare definieren alle Funktionen und Konstanten, die für die Interaktion mit dem Fluid-Dienst und -Container erforderlich sind.
Ersetzen Sie
TODO 1:
durch den folgenden Code:export const containerIdQueryParamKey = "containerId";
Die Konstante wird exportiert, wenn sie in den
contentUrl
Microsoft Teams-Einstellungen an das angefügt wird, und später zum Analysieren der Container-ID auf der Inhaltsseite. Es ist ein gängiges Muster, wichtige Abfrageparameterschlüssel als Konstanten zu speichern, anstatt die unformatierte Zeichenfolge jedes Mal einzugeben.Bevor der Client Container erstellen kann, benötigt er eine
containerSchema
, die die freigegebenen Objekte definiert, die in dieser Anwendung verwendet werden. In diesem Beispiel wird eine SharedMap alsinitialObjects
verwendet, aber jedes freigegebene Objekt kann verwendet werden.Hinweis
ist
map
die ID desSharedMap
Objekts und muss innerhalb des Containers eindeutig sein wie alle anderen DDSes.Ersetzen Sie
TODO: 2
durch den folgenden Code:const containerSchema = { initialObjects: { map: SharedMap } };
Ersetzen Sie
TODO: 3
durch den folgenden Code:const connectionConfig : AzureClientProps = { connection: { type: "local", tokenProvider: new InsecureTokenProvider("foobar", { id: "user" }), endpoint: "http://localhost:7070" } };
Bevor der Client verwendet werden kann, benötigt er eine
AzureClientProps
, die den Verbindungstyp definiert, den der Client verwendet. DieconnectionConfig
-Eigenschaft ist erforderlich, um eine Verbindung mit dem Dienst herzustellen. Der lokale Modus des Azure-Clients wird verwendet. Um die Zusammenarbeit über alle Clients hinweg zu ermöglichen, ersetzen Sie sie durch Fluid Relay Service-Anmeldeinformationen. Weitere Informationen finden Sie unter Einrichten des Azure Fluid Relay-Diensts.Ersetzen Sie
TODO: 4
durch den folgenden Code:const client = new AzureClient(connectionConfig);
Ersetzen Sie
TODO: 5
durch den folgenden Code:export async function createContainer() : Promise<string> { const { container } = await client.createContainer(containerSchema); const containerId = await container.attach(); return containerId; };
Wenn Sie den Container auf der Konfigurationsseite erstellen und an die
contentUrl
Einstellung in Teams anfügen, müssen Sie die Container-ID nach dem Anfügen des Containers zurückgeben.Ersetzen Sie
TODO: 6
durch den folgenden Code:export async function getContainer(id : string) : Promise<IFluidContainer> { const { container } = await client.getContainer(id, containerSchema); return container; };
Wenn Sie den Fluid-Container abrufen, müssen Sie den Container zurückgeben, da Ihre Anwendung auf der Inhaltsseite mit dem Container und den darin enthaltenen DDS-Instanzen interagieren muss.
Erstellen eines Fluidcontainers auf der Konfigurationsseite
Öffnen Sie die Datei
src/client/<your tab name>/<your tab name>Config.tsx
in Ihrem Code-Editor.Der Standardmäßige Teams-Registerkartenanwendungsflow wechselt von der Konfiguration zur Inhaltsseite. Um die Zusammenarbeit zu ermöglichen, ist die Beibehaltung des Containers beim Laden auf die Inhaltsseite von entscheidender Bedeutung. Die beste Lösung zum Beibehalten des Containers besteht darin, die Container-ID als Abfrageparameter an und
contentUrl
websiteUrl
anzufügen, die URLs der Inhaltsseite. Die Schaltfläche "Speichern" auf der Teams-Konfigurationsseite ist das Gateway zwischen der Konfigurationsseite und der Inhaltsseite. Hier können Sie den Container erstellen und die Container-ID in den Einstellungen anfügen.Fügen Sie die folgende Importanweisung hinzu:
import { createContainer, containerIdQueryParamKey } from "./Util";
Ersetzen Sie die
onSaveHandler
-Methode durch den folgenden Code. Die einzigen hier hinzugefügten Zeilen sind das Aufrufen der zuvor inUtils.ts
definierten Create-Containermethode und das anschließende Anfügen der zurückgegebenen Container-ID an undcontentUrl
websiteUrl
als Abfrageparameter.const onSaveHandler = async (saveEvent: microsoftTeams.settings.SaveEvent) => { const host = "https://" + window.location.host; const containerId = await createContainer(); microsoftTeams.settings.setSettings({ contentUrl: host + "/<your tab name>/?" + containerIdQueryParamKey + "=" + containerId + "&name={loginHint}&tenant={tid}&group={groupId}&theme={theme}", websiteUrl: host + "/<your tab name>/?" + containerIdQueryParamKey + "=" + containerId + "&name={loginHint}&tenant={tid}&group={groupId}&theme={theme}", suggestedDisplayName: "<your tab name>", removeUrl: host + "/<your tab name>/remove.html?theme={theme}", entityId: entityId.current }); saveEvent.notifySuccess(); };
Stellen Sie sicher, dass Sie durch den Namen der Registerkarte aus Ihrem Projekt ersetzen
<your tab name>
.Warnung
Da die Inhaltsseiten-URL zum Speichern der Container-ID verwendet wird, wird dieser Datensatz entfernt, wenn die Registerkarte Teams gelöscht wird. Darüber hinaus kann jede Inhaltsseite nur eine Container-ID unterstützen.
Inhaltsseite umgestalten, um die Fluid-Anwendung widerzuspiegeln
Öffnen Sie die Datei
src/client/<your tab name>/<your tab name>.tsx
in Ihrem Code-Editor. Eine typische Fluid-basierte Anwendung besteht aus einer Ansicht und einer Fluid-Datenstruktur. Konzentrieren Sie sich auf das Abrufen/Laden des Fluid-Containers, und belassen Sie alle Fluid-bezogenen Interaktionen in einer React Komponente.Fügen Sie auf der Inhaltsseite die folgenden Importanweisungen hinzu:
import { IFluidContainer } from "fluid-framework"; import { getContainer, containerIdQueryParamKey } from "./Util";
Entfernen Sie den gesamten Code unterhalb der Importanweisungen auf der Inhaltsseite, und ersetzen Sie ihn durch Folgendes:
export const <your tab name> = () => { // TODO 1: Initialize Microsoft Teams. // TODO 2: Initialize inTeams boolean. // TODO 3: Define container as a React state. // TODO 4: Define a method that gets the Fluid container // TODO 5: Get Fluid container on content page startup. // TODO 6: Pass the container to the React component as argument. }
Stellen Sie sicher, dass Sie durch den Namen der Registerkarte ersetzen
<your tab name>
, den Sie für Ihr Projekt definieren.Ersetzen Sie
TODO 1
durch den folgenden Code:microsoftTeams.initialize();
Um die Inhaltsseite in Teams anzuzeigen, müssen Sie die Microsoft Teams JavaScript-Clientbibliothek einschließen und einen Aufruf einschließen, um sie nach dem Laden der Seite zu initialisieren.
Ersetzen Sie
TODO 2
durch den folgenden Code:const [{ inTeams }] = useTeams();
Da die Teams-Anwendung nur eine IFrame-Einschleusung einer Webseite ist, müssen Sie die
inTeams
boolesche Konstante initialisieren, um zu wissen, ob sich die Anwendung in Teams befindet oder nicht, und ob die Teams-Ressourcen, zcontentUrl
. B. , verfügbar sind.Ersetzen Sie
TODO 3
durch den folgenden Code:const [fluidContainer, setFluidContainer] = useState<IFluidContainer | undefined>(undefined);
Verwenden Sie einen React Zustand für den Container, da er die Möglichkeit bietet, den Container und die darin enthaltenen Datenobjekte dynamisch zu aktualisieren.
Ersetzen Sie
TODO 4
durch den folgenden Code:const getFluidContainer = async (url : URLSearchParams) => { const containerId = url.get(containerIdQueryParamKey); if (!containerId) { throw Error("containerId not found in the URL"); } const container = await getContainer(containerId); setFluidContainer(container); };
Analysieren Sie die URL, um die durch
containerIdQueryParamKey
definierte Abfrageparameterzeichenfolge abzurufen, und rufen Sie die Container-ID ab. Mit der Container-ID können Sie den Container laden. Sobald Sie den Container haben, legen Sie denfluidContainer
React Status fest. Weitere Informationen finden Sie im vorherigen Schritt.Ersetzen Sie
TODO 5
durch den folgenden Code:useEffect(() => { if (inTeams === true) { microsoftTeams.settings.getSettings(async (instanceSettings) => { const url = new URL(instanceSettings.contentUrl); getFluidContainer(url.searchParams); }); microsoftTeams.appInitialization.notifySuccess(); } }, [inTeams]);
Nachdem Sie definiert haben, wie der Fluid-Container abgerufen werden soll, müssen Sie React anweisen, beim Laden aufzurufen
getFluidContainer
, und dann das Ergebnis im Zustand speichern, je nachdem, ob sich die Anwendung in Teams befindet. React useState-Hook stellt den erforderlichen Speicher bereit, und useEffect ermöglicht es Ihnen, beim Rendern aufzurufengetFluidContainer
und den zurückgegebenen Wert ansetFluidContainer
zu übergeben.Durch Hinzufügen
inTeams
des Abhängigkeitsarrays am Ende vonuseEffect
stellt die App sicher, dass diese Funktion nur beim Laden der Inhaltsseite aufgerufen wird.Ersetzen Sie
TODO 6
durch den folgenden Code:if (inTeams === false) { return ( <div>This application only works in the context of Microsoft Teams</div> ); } if (fluidContainer !== undefined) { return ( <FluidComponent fluidContainer={fluidContainer} /> ); } return ( <div>Loading FluidComponent...</div> );
Hinweis
Es ist wichtig, sicherzustellen, dass die Inhaltsseite in Teams geladen wird und dass der Fluid-Container definiert ist, bevor Sie ihn an die React-Komponente übergeben (definiert als
FluidComponent
, siehe unten).
Erstellen React Komponente für fluide Ansicht und Daten
Sie haben den grundlegenden Erstellungsflow von Teams und Fluid integriert. Sie können jetzt eine eigene React Komponente erstellen, die die Interaktionen zwischen der Anwendungsansicht und Fluid-Daten verarbeitet. Ab jetzt verhalten sich die Logik und der Fluss genau wie andere fluidbetriebene Anwendungen. Nachdem die grundlegende Struktur eingerichtet wurde, können Sie jedes der Fluid-Beispiele als Teams-Anwendung erstellen, indem Sie die ContainerSchema
Interaktion der Anwendungsansicht und mit den DDS-Objekten/Datenobjekten auf der Inhaltsseite ändern.
Starten sie den Fluid-Server, und führen Sie die Anwendung aus.
Wenn Sie Ihre Teams-Anwendung lokal im lokalen Azure-Clientmodus ausführen, stellen Sie sicher, dass Sie den folgenden Befehl an der Eingabeaufforderung ausführen, um den Fluid-Dienst zu starten:
npx @fluidframework/azure-local-service@latest
Um die Teams-Anwendung auszuführen und zu starten, öffnen Sie ein weiteres Terminal, und befolgen Sie die Anweisungen zum Ausführen des Anwendungsservers.
Warnung
HostNames mit ngrok
kostenlosen Tunneln von werden nicht beibehalten. Jede Ausführung generiert eine andere URL. Wenn ein neuer ngrok
Tunnel erstellt wird, kann nicht mehr auf den älteren Container zugegriffen werden. Informationen zu Produktionsszenarien finden Sie unter Verwenden von AzureClient mit Azure Fluid Relay.
Hinweis
Installieren Sie eine zusätzliche Abhängigkeit, um diese Demo mit Webpack 5 kompatibel zu machen. Wenn sie einen Kompilierungsfehler im Zusammenhang mit einem Pufferpaket erhalten, führen Sie aus npm install -D buffer
, und versuchen Sie es erneut. Dies wird in einer zukünftigen Version von Fluid Framework behoben.
Nächste Schritte
Verwenden von AzureClient mit Azure Fluid Relay
Da es sich um eine Teams-Registerkartenanwendung handelt, stehen Zusammenarbeit und Interaktion im Standard Fokus. Ersetzen Sie den zuvor bereitgestellten lokalen Modus AzureClientProps
durch nicht lokale Anmeldeinformationen aus Ihrem Azure-Dienst instance, damit andere Benutzer in der Anwendung teilnehmen und mit Ihnen interagieren können. Erfahren Sie , wie Sie Ihren Azure Fluid Relay-Dienst bereitstellen.
Wichtig
Es ist wichtig, die Anmeldeinformationen, an die Sie übergeben AzureClientProps
, vor einem versehentlichen Commit an die Quellcodeverwaltung auszublenden. Das Teams-Projekt enthält eine .env
Datei, in der Sie Ihre Anmeldeinformationen als Umgebungsvariablen speichern können, und die Datei selbst ist bereits im .gitignore
enthalten. Informationen zur Verwendung der Umgebungsvariablen in Teams finden Sie unter Festlegen und Abrufen von Umgebungsvariablen.
Warnung
InsecureTokenProvider
ist eine bequeme Möglichkeit, die Anwendung lokal zu testen. Es liegt in Ihrer Verantwortung, alle Benutzerauthentifizierungen zu verarbeiten und ein sicheres Token für jede Produktionsumgebung zu verwenden.
Festlegen und Abrufen der Umgebungsvariablen
Um eine Umgebungsvariable festzulegen und in Teams abzurufen, können Sie die integrierte .env
Datei nutzen. Der folgende Code wird verwendet, um die Umgebungsvariable in .env
festzulegen:
# .env
TENANT_KEY=foobar
Um den Inhalt der .env
Datei an unsere clientseitige App zu übergeben, müssen Sie sie webpack.config.js
in so konfigurieren, dass webpack
sie zur Laufzeit darauf zugreifen können. Verwenden Sie den folgenden Code, um die Umgebungsvariable aus .env
hinzuzufügen:
// webpack,config.js
webpack.EnvironmentPlugin({
PUBLIC_HOSTNAME: undefined,
TAB_APP_ID: null,
TAB_APP_URI: null,
REACT_APP_TENANT_KEY: JSON.stringify(process.env.TENANT_KEY) // Add environment variable here
}),
Sie können in auf die Umgebungsvariable zugreifen. Util.ts
// Util.ts
tokenProvider: new InsecureTokenProvider(JSON.parse(process.env.REACT_APP_TENANT_KEY!), { id: "user" }),
Tipp
Wenn Sie Änderungen am Code vornehmen, wird das Projekt automatisch neu erstellt, und der Anwendungsserver wird neu geladen. Wenn Sie jedoch Änderungen am Containerschema vornehmen, werden diese nur wirksam, wenn Sie den Anwendungsserver schließen und neu starten. Wechseln Sie dazu zur Eingabeaufforderung, und drücken Sie zweimal STRG+C. Führen Sie dann oder gulp ngrok-serve
erneut ausgulp serve
.