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

首頁(yè) web前端 js教程 使管道可見(jiàn)以監(jiān)控博客部署

使管道可見(jiàn)以監(jiān)控博客部署

Jan 14, 2025 pm 02:29 PM

Computaria 讓我困擾的一件事是無(wú)法跟蹤博客本身的部署。那么,既然這讓我煩惱,為什么不解決它呢?

管道

目前有兩種方法可以知道部署是否正在運(yùn)行:

  • 在作業(yè)/管道頁(yè)面上打開(kāi)存儲(chǔ)庫(kù)并查看最新的正在運(yùn)行的
  • 在存儲(chǔ)庫(kù)中打開(kāi)并滾動(dòng)到 README.md

這兩種解決方案對(duì)我來(lái)說(shuō)似乎都不太好。我想要計(jì)算本身更輕松的東西。

這個(gè)想法

與 Kauê 短暫協(xié)商后,我決定遵循他的提示:在 /about 上發(fā)帖。

在第一個(gè)實(shí)驗(yàn)中:

Deixando a pipeline visível para acompanhar deploy do blog

不,它變得丑陋了。我已經(jīng)知道我不希望它默認(rèn)出現(xiàn)。但帶上信息就足夠了。我只需要隱藏丑陋的東西,并在明確要求的情況下使其可用,即使是丑陋的。

概念證明:除非指定否則會(huì)崩潰

嗯,首先要做的是知道我們是否應(yīng)該采取任何行動(dòng)。為此,將查詢參數(shù) status 的值為 true 的存在定義為 API。

為了獲取 URL,我使用了 window.location。 Location 對(duì)象內(nèi)部有一個(gè)搜索字段,它精確地用于維護(hù)用于訪問(wèn)特定 URL 的查詢參數(shù)。

例如,對(duì)于 http://localhost:4000/blog/about?q=1,window.location.search 的值為 ?q=1。為了更容易處理查詢參數(shù)中的內(nèi)容,有一個(gè) URLSearchParams 類型的對(duì)象。據(jù)我從文檔中可以理解,要實(shí)例化 URLSearchParams,我需要查詢字符串,但沒(méi)有 ?的前綴。我可以使用 window.location.search.substring(1).

來(lái)實(shí)現(xiàn)這一點(diǎn)

現(xiàn)在,有了這個(gè)對(duì)象,我可以簡(jiǎn)單地查詢我想要的任何查詢參數(shù)的值:

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")
}

有了這個(gè),我需要采取顯示管道徽章的操作。為了方便起見(jiàn),我決定將其作為可包含的 HTML 片段:_includes/pipeline.html。因此,我可以按照我認(rèn)為合適的方式操作免費(fèi)的 HTML。

一開(kāi)始,它只是一個(gè)

看不見(jiàn)的:

<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()
}

放置在 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()
}

太好了,讓我們做一些有用的事情并發(fā)布圖片?要?jiǎng)討B(tài)創(chuàng)建元素,只需使用 document.createElement 即可。然后我輸入徽章網(wǎng)址:

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()
}

但是它顯示了一個(gè)破碎的圖像...嗯,控制臺(tái)上顯示的消息是什么?

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

奇怪,他應(yīng)該得到了可愛(ài)的存儲(chǔ)庫(kù) URL 嗎?哦,我注意到了。他根本沒(méi)有處理Liquid。為了解決這個(gè)問(wèn)題,我決定遵循 css/main.scss 中的示例,一個(gè)空的 frontmatter。

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")
}

這會(huì)給出錯(cuò)誤消息,因?yàn)?frontmatter 不是 javascript,并且錯(cuò)誤顯示在第一個(gè) const 中。由于這讓我很困擾,我想到的最直接的處理方法就是盡早創(chuàng)建一個(gè)“無(wú)害的錯(cuò)誤”。我添加了一個(gè) ;緊接在前言之后:

<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()
}

煩惱...

當(dāng)我繼續(xù)測(cè)試時(shí),我注意到網(wǎng)絡(luò)選項(xiàng)卡中不斷出現(xiàn)308,但為什么會(huì)出現(xiàn)?嗯,因?yàn)檎归_(kāi) Liquid 時(shí),它最終在徽章前出現(xiàn)了一個(gè)雙條。

我最初得到的是這個(gè):

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

重定向至:

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

