亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Maison interface Web js tutoriel Laisser le pipeline visible pour surveiller le déploiement du blog

Laisser le pipeline visible pour surveiller le déploiement du blog

Jan 14, 2025 pm 02:29 PM

Une des choses qui me dérange chez Computaria c'est de ne pas pouvoir suivre le déploiement sur le blog lui-même. Alors, puisque cela me dérange, pourquoi ne pas y remédier??

Le pipeline

Actuellement, il existe 2 fa?ons de savoir si le déploiement est en cours?:

  • ouvrez le référentiel sur la page jobs/pipelines et voyez le dernier en cours d'exécution
  • ouvrez dans le référentiel et faites défiler jusqu'à README.md

Les deux solutions ne me semblent pas géniales. J'aimerais quelque chose de plus léger dans l'informatique elle-même.

L'idée

Après une brève consultation avec Kauê, j'ai décidé de suivre son conseil?: publier sur /about.

Dans la première expérience?:

Deixando a pipeline visível para acompanhar deploy do blog

Non, c'est devenu moche. Je sais déjà que je ne veux pas que cela apparaisse par défaut. Mais il suffit d'apporter l'information. J'ai juste besoin de cacher ce qui est laid et de le rendre disponible même s'il est laid si cela est explicitement demandé.

Preuve de concept?: plante, sauf indication contraire

Eh bien, la première chose à faire est de savoir si nous devons prendre des mesures. à cette fin, la présence du paramètre de requête status avec la valeur true a été définie comme une API.

Pour obtenir l'URL, j'ai utilisé window.location. à l'intérieur de l'objet Location se trouve le champ de recherche, qui sert précisément à conserver les paramètres de requête utilisés pour accéder à l'URL spécifique.

Par exemple, pour http://localhost:4000/blog/about?q=1, la valeur de window.location.search est ?q=1. Pour faciliter la gestion du contenu dans les paramètres de requête, il existe un objet de type URLSearchParams. D'après ce que j'ai pu comprendre à partir de la documentation, pour instancier URLSearchParams, j'ai besoin de la cha?ne de requête mais sans le ? du préfixe. Je peux y parvenir avec window.location.search.substring(1).

Maintenant, avec cet objet en main, je peux simplement consulter la valeur de n'importe quel paramètre de requête que je souhaite?:

const queryParams = new URLSearchParams(window.location.search.substring(1));

if (queryParams.get("status") === "true") {
    console.log("oba, vamos exibir o pipeline!")
} else {
    console.log("nops, n?o vamos exibir nada")
}

Avec cela en main, je dois prendre les mesures nécessaires pour afficher le badge du pipeline. Par souci de simplicité, j'ai décidé de le mettre sous forme d'extrait HTML incluable?: _includes/pipeline.html. J'ai donc du HTML gratuit à manipuler comme bon me semble.

Au début, c'était simplement un

invisible?:

<div>



<p>Para importar, no /about só precisei colocar {%include pipeline.html%} no come?o do arquivo, o Jekyll se encarregou de montar tudo certo.</p>

<p>Ok, vamos por o script para detectar se deveria ou n?o exibir a tag:<br>
</p>

<pre class="brush:php;toolbar:false"><script>
    const queryParams = new URLSearchParams(window.location.search.substring(1));

    if (queryParams.get("status") === "true") {
        console.log("oba, vamos exibir o pipeline!")
    } else {
        console.log("nops, n?o vamos exibir nada")
    }
</script>
<div>



<p>So far, so good. Agora, vamos mudar a exibi??o para display: block caso seja para exibir o pipeline, ou sumir logo de uma vez com a <div>. Pelo console da web, bastaria fazer algo nesse esquema:<br>
</p>

<pre class="brush:php;toolbar:false">const pipeline = document.getElementById("pipeline")

if (...) {
    pipeline.style.display = "block"
} else {
    pipeline.remove()
}

Placement dans le fragment HTML?:

