Tous les produits
Search
Centre de documentation

Edge Security Acceleration:API HTMLStream

Dernière mise à jour :Aug 21, 2026

L'API HTMLStream permet de traiter les flux de données HTML directement sur les points de présence (POP), par exemple pour afficher des cours boursiers en temps réel ou des historiques de discussion. Elle transmet également les données HTML par fragments, ce qui accélère la transmission.

Contexte

Edge Routine convient parfaitement à de nombreux scénarios de développement frontend. Les POP envoient des données spécifiques, telles que les en-têtes User-Agent, les localisations géographiques et les adresses IP. Il peut donc s'avérer nécessaire de modifier le flux d'une page HTML en temps réel au niveau des POP. Traditionnellement, on utilise des expressions régulières pour créer un analyseur ad hoc chargé de modifier ce flux. Cette approche classique présente toutefois des risques d'erreur et ne prend pas en charge le traitement par flux. Les analyseurs JavaScript open source, tels que parse5 et htmlparser2, consomment beaucoup de mémoire et dégradent les performances du système. Pour résoudre ces problèmes, Edge Routine propose un analyseur compatible avec le traitement par flux sur les POP. Utilisez-le pour modifier le code et les pages HTML.

Remarque

Cet analyseur est intégré à Edge Routine et ne repose pas sur les standards web.

Exemple

  • Scénario

    Pour modifier toutes les balises d'ancrage <a/> d'une page HTML afin qu'elles pointent vers http://www.taobao.com, utilisez le code suivant dans Edge Routine.

  • Exemple de code

    async function handleRequest(request) {
      // 1. In this example, the HTML page that you want to modify is returned. 
      const response = await fetch("http://www.example.com");
      // 2. Configure the stream processing-based parser to manage HTML content. The parser supports multiple CSS selectors.
      // Specify the method for capturing the syntax and register a callback function for rewriting. 
      const htmlStream = new HTMLStream(
        response.body, // Specify the HTML flow that you want to modify.
        [[
          "a",         // The element selector. This specifies that all the anchor tags are selected. 
          {  
            // Register a callback function. The element callback function can be called in the anchor tags or in the element nodes of the Document Object Model (DOM) API. 
            // In the callback function, you can change the event object (e). 
            element: function(e) {
              // Modify the href attribute.
              e.setAttribute("href", "http://www.taobao.com");
            }
          }
        ]]);
      
      // 3. Return the modified request to the browser. HTMLStream is a readable stream.
      // You can use HTMLStream in all scenarios that support ReadableStream. 
      return new Response(htmlStream);
    }
    
                export default {
      async fetch(request) {
        return handleRequest(request);
      }
    };            
  • Analyse des résultats

    L'exemple de code ci-dessus illustre la modification en temps réel d'un flux HTML via l'API HTMLStream. La section suivante explique le fonctionnement de HTMLStream :

    • L'API Fetch récupère une expression de flux pour la requête. Toutefois, Edge Routine n'a pas nécessairement reçu le corps de la réponse depuis la couche réseau. Par conséquent, la fréquence du garbage collection provoquée par la mise en tampon des données est réduite.

    • HTMLStream constitue également un flux compatible avec l'opération TransformStream. Dès qu'il reçoit un flux, HTMLStream appelle la fonction de rappel de réécriture pour modifier la page HTML spécifiée en temps réel. Pour modifier une page HTML, obtenez son flux de données brut. Intégrez ensuite ce flux brut dans le flux HTML que vous avez créé, comme indiqué à l'étape 2 de l'exemple de code précédent.

      • Le premier paramètre de HTMLStream est un flux, qui représente le flux de données brut de la page HTML.

      • Le deuxième paramètre de HTMLStream est un tableau, qui représente un groupe de réécriveurs. Un réécriveur est un tableau contenant un sélecteur. Le sélecteur sert à spécifier le contenu HTML à modifier et à sélectionner un objet. Certaines propriétés de l'objet seront appelées en tant que fonctions de rappel. ["a" , {....}] dans l'exemple précédent déclare un réécriveur, soit un tableau dont l'élément est 2. La chaîne « a » dans l'exemple précédent représente le sélecteur d'élément utilisé pour localiser toutes les balises d'ancrage du document. L'objet dans l'exemple précédent spécifie l'objet de rappel. Si vous choisissez d'utiliser un sélecteur d'élément, l'objet peut contenir les fonctions de rappel suivantes :

        • La fonction de rappel element. Sa signature est function(e). Cette fonction de rappel est appelée lorsque les éléments sélectionnés par le sélecteur d'élément sont analysés.

        • La fonction de rappel comments. Sa signature est function(e). Cette fonction de rappel est appelée lorsque les commentaires imbriqués dans les éléments sont analysés.

        • La fonction de rappel text. Sa signature est function(e). Cette fonction de rappel est appelée lorsque le texte des éléments est analysé. Elle peut être appelée plusieurs fois. En raison du traitement par flux, HTMLStream peut traiter un fragment d'une chaîne.

    • Vous pouvez répondre directement via HTMLStream. Cependant, HTMLStream ne met pas les données en tampon. Contrairement à parse5 et htmlparser2, HTMLStream ne génère pas d'arborescence DOM, ce qui réduit considérablement le temps de traitement et la consommation de mémoire. Ainsi, HTMLStream offre un débit élevé et une forte concurrence lors de l'analyse du contenu HTML.