當(dāng)我分析我是否使用緩存時(shí),這開(kāi)始困擾我。為了解決這個(gè)問(wèn)題,我應(yīng)該去掉雙斜杠。我可以通過(guò)不在 Liquid 值展開(kāi)后放置斜杠來(lái)擺脫它,因?yàn)楫吘刮铱梢韵闰?yàn)地知道 {{site.repository.base}} 字符串以 / 結(jié)尾。但是,為了以防萬(wàn)一,將斜線放在 /badges/master/pipeline.svg 之前實(shí)際上并沒(méi)有什么壞處,它甚至是我作為讀者的一個(gè)指標(biāo)。

但是,由于我不想依賴先驗(yàn)知識(shí)來(lái)判斷此欄是否存在,因此我有兩個(gè)選擇:

  • 處理 Liquid 擴(kuò)展級(jí)別以刪除終端斜線
  • 在 JavaScript 級(jí)別處理此字符串的創(chuàng)建

JavaScript 方面對(duì)我來(lái)說(shuō)似乎更容易。所以只需將/替換為/,對(duì)嗎?嗯,不。由于協(xié)議出現(xiàn)在 :// 之前,因此僅進(jìn)行粗略替換就會(huì)導(dǎo)致 url 開(kāi)頭如下:https://computaria.gitlab.io。為了解決這個(gè)問(wèn)題,我進(jìn)行了以下替換:

<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()
}

分解:

  • 代替替換,將在“第一組”中找到的內(nèi)容放在后面加上斜線
  • 正則表達(dá)式匹配:除 :(在一組中)、斜杠、斜杠以外的任何內(nèi)容

通過(guò)此更改,https:// 不再具有 match 與 ([^:])//,但路徑中 // 的所有其他出現(xiàn)都具有完美匹配,因?yàn)樗鼈儾粫?huì)前面一個(gè):.更嚴(yán)格地說(shuō),我可以努力防止匹配在查詢參數(shù)/片段中發(fā)生,但這似乎太過(guò)分了。

概念證明:無(wú)緩存加載

好的,定義了放置位置和鎖定機(jī)制的詳細(xì)信息后,我們需要一個(gè)重新加載機(jī)制。第一次嘗試:簡(jiǎn)單地創(chuàng)建一個(gè)新的圖像元素。但還是這樣,怎么辦?理想的情況是“一段時(shí)間后”。所以這給了我兩個(gè)選擇,可以說(shuō):

  • 設(shè)置超時(shí)
  • 設(shè)置間隔

好吧,我們來(lái)看看它有什么作用? setTimeout 接收一個(gè)命令,該命令將在一段時(shí)間間隔以及給定的時(shí)間間隔后執(zhí)行。它會(huì)返回一個(gè) ID,您可以使用clearTimeout 將其刪除。如需重復(fù)調(diào)用,需要在最后再次調(diào)用setTimeout。

setInterval 幾乎是同樣的事情,只是它總是在時(shí)間間隔之后執(zhí)行命令。返回值應(yīng)該是一個(gè) ID,您可以調(diào)用clearInterval 來(lái)刪除它,但根據(jù)文檔,它也可以與clearTimeout 一起使用(以防萬(wàn)一,不要相信它,請(qǐng)使用具有正確語(yǔ)義的 ID)。

使用setTimeout

我們應(yīng)該使用 setTimeout 創(chuàng)建一個(gè)循環(huán)調(diào)用嗎?在文本字段中打印“南瓜”一詞 5 次怎么樣?我將為這個(gè)實(shí)驗(yàn)放置一個(gè)文本區(qū)域:

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")
}

好的,我想通過(guò) HTML 訪問(wèn) 3 個(gè)函數(shù)。他們分裂(即使是非常輕微的)一個(gè)國(guó)家。我很喜歡隱藏東西,所以我不希望這種狀態(tài)在 <script> 標(biāo)簽之外可見(jiàn)。</script>

我最明顯的解決方案是將其放在一個(gè)塊下,因此,當(dāng)離開(kāi)該塊時(shí),里面的變量將在外面不可見(jiàn):

<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()
}

好的,但是如何讓函數(shù)可見(jiàn)呢?好吧,經(jīng)過(guò)實(shí)驗(yàn),我找到了一種方法:函數(shù)轉(zhuǎn)義作用域。由于局部變量沒(méi)有超出塊的限制,我仍然可以在塊內(nèi)部放置一些輔助函數(shù),這樣它們?cè)谕獠烤蜎](méi)有任何意義。像這樣的東西:

<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()
}

好的,現(xiàn)在我需要處理超時(shí)調(diào)用。我的想法是執(zhí)行一個(gè)步驟,當(dāng)該步驟完成時(shí),注冊(cè)下一個(gè)超時(shí),調(diào)用相同的步驟。只是為了避免將此步驟永遠(yuǎn)限制為幾次。