<script>
    const queryParams = new URLSearchParams(window.location.search.substring(1));
    const pipeline = document.getElementById("pipeline")

    if (queryParams.get("status") === "true") {
        pipeline.style.display = "block"
    } else {
        pipeline.remove()
    }
</script>
<div>



<p>E... falhou. Por quê? Porque no momento que a fun??o rodar ainda n?o tem definido quem é o elemento com id pipeline. Ent?o preciso mudar o ciclo de vida para rodar o script apenas quando a página for carregada. Basta colocar o <script defer>, certo? Bem, n?o. Porque defer n?o funciona bem com inline, apenas com arquivo de source explícito. Veja a documenta??o.

<p>Ou seja, precisei colocar o arquivo JavaScript explicitamente para o Computaria. Como a priori tudo que está solto na pasta do blog é colocado como asset disponível para o Jekyll publicar, criei o js/pipeline-loader.js:<br>
</p>

<pre class="brush:php;toolbar:false"><script src="{{ "/js/pipeline-loader.js" | prepend: site.baseurl }}" defer>
</script>
<div>



<p>E no script:<br>
</p>

<pre class="brush:php;toolbar:false">const queryParams = new URLSearchParams(window.location.search.substring(1));
const pipeline = document.getElementById("pipeline")

if (queryParams.get("status") === "true") {
    pipeline.style.display = "block"
} else {
    pipeline.remove()
}

Super, faisons quelque chose d'utile et publions l'image?? Pour créer dynamiquement un élément, utilisez simplement document.createElement. Ensuite je mets l'URL du badge :

const queryParams = new URLSearchParams(window.location.search.substring(1));
const pipeline = document.getElementById("pipeline")

if (queryParams.get("status") === "true") {
    pipeline.style.display = "block"

    const pipelineImg = document.createElement("img")
    pipelineImg.src = "{{site.repository.base}}/badges/master/pipeline.svg"

    pipeline.appendChild(pipelineImg)
} else {
    pipeline.remove()
}

Mais il affichait une image cassée... hmmm, quel est le message affiché sur la console ?

GET http://localhost:4000/blog/about/{{site.repository.base}}/badges/master/pipeline.svg [HTTP/1.1 404 Not Found 4ms]

étrange, aurait-il d? obtenir la jolie URL du référentiel?? Oh, j'ai remarqué. Il n'a pas du tout traité Liquid. Pour résoudre ce problème, j'ai décidé de suivre l'exemple de css/main.scss, un texte vide.

const queryParams = new URLSearchParams(window.location.search.substring(1));

if (queryParams.get("status") === "true") {
    console.log("oba, vamos exibir o pipeline!")
} else {
    console.log("nops, n?o vamos exibir nada")
}

Cela donne un message d'erreur car le frontmatter n'est pas javascript et l'erreur est affichée dans la première const. Puisque cela me dérange, la fa?on la plus directe à laquelle j'ai pensé de résoudre ce problème était de créer une "erreur inoffensive" plus t?t. J'ai ajouté un ; juste après le début?:

<div>



<p>Para importar, no /about só precisei colocar {%include pipeline.html%} no come?o do arquivo, o Jekyll se encarregou de montar tudo certo.</p>

<p>Ok, vamos por o script para detectar se deveria ou n?o exibir a tag:<br>
</p>

<pre class="brush:php;toolbar:false"><script>
    const queryParams = new URLSearchParams(window.location.search.substring(1));

    if (queryParams.get("status") === "true") {
        console.log("oba, vamos exibir o pipeline!")
    } else {
        console.log("nops, n?o vamos exibir nada")
    }
</script>
<div>



<p>So far, so good. Agora, vamos mudar a exibi??o para display: block caso seja para exibir o pipeline, ou sumir logo de uma vez com a <div>. Pelo console da web, bastaria fazer algo nesse esquema:<br>
</p>

<pre class="brush:php;toolbar:false">const pipeline = document.getElementById("pipeline")

if (...) {
    pipeline.style.display = "block"
} else {
    pipeline.remove()
}

Des désagréments...

