{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/render-blocking-css-and-chrome-performance-api","result":{"data":{"markdownRemark":{"id":"7a7e1fa0-a034-5ed2-96c3-c6781f8cf258","html":"<p><strong>CSS</strong> được <strong>browser</strong> xem là 1 trong những <strong>render blocking resources</strong> - những tài nguyên mà trang của bạn bắt buộc phải tải thì người dùng mới có thể nhìn thấy nội dung được</p>\n<h2 id=\"tại-sao-nên-tránh-render-blocking-css\" style=\"position:relative;\"><a href=\"#t%E1%BA%A1i-sao-n%C3%AAn-tr%C3%A1nh-render-blocking-css\" aria-label=\"tại sao nên tránh render blocking css permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tại sao nên tránh Render Blocking CSS</h2>\n<ul>\n<li><strong>Render blocking CSS</strong> sẽ làm chậm việc hiển thị <strong>website</strong> của bạn đến người dùng</li>\n<li>Mỗi file CSS mà <strong>website</strong> của bạn tải sẽ tăng thêm thời gian vào <strong>first-paint</strong> của page, có nghĩa là <strong>user</strong> sẽ phải đợi lâu hơn để nhìn thấy <strong>content</strong> nếu trang của bạn phải tải nhiều <strong>CSS</strong></li>\n</ul>\n<br>\n<img src=\"/media/render-blocking-css.png\" style=\"box-shadow: none;\">\n<br />\n<small>CSS ảnh hưởng rất nhiều đến thời gian hiển thị trang</small>\n<br />\n<p>Khi bắt đầu tải trang, <strong>browser</strong> sẽ luôn tự động tải tất cả các file <strong>CSS</strong>, không quan tâm đến việc nó có <strong>block</strong> quá trình <strong>render</strong> hay không!</p>\n<p>Vậy phải làm thế nào để hạn chế được <strong>render blocking css</strong> ?</p>\n<h2 id=\"solutions\" style=\"position:relative;\"><a href=\"#solutions\" aria-label=\"solutions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solutions</h2>\n<p>Nếu như bạn nhận thấy trang của mình có những <strong>CSS</strong> mà chỉ sử dụng trong 1 vài điều kiện nhất định ví dụ như <strong>style</strong> cho <strong>content</strong> bên trong 1 <strong>modal</strong> mà <strong>user</strong> phải <strong>click</strong> để open modal mới thấy, <strong>content</strong> bên trong <strong>tab</strong> không hiển thị đầu tiên, hoặc những style chỉ <strong>apply</strong> riêng cho <strong>large monitor</strong> hoặc <strong>mobile devices</strong>…</p>\n<p>Thì đây là 1 số cách có thể giúp trang của bạn tải nhanh hơn</p>\n<h3 id=\"sử-dụng-media-attribute\" style=\"position:relative;\"><a href=\"#s%E1%BB%AD-d%E1%BB%A5ng-media-attribute\" aria-label=\"sử dụng media attribute permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sử dụng media attribute</h3>\n<p>Khi muốn <strong>load css</strong> vào <strong>web page</strong> của mình chúng ta sẽ sử dụng thẻ <code class=\"language-text\">link</code> như thế này</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>style.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>print.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>style.mobile.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><strong>Browser</strong> sau khi load xong <strong>HTML</strong> sẽ tải thêm 3 file <strong>CSS</strong> này nữa và chỉ hiển thị nội dung sau khi đã tải xong tất cả</p>\n<p>Tuy nhiên <code class=\"language-text\">print.css</code> chỉ dùng khi in <strong>document</strong> (<strong>Ctrl/Cmd + P</strong>) và <code class=\"language-text\">style.mobile.css</code> là những <strong>style</strong> chỉ <strong>apply</strong> trên <strong>mobile</strong> mà thôi</p>\n<p>Trong trường hợp này chúng ta có thể sử dụng <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-media\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">media attribute</a></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>style.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>print.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>print<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>style.mobile.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(max-width: 568px)<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Lúc này <strong>browser</strong> sẽ hiểu rằng chỉ cần tải xong file <strong>style.css</strong> là ngay lập tức có thể hiển thị nội dung trang cho người dùng mà không cần biết 2 file còn lại đã tải xong hay chưa</p>\n<p>Đối với <strong>link</strong> sử dụng <strong>media attribute</strong>:</p>\n<ul>\n<li><code class=\"language-text\">media=&quot;print&quot;</code>: những <strong>style</strong> trong file này sẽ chỉ <strong>apply</strong> khi in <strong>document</strong>, không cần cho <strong>render</strong> nên sẽ không <strong>block</strong> lần <strong>render</strong> đầu tiên khi tải trang</li>\n<li><code class=\"language-text\">media=&quot;(max-width: 568px)&quot;</code>: những <strong>style</strong> này chỉ <strong>apply</strong> trên những <strong>device</strong> với <code class=\"language-text\">max-witdh = 568px</code> và cũng không <strong>block</strong> lần <strong>render</strong> đầu tiên khi tải trang trên <strong>desktop/tablet device</strong></li>\n</ul>\n<p>Sử dụng <strong>media attribute</strong> chúng ta có thể điều chỉnh việc hiển thị trang theo các trường hợp cụ thể như: sau khi đã render xong, điều chỉnh kích thước màn hình, thay đổi hướng thiết bị (ngang/dọc)…</p>\n<p>Giá trị của <strong>media</strong> bắt buộc phải là 1 <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Description\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">media type</a> hoặc <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">media query</a>, rất hữu ích khi cần <strong>load</strong> các <strong>external stylesheets</strong> - nó hỗ trợ <strong>browser</strong> lựa chọn được những <strong>CSS</strong> cần thiết nhất cho lần <strong>render</strong> đầu tiên</p>\n<h3 id=\"combine-css-or-inline-css\" style=\"position:relative;\"><a href=\"#combine-css-or-inline-css\" aria-label=\"combine css or inline css permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Combine css or inline css</h3>\n<p>1 cách khá hiệu quả là các bạn có thể để trực tiếp <strong>CSS</strong> vào trong 1 thẻ <code class=\"language-text\">style</code> trên <strong>header</strong> của <strong>document</strong> nếu <strong>CSS</strong> không quá to, cách này cải thiện <strong>performance</strong> rất tốt khi chỉ cần <strong>DOM</strong> load xong là có thể hiển thị ngay được rồi</p>\n<p>Hoặc có thể hạn chế tải nhiều file <strong>CSS</strong> quá. Thông thường khi <strong>code</strong> các <strong>dev</strong> sẽ có xu hướng tách ra nhiều file <strong>CSS</strong> khác nhau theo <strong>component</strong>, <strong>module</strong>… để dễ quản lý, tuy nhiên việc <strong>load</strong> nhiều file <strong>CSS</strong> sẽ lâu hơn so với chỉ <strong>load</strong> 1 hoặc 2 file</p>\n<p><img src=\"/media/inline-css.png\" alt=\"inline-css\"></p>\n<p><small>1 trong những kĩ thuật giúp <b>Gatsby site</b> tải rất nhanh chính là <b>Inline CSS</b></small></p>\n<h2 id=\"performance-api\" style=\"position:relative;\"><a href=\"#performance-api\" aria-label=\"performance api permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Performance API</h2>\n<p>Bây giờ chúng ta hãy thử đo đạc <strong>page rendering time</strong> sau khi áp dụng 1 số kĩ thuật để tránh <strong>Render Blocking CSS</strong> với <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Performance\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chrome Perfomance API</a> nhé</p>\n<p>Mình có viết 1 ví dụ đơn giản để các bạn có thể hiểu về <strong>Render Blocking CSS</strong> ở đây: <a href=\"https://hta218.github.io/render-blocking-css-example/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://hta218.github.io/render-blocking-css-example/</a></p>\n<p>Trong ví dụ mình có load 2 file <strong>CSS</strong> và so sánh <strong>page rendering time</strong> với 2 màn hình có <strong>device-width</strong> lớn hơn và nhỏ hơn <strong>800px</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>tailwind.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(min-width: 800px)<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>bootstrap.css<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">media</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>(min-width: 800px)<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span></code></pre></div>\n<p>Để sử dụng <strong>Performance API</strong> thì cần chú ý kiểm tra kĩ <strong>browser compatibility</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"PerformanceObserver\"</span> <span class=\"token keyword\">in</span> window<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token comment\">// Create PerformanceObserver instance</span>\n\t\t<span class=\"token keyword\">const</span> perfObsever <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PerformanceObserver</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">perf</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">const</span> perfEntries <span class=\"token operator\">=</span> perf<span class=\"token punctuation\">.</span><span class=\"token function\">getEntriesByType</span><span class=\"token punctuation\">(</span><span class=\"token string\">'paint'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\tperfEntries<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> startTime <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token comment\">// Get the result inside this callback</span>\n\t\t\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">The time to </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> was </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>startTime<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> milliseconds.</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\n\t\t<span class=\"token comment\">// observe \"paint\" event</span>\n\t\tperfObsever<span class=\"token punctuation\">.</span><span class=\"token function\">observe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> entryTypes<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"paint\"</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>err<span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token comment\">// Remember to check the browser compatibility before using this API</span>\n\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Performance API isn't supported!\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Có nhiều <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Performance metric</a> khác nhau, trong trường hợp này mình sử dụng <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PerformancePaintTiming</a></p>\n<p>Để thấy rõ hơn kết quả các bạn có thể mở <strong>chrome devtool</strong> lên, <strong>throttle internet</strong> và <strong>CPU speed</strong> cho giống với điều kiện ở máy <strong>user</strong> hơn nhé</p>\n<p>Với màn hình <strong>>800px</strong> (ví dụ cho <strong>load</strong> tất cả các <strong>CSS</strong> trước <strong>first page render</strong>)</p>\n<p><img src=\"/media/css-block-render.png\" alt=\"css-block-render\"></p>\n<p>Chúng ta cần hơn <strong>6 giây</strong> cho <strong>first paint</strong> (sau khi tất cả <strong>CSS load</strong> xong) - tương đương với <strong>user</strong> phải đợi <strong>6s</strong> mới thấy nội dung của <strong>page</strong></p>\n<p>Với trường hợp chỉ cần load 1 file <strong>CSS</strong> cho <strong>first paint</strong> (các file còn lại vẫn được <strong>load</strong> nhưng không dùng đến hoặc không cần dùng cho lần <strong>render</strong> đầu tiên)</p>\n<p><img src=\"/media/css-not-block-render.png\" alt=\"css-not-block-render\"></p>\n<p><strong>User</strong> nhìn thấy <strong>content</strong> sớm hơn <strong>2 giây</strong>, có thể thấy <strong>page render</strong> ngay cả khi 2 file <strong>CSS</strong> còn lại vẫn chưa <strong>load</strong> xong</p>\n<p>Kết quả đo đạc với <strong>Performance API</strong> được tổng hợp lại</p>\n<p><img src=\"/media/render-result.png\" alt=\"render-result\"></p>\n<p>Hoặc đơn giản hơn, các bạn có thể sử dụng trực tiếp <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PerformancePaintTiming API</a></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>window<span class=\"token punctuation\">.</span>performance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">const</span> performance <span class=\"token operator\">=</span> window<span class=\"token punctuation\">.</span>performance<span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">const</span> perfEntries <span class=\"token operator\">=</span> performance<span class=\"token punctuation\">.</span><span class=\"token function\">getEntriesByType</span><span class=\"token punctuation\">(</span><span class=\"token string\">'paint'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\tperfEntries<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> name<span class=\"token punctuation\">,</span> startTime <span class=\"token punctuation\">}</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n\t\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">The time to </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> was </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>startTime<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> milliseconds.</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n\tconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Performance timing isn't supported.\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"kết-bài\" style=\"position:relative;\"><a href=\"#k%E1%BA%BFt-b%C3%A0i\" aria-label=\"kết bài permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Kết bài</h2>\n<p>Có thể thấy sự khác biệt rõ rệt với <strong>page rendering time</strong>, ảnh hưởng trực tiếp đến <strong>user’s experience</strong> khi <strong>webpage</strong> phải tải quá nhiều <strong>CSS</strong> không cần thiết, vì vậy chúng ta cần phải rất chú ý đến <strong>resource</strong> này.</p>\n<p>Có nhiều biện pháp để tránh <strong>Render Blocking CSS</strong> như: sử dụng <strong>media type</strong> hoặc <strong>media query</strong>, <strong>combine CSS</strong>, <strong>inline CSS</strong>, những thay đổi này tuy nhỏ nhưng ảnh hưởng rất tốt đến <strong>perfomance</strong></p>\n<h2 id=\"tham-khảo\" style=\"position:relative;\"><a href=\"#tham-kh%E1%BA%A3o\" aria-label=\"tham khảo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tham khảo</h2>\n<ul>\n<li><a href=\"https://web.dev/render-blocking-resources/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Eliminate render-blocking resources\n</a></li>\n<li><a href=\"https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-blocking-css\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Render Blocking CSS</a></li>\n<li><a href=\"https://varvy.com/pagespeed/render-blocking-css.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://varvy.com/pagespeed/render-blocking-css.html</a></li>\n<li><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Performance\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Chrome Performance API</a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/PerformanceObserver\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PerformanceObserver</a>, <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">PerformancePaintTiming</a></li>\n</ul>","fields":{"slug":"/posts/render-blocking-css-and-chrome-performance-api","tagSlugs":["/tag/render-blocking-resources/","/tag/render-blocking-css/","/tag/perfomance/","/tag/chrome-performance-api/"]},"frontmatter":{"date":"2020-09-12T02:12:03.284Z","description":"Mỗi file CSS mà website của bạn tải sẽ tăng thêm thời gian vào first-paint của page, có nghĩa là user sẽ phải đợi lâu hơn để nhìn thấy content nếu trang của bạn phải tải nhiều CSS. Vậy phải làm thế nào để hạn chế được render blocking css?","tags":["render-blocking-resources","render-blocking-css","perfomance","chrome-performance-api"],"title":"Tìm hiểu về Render Blocking CSS và đo page rendering time với Chrome Performance API","socialImage":"/media/book-header.jpg","headerImage":"/media/book-header.jpg"},"timeToRead":7}},"pageContext":{"slug":"/posts/render-blocking-css-and-chrome-performance-api"}}}