Réécriveur

Le réécriveur sert à enregistrer l'objet que vous souhaitez réécrire. Cet objet est un tableau composé de deux éléments.

  • Le premier élément du tableau doit être de type chaîne ou null.

    • Chaîne : spécifie un sélecteur d'élément utilisé pour localiser un élément ou une balise.

    • null : spécifie que le réécriveur s'applique à l'ensemble du document.

      Remarque

      En général, il n'est pas nécessaire d'appliquer le réécriveur à l'ensemble du document. Si le réécriveur s'applique à tout le document, il ne peut pas localiser d'éléments spécifiques.

  • Le deuxième élément du tableau doit être un objet JavaScript. Cet objet est renvoyé à la fonction de rappel que vous avez enregistrée.

    Si vous utilisez un sélecteur d'élément, cet objet est nommé fonction de rappel d'élément. Si vous utilisez un sélecteur de document, cet objet est nommé fonction de rappel de document.

Remarque

Vous pouvez spécifier un ou plusieurs réécriveurs pour une opération HTMLStream. Vous pouvez indiquer plusieurs sélecteurs d'élément, mais un seul sélecteur de document.

Syntaxe des sélecteurs d'élément

La syntaxe des sélecteurs d'élément est un sous-ensemble de la syntaxe des sélecteurs CSS. Le langage de programmation d'un sélecteur d'élément peut différer de celui d'un sélecteur CSS. La section suivante décrit la syntaxe des sélecteurs d'élément :

  • * : spécifie tous les éléments ou balises.

  • div : spécifie la balise nommée div. Vous pouvez spécifier d'autres noms de balises dans ce format. Les balises HTML et personnalisées sont prises en charge.

  • E#id : spécifie la balise nommée E. L'ID de la balise est spécifié par id.

  • E.Class : spécifie la balise nommée E. La classe de la balise est spécifiée par Class.

  • E[attr] : spécifie la balise nommée E. Les attributs de la balise incluent le nom attr.

  • Attributs des éléments :

    • E[attr="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr, défini sur a. La valeur respecte la casse.

    • E[attr^="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr, défini sur a. La valeur ne respecte pas la casse.

    • E[attr$="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr dont la valeur se termine par a.

    • E[attr^="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr dont la valeur commence par a.

    • E[attr*="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr dont la valeur contient a.

    • E[attr|="a"] : spécifie la balise nommée E. Les attributs de la balise incluent attr dont la valeur commence par a- et sont séparés par des virgules (,). Exemple : en-ch, en-us.

  • Ordre entre les éléments :

    • E F : spécifie la balise nommée F, qui existe dans l'élément parent nommé E.

    • E > F : spécifie la balise nommée F dont l'élément parent est la balise nommée E.

  • E:not(S) : spécifie l'élément nommé E. S est un autre sélecteur d'élément. L'élément E est sélectionné uniquement lorsque le sélecteur est défini sur false.

Fonctions de rappel pour les sélecteurs d'élément

Le tableau suivant décrit les fonctions de rappel prises en charge par les sélecteurs d'élément.

Fonction de rappel

Description

Signature de la fonction de rappel

element

Fonction de rappel non asynchrone appelée après l'analyse complète des éléments sélectionnés.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet Element. Pour plus d'informations, consultez Element.

comments

Fonction de rappel non asynchrone appelée lorsque les éléments sélectionnés contiennent des commentaires.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet Comments. Pour plus d'informations, consultez Comments.

text

Fonction de rappel non asynchrone appelée lorsque le texte renvoyé à la fonction de rappel est analysé.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet TextChunk. Pour plus d'informations, consultez TextChunk.

Remarque

Cette fonction de rappel peut être appelée plusieurs fois. Lorsque HTMLStream lit des fragments de texte à partir des données HTML brutes, cette fonction de rappel est appelée à chaque analyse d'un fragment. Pour afficher le texte complet, vous devez charger et fusionner tous les fragments de texte.

Remarque

Un sélecteur d'élément peut ignorer toutes les fonctions de rappel précédentes. Dans ce cas, les éléments concernés sont imprimés directement sans traitement. Si vous souhaitez modifier un fragment de texte spécifique, il suffit d'enregistrer la fonction de rappel requise.

Sélecteur de document

Un sélecteur de document sert à sélectionner un document spécifié. Pour utiliser un sélecteur de document, définissez le premier élément du tableau du réécriveur sur null. Dans l'opération HTMLStream, vous ne pouvez configurer qu'un seul sélecteur de document.

Fonctions de rappel pour les sélecteurs de document

Les fonctions de rappel pour les sélecteurs de document sont similaires à celles des sélecteurs d'élément. Le tableau suivant décrit les fonctions de rappel prises en charge par les sélecteurs de document.

Fonction de rappel

Description

Signature de la fonction de rappel

doctype

Fonction de rappel non asynchrone appelée lorsque la déclaration de type de document (DOCTYPE) du document spécifié est analysée.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet Doctype. Pour plus d'informations, consultez Doctype.

comments

Fonction de rappel non asynchrone appelée lorsque le document spécifié contient des commentaires.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet Comments. Pour plus d'informations, consultez Comments.

text

Fonction de rappel non asynchrone appelée lorsque le document spécifié contient des nœuds de texte.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet TextChunk. Pour plus d'informations, consultez TextChunk.

Remarque

Cette fonction de rappel peut être appelée plusieurs fois. Lorsque HTMLStream lit des fragments de texte à partir des données HTML brutes, cette fonction de rappel est appelée à chaque analyse d'un fragment. Pour afficher le texte complet, vous devez charger et fusionner tous les fragments de texte.

docend

Fonction de rappel non asynchrone appelée après l'analyse complète du document spécifié. Cette fonction de rappel ajoute du contenu, tel que des informations de débogage, à la fin du document HTML sous forme de commentaires. Vous pouvez utiliser ces informations pour le dépannage.

La signature de la fonction de rappel est function(e). Cette signature est portée par l'objet Docend. Pour plus d'informations, consultez Docend.

Gestion des erreurs

Edge Routine intercepte toutes les exceptions JavaScript levées par les fonctions de rappel précédentes. Parallèlement, HTMLStream arrête le traitement des flux HTML et propage l'exception aux couches externes.

  • Si la méthode reader.read est déclenchée en JavaScript, les exceptions sont à nouveau levées.

  • Si la méthode reader.read est appelée dans HTMLStream pendant l'exécution d'Edge Routine, Edge Routine masque les exceptions. Par exemple, si des exceptions surviennent lorsqu'Edge Routine renvoie une réponse à un client, la réponse est interrompue et le client ne reçoit qu'une partie de la réponse. Cela s'explique par le fait que HTMLStream traite les données sous forme de flux. Dans ce cas, le flux peut être interrompu avant que toutes les données ne soient renvoyées au client. La méthode utilisée par HTMLStream pour gérer les exceptions est similaire à celle de TransformStream. TransformStream écrit et lit également les données sous forme de flux.

Paramètres de rappel

Chaque fonction de rappel reçoit un objet représentant les balises HTML sélectionnées ou d'autres informations pertinentes. Cet objet est également appelé paramètre de rappel. Cette rubrique décrit les paramètres de rappel tels que Element, TextChunk et Comments.

Remarque
  • Tous les paramètres doivent être transmis aux fonctions de rappel. Si les méthodes ou attributs d'un paramètre sont invoqués en dehors d'une fonction de rappel, des exceptions JavaScript sont levées. Pour éviter ce problème, vous pouvez transmettre les paramètres souhaités à d'autres objets JavaScript ou structures de données.

  • L'option dans les méthodes décrites dans cette rubrique représente un objet. Vous pouvez définir l'attribut HTML de l'objet sur true ou false. La valeur true spécifie un contenu HTML, et false spécifie un contenu texte. Si vous définissez l'attribut HTML sur false, HTMLStream appelle la fonction html encoding/escaping.

Element

  • Définition

    Cet objet est renvoyé lorsque la fonction de rappel Element est appelée. Il représente les balises HTML sélectionnées.

  • Attributs

    • tagName(string) : spécifie le nom de la balise.

    • attributes(iterator) : renvoie un itérateur qui localise tous les attributs spécifiés au format [name, value].

    • removed(bool) : indique si l'élément doit être supprimé. Cet attribut est en lecture seule. Vous pouvez appeler la méthode remove() pour supprimer un élément. En général, vous devez configurer cet attribut pour ignorer les éléments déjà supprimés.

    • namespaceURI : l'URI de l'espace de noms d'un élément, par exemple l'élément SVG ou Script. Cet attribut est en lecture seule.

  • Méthodes

    • Modifier les attributs

      • getAttribute(name) : interroge le nom d'un attribut d'un élément spécifié.

      • setAttribute(name, value) : définit un nom d'attribut pour un élément spécifié et modifie le nom d'attribut d'un élément spécifié.

      • hasAttribute(name) : vérifie si un nom d'attribut existe dans un élément spécifié.

      • removeAttribute(name) : supprime un nom d'attribut d'un élément spécifié.

      Remarque

      Le nom et la valeur de l'attribut doivent être de type chaîne.

    • Modifier le contenu

      • before(data, option) : insère du contenu avant l'élément spécifié (balise d'élément).

      • after(data, option) : insère du contenu après l'élément spécifié (balise d'élément).

      • prepend(data, option) : insère du contenu avant le contenu de l'élément spécifié (après la balise ouvrante de l'élément). Exemple : <div>(prepend) |aaaa|(append)</div>.

      • append(data, option) : insère du contenu après le contenu de l'élément spécifié (avant la balise fermante de l'élément). Exemple : <div>(prepend) |aaaa|(append)</div>.

      • replace(data, option) : remplace l'élément entier, y compris les balises et les balises imbriquées.

      • setInnerContent(data, option) : spécifie le contenu de l'élément et conserve les balises et les attributs.

      • remove() : supprime l'élément spécifié. Après la suppression de l'élément, la valeur de l'attribut removed passe à true.

      • removeAndKeepContent() : supprime les balises et les attributs de l'élément spécifié et conserve le contenu.

TextChunk

  • Définition

    Cet objet est renvoyé lorsque la fonction de rappel Text est appelée. Il représente un fragment du texte HTML sélectionné.

  • Attributs

    • removed(bool) : indique si l'élément doit être supprimé. Cet attribut est en lecture seule. Vous pouvez appeler la méthode remove() pour supprimer un élément. En général, vous devez configurer cet attribut pour ignorer les éléments déjà supprimés.

    • text(string) : spécifie le contenu textuel. Cet attribut est en lecture seule. Le texte peut être un fragment. Si la chaîne est vide, cela indique que le dernier fragment de texte est renvoyé. Dans ce cas, vous pouvez fusionner tous les fragments de texte.

    • lastInTextNode(bool) : indique s'il s'agit du dernier fragment de texte. Cet attribut est en lecture seule. Si la valeur de cet attribut est true, l'attribut text renvoie une chaîne vide.

  • Méthodes

    Modifier le contenu

    • before(data, option) : insère du contenu avant l'élément spécifié (balise d'élément).

    • after(data, option) : insère du contenu après l'élément spécifié (balise d'élément).

    • replace(data, option) : remplace l'élément entier, y compris les balises et les balises imbriquées.

    • remove() : supprime l'élément spécifié. Après la suppression de l'élément, la valeur de l'attribut removed passe à true.