En poursuivant les tests, j'ai remarqué qu'un 308 apparaissait constamment dans l'onglet réseau. Mais pourquoi est-il apparu?? Eh bien, parce qu'en développant Liquid, cela s'est retrouvé avec une double barre avant les badges.

J'ai initialement eu ceci?:

  • https://gitlab.com/computaria/blog//badges/master/pipeline.svg

Avec redirection vers :

  • https://gitlab.com/computaria/blog/badges/master/pipeline.svg

Et cela a commencé à me déranger lorsque j'ai analysé si j'utilisais le cache ou non. Pour résoudre ce problème, je devrais me débarrasser de la double barre oblique. Je pourrais simplement m'en débarrasser en ne mettant pas la barre oblique juste après l'expansion de la valeur Liquid, car après tout je pourrais savoir a priori que la cha?ne {{site.repository.base}} se terminait par /. Mais, juste au cas où, cela ne ferait pas de mal de mettre cette barre oblique avant /badges/master/pipeline.svg, c'est même un indicateur pour moi en tant que lecteur.

Mais comme je ne veux pas me fier à une connaissance préalable pour savoir si cette barre existe ou non, j'avais deux options pour cela?:

  • traitez le niveau d'expansion du liquide pour retirer la barre oblique du terminal
  • gérer la création de cette cha?ne au niveau javascript

Le c?té JavaScript m'a paru plus simple. Alors remplacez simplement // par /, n'est-ce pas?? Hum, non. étant donné que le protocole appara?t avant ://, le simple fait d'effectuer cette substitution grossière entra?nerait le début de l'URL comme ceci?: https:/computaria.gitlab.io. Pour contourner ce problème, je fais la substitution suivante?:

<script>
    const queryParams = new URLSearchParams(window.location.search.substring(1));
    const pipeline = document.getElementById("pipeline")

    if (queryParams.get("status") === "true") {
        pipeline.style.display = "block"
    } else {
        pipeline.remove()
    }
</script>
<div>



<p>E... falhou. Por quê? Porque no momento que a fun??o rodar ainda n?o tem definido quem é o elemento com id pipeline. Ent?o preciso mudar o ciclo de vida para rodar o script apenas quando a página for carregada. Basta colocar o <script defer>, certo? Bem, n?o. Porque defer n?o funciona bem com inline, apenas com arquivo de source explícito. Veja a documenta??o.

<p>Ou seja, precisei colocar o arquivo JavaScript explicitamente para o Computaria. Como a priori tudo que está solto na pasta do blog é colocado como asset disponível para o Jekyll publicar, criei o js/pipeline-loader.js:<br>
</p>

<pre class="brush:php;toolbar:false"><script src="{{ "/js/pipeline-loader.js" | prepend: site.baseurl }}" defer>
</script>
<div>



<p>E no script:<br>
</p>

<pre class="brush:php;toolbar:false">const queryParams = new URLSearchParams(window.location.search.substring(1));
const pipeline = document.getElementById("pipeline")

if (queryParams.get("status") === "true") {
    pipeline.style.display = "block"
} else {
    pipeline.remove()
}

Décomposition?:

  • à la place du remplacement, mettre ce qui a été trouvé dans le "premier groupe" suivi d'une barre oblique
  • matchs regex?: tout autre chose que?: (dans un groupe), slash, slash

Avec ce changement, https:// n'a pas de correspondance avec ([^:])//, mais toutes les autres occurrences de // dans le chemin ont une correspondance parfaite, car elles ne le seront pas être devant un :. Pour être plus strict, je pourrais travailler pour empêcher la correspondance de se produire dans le paramètre/fragment de requête, mais cela semblait trop exagéré.

Preuve de concept?: chargement sans cache

Ok, après avoir défini les détails de l'endroit où le placer et du mécanisme de verrouillage, nous avons besoin d'un mécanisme de rechargement. Première tentative?: créez simplement un nouvel élément d’image. Mais quand même, comment ? L'idéal serait "après un certain temps". Cela me donne donc deux options, enfin dire?:

  • setTimeout
  • setInterval