那么,如果沒(méi)有超時(shí)問(wèn)題,會(huì)是什么樣子呢?遞歸調(diào)用:

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()
}

看起來(lái)不錯(cuò),加個(gè)超時(shí)怎么樣?嗯,在步驟的主體內(nèi)部,所以調(diào)用步驟就是設(shè)置超時(shí)。為了一個(gè)好的暫停,我需要時(shí)間:

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

好的,剩下要做的就是保存超時(shí)標(biāo)識(shí)符,我們就準(zhǔn)備好了。我將這一步放在公開(kāi)的公共函數(shù)中,我們就準(zhǔn)備好了:

---
# frontmatter vazio para fazer o parse do liquid
---

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()
}

好的,我們現(xiàn)在有好玩的地方了:

參見(jiàn)小提琴 https://jsfiddle.net/jeffque/5Lrasyqk/

使用setInterval

setInterval 的使用非常相似,但“召回”步驟是隱式的。如果我想停止循環(huán),我需要顯式取消注冊(cè)的setInterval。

那么,像上面的例子一樣開(kāi)始怎么樣?但具有不同的暫存區(qū) ID:

---
# frontmatter vazio para fazer o parse do liquid
---
;

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()
}

參見(jiàn)小提琴 https://jsfiddle.net/jeffque/5Lrasyqk/

重新加載嘗試

定義了重復(fù)計(jì)時(shí)機(jī)制后,現(xiàn)在的問(wèn)題是定義如何重新加載圖像。首先,分析 GitLab 在搜索徽章時(shí)返回的標(biāo)頭:https://gitlab.com/computaria/blog//badges/master/pipeline.svg:

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")
}

比較來(lái)自不同請(qǐng)求的多個(gè) etag,以防萬(wàn)一:

<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()
}

嗯,etag 總是相同的,表明它是相同的資源。 cache-control: no-store 強(qiáng)烈告訴我它不是用于存儲(chǔ)緩存的。指向過(guò)去的過(guò)期時(shí)間強(qiáng)烈表明它的目的是表明不應(yīng)考慮對(duì)該資源進(jìn)行緩存。除非另有證明,cf-cache-status: MISS 僅表示它沒(méi)有命中 Cloudflare 的緩存。

最后,嚴(yán)格的運(yùn)輸安全。這意味著什么?這和資源本身有什么關(guān)系?

嗯,這與正在訪問(wèn)的資源無(wú)關(guān)。但這表明該網(wǎng)站只能通過(guò) HTTPS 訪問(wèn)。

好的,所有這些都表明圖像不應(yīng)該是卷曲的。正如預(yù)期的那樣,F(xiàn)5 總是會(huì)導(dǎo)致它被再次下載。對(duì)我來(lái)說(shuō),這是一個(gè)非常有力的指標(biāo),如果我的緩存出現(xiàn)問(wèn)題,它不會(huì)出現(xiàn)在服務(wù)器或網(wǎng)絡(luò)上,而是出現(xiàn)在瀏覽器級(jí)別。

第一次嘗試:創(chuàng)建一個(gè)新的 img 元素并扔掉之前的元素。

為了方便起見(jiàn),沒(méi)有什么比擁有一個(gè)返回元素的函數(shù)更好的了:

<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()
}

在 setTimeout 中,我需要?jiǎng)h除 #pipeline 子級(jí)并插入新圖像。我通過(guò)父親的行動(dòng)找到的選項(xiàng)是:

  • 刪除子項(xiàng)
  • 替換子項(xiàng)
  • 替換子項(xiàng)

嗯,removeChild 和replaceChild 涉及了解如何保存舊元素以請(qǐng)求將其刪除。另一方面,ReplaceChildren 沒(méi)有任何戲劇性,它只是傳遞了新元素,這很好:

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()
}

僅此一點(diǎn)就產(chǎn)生了魔力。那么,它的表現(xiàn)如何?

Deixando a pipeline visível para acompanhar deploy do blog

創(chuàng)建新的 img 還不夠。

我發(fā)現(xiàn)的另一個(gè)替代方法是再次設(shè)置變量值。這樣,就不再需要生成相同元素的函數(shù),我只需“修改”img 指向的 URL 即可。而且,這就是我如何發(fā)現(xiàn)在同一頁(yè)面上的多個(gè)位置使用相同資源可能會(huì)遭受某種緩存的情況......

好吧,如果每次重復(fù)都在 URL 末尾添加一個(gè)“ ”來(lái)嘗試欺騙 GitLab 會(huì)怎樣?好吧,gitlab 意識(shí)到我不懷好意...