Comments

  • Définition

    Cet objet est renvoyé lorsque la fonction de rappel Comments est appelée. Il représente les commentaires du contenu HTML sélectionné.

  • Attributs

    • removed(bool) : indique si l'élément doit être supprimé. Cet attribut est en lecture seule. Vous pouvez appeler la méthode remove() pour supprimer un élément. En général, vous devez configurer cet attribut pour ignorer les éléments déjà supprimés.

    • text(string) : spécifie les commentaires existants ou les commentaires destinés à remplacer les existants. Cet attribut est en lecture et écriture.

  • Méthodes

    Modifier le contenu

    • before(data, option) : insère du contenu avant l'élément spécifié (balise d'élément).

    • after(data, option) : insère du contenu après l'élément spécifié (balise d'élément).

    • replace(data, option) : remplace l'élément entier, y compris les balises et les balises imbriquées.

    • remove() : supprime l'élément spécifié. Après la suppression de l'élément, la valeur de l'attribut removed passe à true.

Doctype

  • Définition

    Cet objet est renvoyé lorsque la fonction de rappel DOCTYPE est appelée. Il représente le DOCTYPE du contenu HTML sélectionné.

  • Attributs

    • name(string) : spécifie le nom du DOCTYPE. Cet attribut est en lecture seule.

    • publicId(string) : renvoie un identifiant public. Si aucun identifiant public n'existe, la valeur null est renvoyée. Cet attribut est en lecture seule.

    • systemId(string) : renvoie un identifiant système. Si aucun identifiant système n'existe, la valeur null est renvoyée. Cet attribut est en lecture seule.

Docend

  • Définition

    Cet objet est renvoyé lorsque la fonction de rappel Docend est appelée. Il représente la fin d'un document HTML.

  • Méthodes

    append(string, option) : ajoute du contenu à la fin du document HTML.