<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>TienNHM — Notes</title>
        <link>https://tiennhm.io.vn/notes</link>
        <description>TienNHM - Fullstack Developer Blog Blog</description>
        <lastBuildDate>Fri, 02 Oct 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>vi</language>
        <copyright>Copyright © 2026 TienNHM.</copyright>
        <item>
            <title><![CDATA[GitHub gắn nofollow vào mọi link ra ngoài]]></title>
            <link>https://tiennhm.io.vn/notes/2026/10/02/github-nofollow</link>
            <guid>https://tiennhm.io.vn/notes/2026/10/02/github-nofollow</guid>
            <pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Kể cả trường website ở sidebar repo. Backlink từ GitHub không truyền thẩm quyền tên miền.]]></description>
            <content:encoded><![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:encoded>
            <category>Git &amp; GitHub</category>
            <category>SEO</category>
        </item>
        <item>
            <title><![CDATA[Sơ đồ Mermaid sai cú pháp không làm đỏ build]]></title>
            <link>https://tiennhm.io.vn/notes/2026/10/01/mermaid-khong-lam-do-build</link>
            <guid>https://tiennhm.io.vn/notes/2026/10/01/mermaid-khong-lam-do-build</guid>
            <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
            <description><![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ỗ.]]></description>
            <content:encoded><![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:encoded>
            <category>Công cụ</category>
            <category>Kiểm thử</category>
        </item>
    </channel>
</rss>