如果它是一個(gè)帶有參數(shù)或其迭代器傳遞的查詢參數(shù)怎么辦?

Deixando a pipeline visível para acompanhar deploy do blog

但是,代價(jià)是什么?

好的,這不可能,因?yàn)檫@是一種解決方法,讓我們嘗試獲取它?然后給出fetch之后,想想如何替換圖片?

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")
}

嗯,錯(cuò)誤,來(lái)自 CORS。既然我無(wú)法控制 GitLab,我還能做什么?

使管道可見(jiàn)以監(jiān)控博客部署;沒(méi)有重新加載,但

好的,新實(shí)驗(yàn):簡(jiǎn)單地使用 img 標(biāo)簽創(chuàng)建 /assets/pipeline.html 并從 iframe 指向它。對(duì)于強(qiáng)制重新加載操作,我使用了與 Stack Overflow 答案相同的內(nèi)容:

<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()
}

轉(zhuǎn)為 HTML

然后,去那里!成功了!

Deixando a pipeline visível para acompanhar deploy do blog

現(xiàn)在,進(jìn)行調(diào)整以使其適合:

  • 徽章充電的停止/重啟控制
  • 在 iframe 中:按照手動(dòng)編輯 SVG 的提示點(diǎn)咖啡來(lái)處理 iframe
  • 文檔內(nèi)部:刪除正文的邊距,只為徽章留出空間

通過(guò)進(jìn)行這些調(diào)整,您可以擺脫困境

Deixando a pipeline visível para acompanhar deploy do blog

為此

Deixando a pipeline visível para acompanhar deploy do blog

您可以檢查這里使用的文件:

  • /about.md
  • /_includes/pipeline.html
  • /assets/pipeline-badge.html
  • /js/pipeline-loader.js

以上是使管道可見(jiàn)以監(jiān)控博客部署的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1597
29
PHP教程
1488
72
垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收機(jī)制通過(guò)標(biāo)記-清除算法自動(dòng)管理內(nèi)存,以減少內(nèi)存泄漏風(fēng)險(xiǎn)。引擎從根對(duì)象出發(fā)遍歷并標(biāo)記活躍對(duì)象,未被標(biāo)記的則被視為垃圾并被清除。例如,當(dāng)對(duì)象不再被引用(如將變量設(shè)為null),它將在下一輪回收中被釋放。常見(jiàn)的內(nèi)存泄漏原因包括:①未清除的定時(shí)器或事件監(jiān)聽(tīng)器;②閉包中對(duì)外部變量的引用;③全局變量持續(xù)持有大量數(shù)據(jù)。V8引擎通過(guò)分代回收、增量標(biāo)記、并行/并發(fā)回收等策略優(yōu)化回收效率,降低主線程阻塞時(shí)間。開(kāi)發(fā)時(shí)應(yīng)避免不必要的全局引用、及時(shí)解除對(duì)象關(guān)聯(lián),以提升性能與穩(wěn)定性。

如何在node.js中提出HTTP請(qǐng)求? 如何在node.js中提出HTTP請(qǐng)求? Jul 13, 2025 am 02:18 AM

在Node.js中發(fā)起HTTP請(qǐng)求有三種常用方式:使用內(nèi)置模塊、axios和node-fetch。1.使用內(nèi)置的http/https模塊無(wú)需依賴,適合基礎(chǔ)場(chǎng)景,但需手動(dòng)處理數(shù)據(jù)拼接和錯(cuò)誤監(jiān)聽(tīng),例如用https.get()獲取數(shù)據(jù)或通過(guò).write()發(fā)送POST請(qǐng)求;2.axios是基于Promise的第三方庫(kù),語(yǔ)法簡(jiǎn)潔且功能強(qiáng)大,支持async/await、自動(dòng)JSON轉(zhuǎn)換、攔截器等,推薦用于簡(jiǎn)化異步請(qǐng)求操作;3.node-fetch提供類似瀏覽器fetch的風(fēng)格,基于Promise且語(yǔ)法簡(jiǎn)單

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問(wèn)題。理解這兩類差異有助于編寫(xiě)更穩(wěn)定可靠的代碼。

React與Angular vs Vue:哪個(gè)JS框架最好? React與Angular vs Vue:哪個(gè)JS框架最好? Jul 05, 2025 am 02:24 AM