D'accord, allons-y, qu'est-ce que ?a fait?? setTimeout re?oit une commande qui sera exécutée après un intervalle de temps ET également l'intervalle donné. Il vous renvoie un identifiant que vous pouvez supprimer à l'aide de clearTimeout. Pour répéter l'appel, setTimeout doit être rappelé à la fin.

setInterval est presque la même chose, sauf qu'il exécutera toujours la commande après l'intervalle de temps. Le retour doit être un identifiant que vous appelleriez clearInterval pour supprimer, mais selon la documentation, il fonctionne également avec clearTimeout (juste au cas où, ne lui faites pas confiance, utilisez celui avec la sémantique correcte).

Utilisation de setTimeout

Devrions-nous créer un appel en boucle avec setTimeout?? Que diriez-vous d’imprimer 5 fois le mot citrouille dans un champ de texte?? Je vais mettre une zone de texte pour cette expérience?:

const queryParams = new URLSearchParams(window.location.search.substring(1));

if (queryParams.get("status") === "true") {
    console.log("oba, vamos exibir o pipeline!")
} else {
    console.log("nops, n?o vamos exibir nada")
}

Ok, j'ai 3 fonctions que j'aimerais rendre accessibles en HTML. Et ils divisent (même si très légèrement) un état. J'adore cacher des choses, donc je ne veux pas que cet état soit visible en dehors de la balise

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment fonctionne la collection Garbage en JavaScript? Comment fonctionne la collection Garbage en JavaScript? Jul 04, 2025 am 12:42 AM

Le mécanisme de collecte des ordures de JavaScript gère automatiquement la mémoire via un algorithme de compensation de balises pour réduire le risque de fuite de mémoire. Le moteur traverse et marque l'objet actif de l'objet racine, et non marqué est traité comme des ordures et effacés. Par exemple, lorsque l'objet n'est plus référencé (comme la définition de la variable sur NULL), il sera publié lors de la prochaine série de recyclage. Les causes courantes des fuites de mémoire comprennent: ① des minuteries ou des auditeurs d'événements non diffusés; ② Références aux variables externes dans les fermetures; ③ Les variables globales continuent de contenir une grande quantité de données. Le moteur V8 optimise l'efficacité du recyclage à travers des stratégies telles que le recyclage générationnel, le marquage incrémentiel, le recyclage parallèle / simultané, et réduit le temps de blocage principal. Au cours du développement, les références globales inutiles doivent être évitées et les associations d'objets doivent être rapidement décorées pour améliorer les performances et la stabilité.

Comment faire une demande HTTP dans Node.js? Comment faire une demande HTTP dans Node.js? Jul 13, 2025 am 02:18 AM

Il existe trois fa?ons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Types de données JavaScript: référence primitive vs Types de données JavaScript: référence primitive vs Jul 13, 2025 am 02:43 AM

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Objet JavaScript Time, quelqu'un construit un site Web Eactexe, plus rapide sur Google Chrome, etc. Objet JavaScript Time, quelqu'un construit un site Web Eactexe, plus rapide sur Google Chrome, etc. Jul 08, 2025 pm 02:27 PM

Bonjour, développeurs JavaScript! Bienvenue dans JavaScript News de cette semaine! Cette semaine, nous nous concentrerons sur: le différend de marque d'Oracle avec Deno, les nouveaux objets Time JavaScript sont pris en charge par les navigateurs, les mises à jour Google Chrome et certains outils de développeurs puissants. Commen?ons! Le différend de marque d'Oracle avec la tentative de Deno Oracle d'enregistrer une marque "JavaScript" a provoqué la controverse. Ryan Dahl, le créateur de Node.js et Deno, a déposé une pétition pour annuler la marque, et il pense que JavaScript est un niveau ouvert et ne devrait pas être utilisé par Oracle

React vs Angular vs Vue: Quel framework JS est le meilleur? React vs Angular vs Vue: Quel framework JS est le meilleur? Jul 05, 2025 am 02:24 AM

