<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://tiennhm.io.vn/en/notes</id>
    <title>TienNHM — Notes</title>
    <updated>2026-10-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://tiennhm.io.vn/en/notes"/>
    <subtitle>TienNHM - Fullstack Developer Blog Blog</subtitle>
    <icon>https://tiennhm.io.vn/en/img/tiennhm-avatar.jpg</icon>
    <rights>Copyright © 2026 TienNHM.</rights>
    <entry>
        <title type="html"><![CDATA[GitHub gắn nofollow vào mọi link ra ngoài]]></title>
        <id>https://tiennhm.io.vn/en/notes/2026/10/02/github-nofollow</id>
        <link href="https://tiennhm.io.vn/en/notes/2026/10/02/github-nofollow"/>
        <updated>2026-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Kể cả trường website ở sidebar repo. Backlink từ GitHub không truyền thẩm quyền tên miền.]]></summary>
        <content type="html"><![CDATA[<p>Hôm nay soi Google Search Console thấy đúng <strong>3 backlink</strong> trỏ về site, cả ba từ <code>github.com</code> và <code>github.io</code>. Mở HTML trang repo ra xem thì:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">a</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">href</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">http://tiennhm.io.vn/</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">rel</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">noopener noreferrer nofollow</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>GitHub gắn <code>rel="nofollow"</code> vào <strong>mọi</strong> link ra ngoài, kể cả trường <em>Website</em> ở sidebar repo — chỗ ai cũng tưởng là backlink ngon nhất mình có.</p>
<p>Nghĩa là ba backlink đó <strong>không truyền thẩm quyền</strong> gì hết. Về mặt xếp hạng, site đang ở vạch xuất phát.</p>
<p>Điều này đổi hẳn cách đọc một vụ tụt hiển thị: nếu nghi do "mất backlink khi đổi tên miền" thì nên kiểm <code>rel</code> trước, vì rất có thể chẳng có gì để mà mất.</p>
<p>Giá trị thật của link GitHub là <strong>người thật bấm vào</strong>, không phải PageRank.</p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="Git & GitHub" term="Git & GitHub"/>
        <category label="SEO" term="SEO"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Sơ đồ Mermaid sai cú pháp không làm đỏ build]]></title>
        <id>https://tiennhm.io.vn/en/notes/2026/10/01/mermaid-khong-lam-do-build</id>
        <link href="https://tiennhm.io.vn/en/notes/2026/10/01/mermaid-khong-lam-do-build"/>
        <updated>2026-10-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mermaid render ở trình duyệt, nên lỗi chỉ hiện thành hộp đỏ trên trang. Cách bắt tại chỗ.]]></summary>
        <content type="html"><![CDATA[<p>Docusaurus render Mermaid <strong>ở phía trình duyệt</strong>. Hệ quả: một sơ đồ sai cú pháp vẫn build xanh, vẫn deploy, và chỉ hiện thành hộp báo lỗi đỏ khi có người mở đúng trang đó.</p>
<p>Bắt tại chỗ được, dù hơi vòng. <code>mermaid.parse()</code> cần DOM (nó gọi DOMPurify), nhưng <strong>lỗi ngữ pháp được ném ra trước bước đó</strong>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> mermaid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'mermaid'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword module" style="color:#00009f">default</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> mermaid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">parse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">code</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Chỉ lỗi cú pháp mới đáng quan tâm; lỗi DOMPurify là do thiếu DOM.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex" style="color:#36acaa">parse error</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">syntax error</span><span class="token regex regex-source language-regex alternation keyword" style="color:#00009f">|</span><span class="token regex regex-source language-regex" style="color:#36acaa">expecting</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-flags" style="color:#36acaa">i</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">test</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">report</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Một chi tiết suýt làm tôi tin nhầm: lần tiêm lỗi thử nghiệm đầu tiên <strong>không ăn</strong>, vì chuỗi tôi chèn vẫn nằm trong dấu nháy nên vẫn hợp lệ. Phải dùng ngoặc vuông không đóng mới ra lỗi thật.</p>
<p>Checker luôn xanh thì vô dụng. Luôn thử làm nó đỏ trước khi tin nó.</p>]]></content>
        <author>
            <name>Nguyễn Huỳnh Minh Tiến</name>
            <uri>https://github.com/TienNHM</uri>
        </author>
        <category label="Công cụ" term="Công cụ"/>
        <category label="Kiểm thử" term="Kiểm thử"/>
    </entry>
</feed>