選哪個(gè)JavaScript框架最好?答案是根據(jù)需求選擇最適合的。1.React靈活自由,適合需要高度定制、團(tuán)隊(duì)有架構(gòu)能力的中大型項(xiàng)目;2.Angular提供完整解決方案,適合企業(yè)級(jí)應(yīng)用和長(zhǎng)期維護(hù)的大項(xiàng)目;3.Vue上手簡(jiǎn)單,適合中小型項(xiàng)目或快速開(kāi)發(fā)。此外,是否已有技術(shù)棧、團(tuán)隊(duì)規(guī)模、項(xiàng)目生命周期及是否需要SSR也都是選擇框架的重要因素??傊?,沒(méi)有絕對(duì)最好的框架,適合自己需求的就是最佳選擇。

JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 JavaScript時(shí)間對(duì)象,某人構(gòu)建了一個(gè)eactexe,在Google Chrome上更快的網(wǎng)站等等 Jul 08, 2025 pm 02:27 PM

JavaScript開(kāi)發(fā)者們,大家好!歡迎閱讀本周的JavaScript新聞!本周我們將重點(diǎn)關(guān)注:Oracle與Deno的商標(biāo)糾紛、新的JavaScript時(shí)間對(duì)象獲得瀏覽器支持、GoogleChrome的更新以及一些強(qiáng)大的開(kāi)發(fā)者工具。讓我們開(kāi)始吧!Oracle與Deno的商標(biāo)之爭(zhēng)Oracle試圖注冊(cè)“JavaScript”商標(biāo)的舉動(dòng)引發(fā)爭(zhēng)議。Node.js和Deno的創(chuàng)建者RyanDahl已提交請(qǐng)?jiān)笗?shū),要求取消該商標(biāo),他認(rèn)為JavaScript是一個(gè)開(kāi)放標(biāo)準(zhǔn),不應(yīng)由Oracle

立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) 立即在JavaScript中立即調(diào)用功能表達(dá)式(IIFE) Jul 04, 2025 am 02:42 AM

IIFE(ImmediatelyInvokedFunctionExpression)是一種在定義后立即執(zhí)行的函數(shù)表達(dá)式,用于變量隔離和避免污染全局作用域。它通過(guò)將函數(shù)包裹在括號(hào)中使其成為表達(dá)式,并緊隨其后的一對(duì)括號(hào)來(lái)調(diào)用,如(function(){/code/})();。其核心用途包括:1.避免變量沖突,防止多個(gè)腳本間的命名重復(fù);2.創(chuàng)建私有作用域,使函數(shù)內(nèi)部變量不可見(jiàn);3.模塊化代碼,便于初始化工作而不暴露過(guò)多變量。常見(jiàn)寫(xiě)法包括帶參數(shù)傳遞的版本和ES6箭頭函數(shù)版本,但需注意:必須使用表達(dá)式、結(jié)

處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 處理諾言:鏈接,錯(cuò)誤處理和承諾在JavaScript中 Jul 08, 2025 am 02:40 AM

Promise是JavaScript中處理異步操作的核心機(jī)制,理解鏈?zhǔn)秸{(diào)用、錯(cuò)誤處理和組合器是掌握其應(yīng)用的關(guān)鍵。1.鏈?zhǔn)秸{(diào)用通過(guò).then()返回新Promise實(shí)現(xiàn)異步流程串聯(lián),每個(gè).then()接收上一步結(jié)果并可返回值或Promise;2.錯(cuò)誤處理應(yīng)統(tǒng)一使用.catch()捕獲異常,避免靜默失敗,并可在catch中返回默認(rèn)值繼續(xù)流程;3.組合器如Promise.all()(全成功才成功)、Promise.race()(首個(gè)完成即返回)和Promise.allSettled()(等待所有完成)

什么是緩存API?如何與服務(wù)人員使用? 什么是緩存API?如何與服務(wù)人員使用? Jul 08, 2025 am 02:43 AM

CacheAPI是瀏覽器提供的一種緩存網(wǎng)絡(luò)請(qǐng)求的工具,常與ServiceWorker配合使用,以提升網(wǎng)站性能和離線體驗(yàn)。1.它允許開(kāi)發(fā)者手動(dòng)存儲(chǔ)如腳本、樣式表、圖片等資源;2.可根據(jù)請(qǐng)求匹配緩存響應(yīng);3.支持刪除特定緩存或清空整個(gè)緩存;4.通過(guò)ServiceWorker監(jiān)聽(tīng)fetch事件實(shí)現(xiàn)緩存優(yōu)先或網(wǎng)絡(luò)優(yōu)先等策略;5.常用于離線支持、加快重復(fù)訪問(wèn)速度、預(yù)加載關(guān)鍵資源及后臺(tái)更新內(nèi)容;6.使用時(shí)需注意緩存版本控制、存儲(chǔ)限制及與HTTP緩存機(jī)制的區(qū)別。

See all articles