Quel framework JavaScript est le meilleur choix? La réponse est de choisir la plus appropriée selon vos besoins. 1.RIATT est flexible et gratuit, adapté aux projets moyens et grands qui nécessitent une personnalisation élevée et des capacités d'architecture d'équipe; 2. Angular fournit des solutions complètes, adaptées aux applications au niveau de l'entreprise et à la maintenance à long terme; 3. Vue est facile à utiliser, adaptée à des projets de petite et moyenne taille ou à un développement rapide. De plus, s'il existe une pile technologique existante, la taille de l'équipe, le cycle de vie du projet et si le RSS est nécessaire sont également des facteurs importants dans le choix d'un cadre. En bref, il n'y a pas absolument le meilleur cadre, le meilleur choix est celui qui convient à vos besoins.

Comprendre les expressions de fonction immédiatement invoquées (iife) en javascript Comprendre les expressions de fonction immédiatement invoquées (iife) en javascript Jul 04, 2025 am 02:42 AM

Iife (immédiatementInvokedFunctionExpression) est une expression de fonction exécutée immédiatement après la définition, utilisée pour isoler les variables et éviter de contaminer la portée globale. Il est appelé en emballage la fonction entre parenthèses pour en faire une expression et une paire de supports immédiatement suivis, tels que (function () {/ code /}) ();. Ses utilisations de base incluent: 1. évitez les conflits variables et empêchez la duplication de la dénomination entre plusieurs scripts; 2. Créez une portée privée pour rendre les variables internes invisibles; 3. Code modulaire pour faciliter l'initialisation sans exposer trop de variables. Les méthodes d'écriture courantes incluent les versions passées avec des paramètres et des versions de la fonction flèche ES6, mais notez que les expressions et les liens doivent être utilisés.

Gestion des promesses: cha?nage, gestion des erreurs et combinateurs de promesses en javascript Gestion des promesses: cha?nage, gestion des erreurs et combinateurs de promesses en javascript Jul 08, 2025 am 02:40 AM

La promesse est le mécanisme central pour gérer les opérations asynchrones en JavaScript. Comprendre les appels de cha?ne, la gestion des erreurs et les combinants est la clé pour ma?triser leurs applications. 1. L'appel de la cha?ne renvoie une nouvelle promesse à travers. Puis () pour réaliser la concaténation des processus asynchrones. Chaque .then () re?oit le résultat précédent et peut renvoyer une valeur ou une promesse; 2. La gestion des erreurs doit utiliser .catch () pour attraper des exceptions pour éviter les défaillances silencieuses, et peut renvoyer la valeur par défaut dans Catch pour continuer le processus; 3. Combinateurs tels que promesse.all () (réussi avec succès uniquement après tout succès), promesse.race () (le premier achèvement est retourné) et promesse.allsetTled () (en attente de toutes les achèvements)

Qu'est-ce que l'API Cache et comment est-elle utilisée avec les travailleurs du service? Qu'est-ce que l'API Cache et comment est-elle utilisée avec les travailleurs du service? Jul 08, 2025 am 02:43 AM

Cacheapi est un outil fourni par le navigateur pour mettre en cache les demandes de réseau, qui est souvent utilisée en conjonction avec travailleur de service pour améliorer les performances du site Web et l'expérience hors ligne. 1. Il permet aux développeurs de stocker manuellement des ressources telles que des scripts, des feuilles de style, des photos, etc.; 2. Il peut faire correspondre les réponses du cache en fonction des demandes; 3. Il prend en charge la suppression des caches spécifiques ou la nettoyage du cache entier; 4. Il peut mettre en ?uvre des stratégies de priorité de cache ou de priorité de réseau grace à l'écoute des événements Fetch; 5. Il est souvent utilisé pour le support hors ligne, accélérez la vitesse d'accès répétée, préchargement des ressources clés et du contenu de mise à jour des antécédents; 6. Lorsque vous l'utilisez, vous devez faire attention au contr?le de la version du cache, aux restrictions de stockage et à la différence entre le mécanisme de mise en cache HTTP.

See all articles