Exemples de code React et JavaScript pour le framework d'extension

Cette page fournit des exemples de code écrits en React et JavaScript pour des fonctions courantes que vous pouvez utiliser dans vos extensions.

Utiliser le SDK de l'extension Looker

Les extensions doivent établir une connexion avec l'hôte Looker. Dans React, cela se fait en encapsulant l'extension dans un composant ExtensionProvider40. Ce composant établit une connexion avec l'hôte Looker, et met le SDK de l'extension Looker et le SDK Looker à la disposition de l'extension.

import React from 'react'
import { ExtensionProvider40 } from '@looker/extension-sdk-react'
import { DemoCoreSDK } from './DemoCoreSDK'


export const App = () => {
 return (
   <ExtensionProvider40 chattyTimeout={-1}>
     <DemoCoreSDK />
   </ExtensionProvider40>
 )
}

Présentation des fournisseurs d'extensions

Les fournisseurs d'extensions exposent le SDK de l'extension Looker et l'API du SDK aux extensions. Différentes versions du fournisseur de l'extension ont été créées depuis la création du framework d'extension. Cette section présente l'historique des fournisseurs d'extensions et explique pourquoi ExtensionProvider40 est le fournisseur recommandé.

Le premier fournisseur d'extension était ExtensionProvider, qui présentait les versions 3.1 et 4.0 des SDK Looker. L'inconvénient était que le fait d'inclure les deux SDK augmentait la taille du bundle de production final.

ExtensionProvider2 a ensuite été créé. Cela a été créé, car il n'était pas logique qu'une extension utilise les deux SDK et oblige le développeur à choisir l'un ou l'autre. Malheureusement, les deux SDK ont tout de même été inclus dans la taille du bundle de production final.

Lorsque le SDK 4.0 est passé à GA, ExtensionProvider40 a été créé. L'avantage de ExtensionProvider40 est que le développeur n'a pas à choisir quel SDK utiliser, car le SDK 4.0 est la seule version disponible. Étant donné que le SDK 3.1 n'est pas inclus dans le bundle final, vous avez l'avantage de réduire sa taille.

Pour ajouter des fonctions à partir du SDK de l'extension Looker, vous devez d'abord obtenir une référence au SDK, ce qui peut être effectué auprès du fournisseur ou globalement. Vous pouvez ensuite appeler des fonctions SDK comme vous le feriez dans n'importe quelle application JavaScript.

  • Pour accéder au SDK du fournisseur, procédez comme suit:
  import { ExtensionContext40 } from '@looker/extension-sdk-react'

  export const Comp1 = () => {
    const extensionContext = useContext(
      ExtensionContext40
    )
    const { extensionSDK, coreSDK } = extensionContext
  • Pour accéder au SDK de manière globale (l'extension doit être initialisée avant que cela ne soit appelé), procédez comme suit:
    const coreSDK = getCoreSDK()

Vous pouvez maintenant utiliser le SDK comme vous le feriez dans n'importe quelle application JavaScript:

  const GetLooks = async () => {
    try {
      const looks = await sdk.ok(sdk.all_looks('id'))
      // process looks
      . . .
    } catch (error) {
      // do error handling
      . . .
    }
}

Étant donné que l'extension s'exécute dans un iFrame en bac à sable, vous ne pouvez pas naviguer ailleurs dans l'instance Looker en mettant à jour l'objet window.location du parent. Il est possible de naviguer à l'aide du SDK de l'extension Looker.

Cette fonction nécessite le droit navigation.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

  extensionSDK.updateLocation('/browse')

Ouverture d'une nouvelle fenêtre de navigateur

Étant donné que l'extension s'exécute dans un iFrame en bac à sable, vous ne pouvez pas utiliser la fenêtre parent pour ouvrir une nouvelle fenêtre de navigateur. Vous pouvez ouvrir une fenêtre de navigateur à l'aide du SDK de l'extension Looker.

Cette fonction nécessite soit le droit d'accès new_window pour ouvrir une nouvelle fenêtre vers un emplacement de l'instance Looker actuelle, soit le droit d'accès new_window_external_urls pour ouvrir une nouvelle fenêtre s'exécutant sur un hôte différent.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .
  extensionSDK.openBrowserWindow('/browse', '_blank')
. . .
  extensionSDK.openBrowserWindow('https://docs.looker.com/reference/manifest-params/application#entitlements', '_blank')

Routage et liens profonds

Ce qui suit s'applique aux extensions basées sur React.

Les composants ExtensionProvider, ExtensionProvider2 et ExtensionProvider40 créent automatiquement un routeur React appelé MemoryRouter à utiliser. N'essayez pas de créer un BrowserRouter, car cela ne fonctionne pas dans les iFrames en bac à sable. N'essayez pas de créer un HashRouter, car il ne fonctionne pas dans des iFrames en bac à sable pour la version du navigateur Microsoft Edge qui n'est pas basée sur Chromium.

Si vous utilisez MemoryRouter et react-router dans votre extension, le framework de l'extension synchronisera automatiquement le routeur de votre extension avec le routeur hôte Looker. Cela signifie que l'extension sera informée des clics sur les boutons "Précédent" et "Suivant" du navigateur, ainsi que l'itinéraire actuel lorsque la page sera actualisée. Cela signifie également que l'extension doit automatiquement accepter les liens profonds. Consultez les exemples d'extension pour savoir comment utiliser react-router.

Données de contexte de l'extension

Les données de contexte du framework des extensions ne doivent pas être confondues avec les contextes React.

Les extensions peuvent partager des données contextuelles entre tous les utilisateurs d'une extension. Les données de contexte peuvent être utilisées pour les données qui ne changent pas souvent et qui n'ont pas d'exigences de sécurité particulières. Il convient d'être prudent lors de l'écriture des données, car il n'y a pas de verrouillage des données et la dernière écriture l'emporte. Les données de contexte sont disponibles pour l'extension dès le démarrage. Le SDK de l'extension Looker fournit des fonctions permettant de mettre à jour et d'actualiser les données de contexte.

La taille maximale des données de contexte est d'environ 16 Mo. Les données de contexte sont sérialisées dans une chaîne JSON. Vous devez donc également en tenir compte si vous utilisez des données de contexte pour votre extension.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

  // Get loaded context data. This will reflect any updates that have
  // been made by saveContextData.
  let context = await extensionSDK.getContextData()

. . .

  // Save context data to Looker server.
  context = await extensionSDK.saveContextData(context)

. . .

  // Refresh context data from Looker server.
  context = await extensionSDK.refreshContextData()

Attributs utilisateur

Le SDK d'extension Looker fournit une API permettant d'accéder aux attributs utilisateur de Looker. Il existe deux types d'accès aux attributs utilisateur:

  • Champ d'application : associé à l'extension. Un attribut utilisateur limité est associé à un espace de noms avec l'extension. Il doit être défini dans l'instance Looker avant de pouvoir être utilisé. Pour ajouter un espace de noms à un attribut utilisateur, ajoutez le nom de l'extension en tant que préfixe du nom de l'attribut. Les tirets et les caractères "::" du nom de l'extension doivent être remplacés par un trait de soulignement, car les tirets et les deux-points ne peuvent pas être utilisés dans les noms d'attributs utilisateur.

    Par exemple, un attribut utilisateur limité nommé my_value, utilisé avec un ID d'extension de my-extension::my-extension, doit avoir le nom d'attribut utilisateur my_extension_my_extension_my_value. Une fois défini, l'attribut utilisateur peut être lu et mis à jour par l'extension.

  • Global : il s'agit des attributs utilisateur globaux et en lecture seule. C'est le cas, par exemple, de l'attribut utilisateur locale.

Voici une liste d'appels d'API pour les attributs utilisateur:

  • userAttributeGetItem : lit un attribut utilisateur Une valeur par défaut peut être définie. Elle sera utilisée si aucune valeur d'attribut utilisateur n'existe pour l'utilisateur.
  • userAttributeSetItem : enregistre un attribut utilisateur pour l'utilisateur actuel. Échec pour les attributs utilisateur globaux. Seul l'utilisateur actuel peut voir la valeur enregistrée.
  • userAttributeResetItem : rétablit la valeur par défaut d'un attribut utilisateur pour l'utilisateur actuel. Échec pour les attributs utilisateur globaux.

Pour accéder aux attributs utilisateur, vous devez spécifier leur nom dans les droits d'accès global_user_attributes et/ou scoped_user_attributes. Par exemple, dans le fichier manifeste du projet LookML, ajoutez ce qui suit:

  entitlements: {
    scoped_user_attributes: ["my_value"]
    global_user_attributes: ["locale"]
  }
import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

  // Read global user attribute
  const locale = await extensionSDK.userAttributeGetItem('locale')

  // Read scoped user attribute
  const value = await extensionSDK.userAttributeGetItem('my_value')

  // Update scoped user attribute
  const value = await extensionSDK.userAttributeSetItem('my_value', 'abcd1234')

  // Reset scoped user attribute
  const value = await extensionSDK.userAttributeResetItem('my_value')

Stockage en local

Les iFrames en bac à sable ne permettent pas d'accéder au stockage local du navigateur. Le SDK de l'extension Looker permet à une extension de lire et d'écrire dans l'espace de stockage local de la fenêtre parente. Le stockage local est associé à un espace de noms de l'extension, ce qui signifie qu'il ne peut pas lire l'espace de stockage local créé par la fenêtre parente ou d'autres extensions.

L'utilisation du stockage local nécessite le droit d'accès local_storage.

L'API d'extension localhost est asynchrone par rapport à l'API de stockage local de navigateur synchrone.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

  // Read from local storage
  const value = await extensionSDK.localStorageGetItem('my_storage')

  // Write to local storage
  await extensionSDK.localStorageSetItem('my_storage', 'abcedefh')

  // Delete item from local storage
  await extensionSDK.localStorageRemoveItem('my_storage')

Modifier le titre de la page

Les extensions peuvent mettre à jour le titre actuel de la page. Il n'est pas nécessaire de disposer de droits d'accès pour effectuer cette action.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

  extensionSDK.updateTitle('My Extension Title')

Écriture dans le presse-papiers du système

Les iFrames en bac à sable ne permettent pas d'accéder au presse-papiers du système. Le SDK de l'extension Looker permet à une extension d'écrire du texte dans le presse-papiers du système. Pour des raisons de sécurité, l'extension n'est pas autorisée à lire des données depuis le presse-papiers du système.

Pour écrire dans le presse-papiers du système, vous devez disposer des droits d'accès use_clipboard.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

    // Write to system clipboard
    try {
      await extensionSDK.clipboardWrite(
        'My interesting information'
      )
      . . .
    } catch (error) {
      . . .
    }

Incorporation de tableaux de bord, de présentations et d'explorations

Le framework d'extension prend en charge l'incorporation de tableaux de bord, de Looks et d'explorations.

Le droit use_embeds est requis. Nous vous recommandons d'utiliser le SDK d'intégration JavaScript Looker pour intégrer du contenu. Pour en savoir plus, consultez la documentation du SDK Embed.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

  const canceller = (event: any) => {
    return { cancel: !event.modal }
  }

  const updateRunButton = (running: boolean) => {
    setRunning(running)
  }

  const setupDashboard = (dashboard: LookerEmbedDashboard) => {
    setDashboard(dashboard)
  }

  const embedCtrRef = useCallback(
    (el) => {
      const hostUrl = extensionContext?.extensionSDK?.lookerHostData?.hostUrl
      if (el && hostUrl) {
        el.innerHTML = ''
        LookerEmbedSDK.init(hostUrl)
        const db = LookerEmbedSDK.createDashboardWithId(id as number)
          .withNext()
          .appendTo(el)
          .on('dashboard:loaded', updateRunButton.bind(null, false))
          .on('dashboard:run:start', updateRunButton.bind(null, true))
          .on('dashboard:run:complete', updateRunButton.bind(null, false))
          .on('drillmenu:click', canceller)
          .on('drillmodal:explore', canceller)
          .on('dashboard:tile:explore', canceller)
          .on('dashboard:tile:view', canceller)
          .build()
          .connect()
          .then(setupDashboard)
          .catch((error: Error) => {
            console.error('Connection error', error)
          })
      }
    },
    []
  )

  return (&#60;EmbedContainer ref={embedCtrRef} /&#62;)

Les exemples d'extension utilisent des composants stylisés pour appliquer un style simple à l'iFrame généré. Exemple :

import styled from "styled-components"

export const EmbedContainer = styled.div`
  width: 100%;
  height: 95vh;
  & > iframe {
    width: 100%;
    height: 100%;
  }

Accéder aux points de terminaison d'API externes

Le framework d'extension fournit deux méthodes pour accéder aux points de terminaison d'API externes:

  • Proxy du serveur : accède au point de terminaison via le serveur Looker. Ce mécanisme permet au serveur Looker de définir en toute sécurité des ID client et des clés secrètes.
  • Proxy de récupération : accède au point de terminaison depuis le navigateur de l'utilisateur. Le proxy est l'interface utilisateur de Looker.

Dans les deux cas, vous devez spécifier le point de terminaison externe de l'API dans les droits d'accès external_api_urls de l'extension.

Proxy de serveur

L'exemple suivant illustre l'utilisation du proxy serveur pour obtenir un jeton d'accès à utiliser par le proxy de récupération. L'ID client et le code secret doivent être définis en tant qu'attributs utilisateur pour l'extension. Généralement, lorsque l'attribut utilisateur est configuré, la valeur par défaut est définie sur l'ID ou le code secret du client.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .
  const requestBody = {
    client_id: extensionSDK.createSecretKeyTag('my_client_id'),
    client_secret: extensionSDK.createSecretKeyTag('my_client_secret'),
  },
  try {
    const response = await extensionSDK.serverProxy(
      'https://myaccesstokenserver.com/access_token',
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(requestBody),
      }
    )
    const { access_token, expiry_date } = response.body
. . .
  } catch (error) {
    // Error handling
    . . .
  }

Le nom de l'attribut utilisateur doit être mis en correspondance avec l'extension. Les tirets doivent être remplacés par des traits de soulignement, et les caractères :: par un seul trait de soulignement.

Par exemple, si le nom de votre extension est my-extension::my-extension, les attributs utilisateur à définir pour l'exemple précédent seraient les suivants:

my_extension_my_extension_my_client_id
my_extension_my_extension_'my_client_secret'

Récupérer le proxy

L'exemple suivant illustre l'utilisation du proxy de récupération. Elle utilise le jeton d'accès de l'exemple de proxy de serveur précédent.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

  try {
    const response = await extensionSDK.fetchProxy(
      'https://myaccesstokenserver.com/myendpoint',
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Authorization: `Bearer ${accessToken}`,
        },
        body: JSON.stringify({
          some_value: someValue,
          another_value: anotherValue,
        }),
      }
    )
    // Handle success

. . .

  } catch (error) {
    // Handle failure

. . .

  }

Intégration OAuth

Le framework d'extension permet l'intégration avec des fournisseurs OAuth. OAuth peut être utilisé pour obtenir un jeton d'accès permettant d'accéder à une ressource particulière, par exemple un document Google Sheets.

Vous devez spécifier le point de terminaison du serveur OAuth dans les droits d'accès extension oauth2_urls. Vous devrez peut-être également spécifier des URL supplémentaires dans les droits d'accès external_api_urls.

Les frameworks d'extension sont compatibles avec les flux suivants:

  • Flux implicite
  • Type d'attribution du code d'autorisation avec une clé secrète
  • Test et vérificateur de code PKCE

En général, une fenêtre enfant s'ouvre et charge une page de serveur OAuth. Le serveur OAuth authentifie l'utilisateur et le redirige vers le serveur Looker avec des informations supplémentaires qui peuvent être utilisées pour obtenir un jeton d'accès.

Flux implicite:

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

    const response = await extensionSDK.oauth2Authenticate(
      'https://accounts.google.com/o/oauth2/v2/auth',
      {
        client_id: GOOGLE_CLIENT_ID!,
        scope: GOOGLE_SCOPES,
        response_type: 'token',
      }
    )
    const { access_token, expires_in } = response

Type d'attribution du code d'autorisation avec clé secrète:

  const authenticateParameters: Record&#60;string, string&#62; = {
    client_id: GITHUB_CLIENT_ID!,
    response_type: 'code',
  }
  const response = await extensionSDK.oauth2Authenticate(
    'https://github.com/login/oauth/authorize',
    authenticateParameters,
   'GET'
  )
  const exchangeParameters: Record&#60;string, string&#62; = {
    client_id: GITHUB_CLIENT_ID!,
    code: response.code,
    client_secret: extensionSDK.createSecretKeyTag('github_secret_key'),
  }
  const codeExchangeResponse = await extensionSDK.oauth2ExchangeCodeForToken(
    'https://github.com/login/oauth/access_token',
    exchangeParameters
  )
  const { access_token, error_description } = codeExchangeResponse

Test et vérificateur de code PKCE:

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .

  const authRequest: Record&#60;string, string&#62; = {
    client_id: AUTH0_CLIENT_ID!,
    response_type: 'code',
    scope: AUTH0_SCOPES,
    code_challenge_method:  'S256',
  }
  const response = await extensionSDK.oauth2Authenticate(
    'https://sampleoauthserver.com/authorize',
    authRequest,
    'GET'
  )
  const exchangeRequest: Record&#60;string, string&#62; = {
    grant_type: 'authorization_code',
    client_id: AUTH0_CLIENT_ID!,
    code: response.code,
  }
  const codeExchangeResponse = await extensionSDK.oauth2ExchangeCodeForToken(
    'https://sampleoauthserver.com/login/oauth/token',
    exchangeRequest
  )
  const { access_token, expires_in } = codeExchangeResponse

Spartiate

Spartan désigne une méthode d'utilisation de l'instance Looker en tant qu'environnement pour exposer des extensions (et seulement des extensions) à un ensemble désigné d'utilisateurs. Un utilisateur spartiate qui accède à une instance Looker se verra présenter le flux de connexion configuré par l'administrateur Looker. Une fois l'utilisateur authentifié, une extension est présentée à l'utilisateur en fonction de son attribut utilisateur landing_page, comme illustré ci-dessous. L'utilisateur peut uniquement accéder aux extensions ; il ne peut accéder à aucune autre partie de Looker. Si l'utilisateur a accès à plusieurs extensions, les extensions contrôlent sa capacité à accéder aux autres extensions à l'aide de extensionSDK.updateLocation. Il existe une méthode spécifique du SDK d'extension Looker pour permettre à l'utilisateur de se déconnecter de l'instance Looker.

import { ExtensionContext40 } from '@looker/extension-sdk-react'

. . .

  const extensionContext = useContext(
    ExtensionContext40
  )
  const { extensionSDK } = extensionContext

. . .
  // Navigate to another extension
  extensionSDK.updateLocation('/spartan/another::extension')

. . .
  // Logout
  extensionSDK.spartanLogout()

Définir des utilisateurs spartiates

Pour définir un utilisateur spartiate, vous devez créer un groupe appelé "Extensions uniquement".

Une fois le groupe "Extensions uniquement" créé, accédez à la page Attributs utilisateur dans la section Administration de Looker, puis modifiez l'attribut utilisateur landing_page. Sélectionnez l'onglet Valeurs du groupe et ajoutez le groupe "Extensions uniquement". La valeur doit être définie sur /spartan/my_extension::my_extension/, où my_extension::my_extension correspond à l'ID de votre extension. Désormais, lorsque cet utilisateur se connecte, il est redirigé vers l'extension désignée.

Division du code

Le fractionnement du code est une technique qui permet de demander du code uniquement lorsqu'il est nécessaire. En règle générale, les blocs de code sont associés à des routes React où chaque route reçoit son propre bloc de code. Dans React, cette opération s'effectue à l'aide des composants Suspense et React.lazy. Le composant Suspense affiche un composant de remplacement pendant le chargement du bloc de code. React.lazy est responsable du chargement du bloc de code.

Configurer la répartition du code:

import { AsyncComp1 as Comp1 } from './Comp1.async'
import { AsyncComp1 as Comp2 } from './Comp2.async'

. . .

                <Suspense fallback={<div>Loading...</div>}>
                  <Switch>
                      <Route path="/comp1">
                        <Comp1 />
                      </Route>
                      <Route path="/comp2">
                        <Comp2 />
                      </Route>
                  </Switch>
                <Suspense>

Le composant à chargement différé est implémenté comme suit:

import { lazy } from 'react'

const Comp1 = lazy(
 async () => import(/* webpackChunkName: "comp1" */ './Comp1')
)

export const AsyncComp1 = () => &#60;Home />

Le composant est implémenté comme suit. Le composant doit être exporté en tant que composant par défaut:

const Comp1 = () => {
  return (
    &#60;div&#62;Hello World&#60;/div&#62;
  )
}

export default Comp1

Tremblements d'arbre

Bien que les SDK Looker prennent actuellement en charge le tree shaking, cette fonction doit encore être améliorée. Nous modifions continuellement nos SDK pour améliorer la compatibilité avec le tree shaking. Certaines de ces modifications peuvent nécessiter la refactorisation de votre code pour en tirer parti. Toutefois, lorsque cela est nécessaire, cela sera documenté dans les notes de version.

Pour utiliser le tree shaking, le module que vous utilisez doit être exporté en tant qu'esmodule et les fonctions que vous importez doivent être exemptes d'effets secondaires. Le SDK Looker pour TypeScript/JavaScript, la bibliothèque d'environnements d'exécution du SDK Looker, les composants d'UI Looker, le SDK Looker Extension et le SDK Extension pour React répondent tous à ces exigences.

Dans une extension, utilisez le SDK Looker 4.0, ainsi que le composant ExtensionProvider2 ou ExtensionProvider40 de l'extension SDK pour React.

Le code suivant configure le fournisseur de l'extension. Vous devez indiquer au fournisseur le SDK souhaité:

import { MyExtension } from './MyExtension'
import { ExtensionProvider40 } from '@looker/extension-sdk-react'
import { Looker40SDK } from '@looker/sdk/lib/4.0/methods'
import { hot } from 'react-hot-loader/root'

export const App = hot(() => {

  return (
    &#60;ExtensionProvider2 type={Looker40SDK}&#62;
      &#60;MyExtension /&#62;
    &#60;/ExtensionProvider2&#62;
  )
})

N'utilisez pas le style d'importation suivant dans votre extension:

import * as lookerComponents from `@looker/components`

L'exemple précédent reprend tous les éléments du module. Importez uniquement les composants dont vous avez réellement besoin. Exemple :

import { Paragraph }  from `@looker/components`

Glossaire

  • Fractionnement du code : technique de chargement différé de JavaScript jusqu'à ce qu'il soit réellement nécessaire. Dans l'idéal, le bundle JavaScript chargé initialement doit être le plus petit possible. Pour ce faire, vous pouvez utiliser le fractionnement du code. Les fonctionnalités qui ne sont pas immédiatement requises ne sont chargées que lorsqu'elles sont réellement nécessaires.
  • IDE : environnement de développement intégré Éditeur permettant de créer et de modifier une extension. Exemples : Visual Studio Code, Intellij et WebStorm.
  • Scène : généralement une page vue dans Looker. Les scènes correspondent aux principaux itinéraires. Parfois, une scène contient des scènes enfants correspondant à des sous-itinéraires de l'itinéraire principal.
  • Transpile : processus consistant à transformer un code source écrit dans un langage dans un autre langage ayant un niveau d'abstraction similaire. Par exemple, TypeScript en JavaScript.