<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Leo's Blog - Leo's coding journey]]></title><description><![CDATA[Coding and all other stuff related to a dev's life]]></description><link>https://leohuynh.dev</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 08 Aug 2021 15:19:39 GMT</lastBuildDate><item><title><![CDATA[Tricky use case of Array.prototype.map in JS]]></title><description><![CDATA[If you are familiar with functional programming, Array.prototype.map must be a function that you work with every day. We encountered a tricky use case of it at Cốc Cốc recently, it took me a while to figure out, and here's the answer...]]></description><link>https://leohuynh.dev/posts/tricky-use-case-of-array-map-in-js</link><guid isPermaLink="false">https://leohuynh.dev/posts/tricky-use-case-of-array-map-in-js</guid><pubDate>Mon, 21 Sep 2020 22:12:03 GMT</pubDate><content:encoded>&lt;p&gt;If you are familiar with &lt;a href=&quot;https://en.wikipedia.org/wiki/Functional_programming&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;functional programming&lt;/a&gt;, &lt;strong&gt;Array.prototype.map&lt;/strong&gt; must be a &lt;strong&gt;function&lt;/strong&gt; that you work with every day.&lt;/p&gt;
&lt;p&gt;For me, &lt;strong&gt;map()&lt;/strong&gt; is a powerful function, but there might be some tricky use case of it that you don’t know about!&lt;/p&gt;
&lt;p&gt;Let’s walk through some basic knowledge&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;map()&lt;/strong&gt; method creates a new array from the calling array by applying a provided &lt;strong&gt;callback function&lt;/strong&gt; once for each element of the calling array&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;simple-use-cases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#simple-use-cases&quot; aria-label=&quot;simple use cases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Simple use cases&lt;/h2&gt;
&lt;p&gt;Giving this array&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; devs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Leo&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; yob&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1995&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Paul&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; yob&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1995&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Jesse&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; yob&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1996&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; id&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Ken&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; yob&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1997&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What can we do using &lt;strong&gt;map()&lt;/strong&gt; function:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting new values from array&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; devs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dev&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; currentYear &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFullYear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; currentYear &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; dev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;yob
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ages&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; [25, 25, 24, 23]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Extracting values from array of objects&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; names &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; devs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dev&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; dev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;names&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; [&quot;Leo&quot;, &quot;Paul&quot;, &quot;Jesse&quot;, &quot;Ken&quot;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Rendering list in React application&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;DeveloperProfiles&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; devs &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				devs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dev&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;dev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;tricky-use-case&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tricky-use-case&quot; aria-label=&quot;tricky use case permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tricky use case&lt;/h2&gt;
&lt;p&gt;It is common to pass the pre-defined &lt;strong&gt;callback&lt;/strong&gt; function as &lt;strong&gt;map()&lt;/strong&gt; argument like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;extractId&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; dev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; devs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;extractId&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ids&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But this habit may lead to unexpected behaviors with &lt;strong&gt;functions&lt;/strong&gt; that take additional &lt;strong&gt;arguments&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Consider this case - we need to get all &lt;strong&gt;ids&lt;/strong&gt; as &lt;strong&gt;numbers&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// ids = [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; idsInNumber &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ids&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parseInt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;idsInNumber&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; ???&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might expect the result is &lt;code class=&quot;language-text&quot;&gt;[1, 2, 3, 4]&lt;/code&gt;, but the actual result is &lt;code class=&quot;language-text&quot;&gt;[1, NaN, NaN, NaN]&lt;/code&gt; 😮😮&lt;/p&gt;
&lt;p&gt;We encountered this problem at &lt;a href=&quot;https://coccoc.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Cốc Cốc&lt;/a&gt; recently, it took me a while to figure out, and here’s the answer…&lt;/p&gt;
&lt;p&gt;Usually, we use &lt;strong&gt;map()&lt;/strong&gt; callback with 1 &lt;strong&gt;argument&lt;/strong&gt; (the element being traversed), but &lt;strong&gt;Array.prototype.map&lt;/strong&gt; passes 3 arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;element&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;index&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;calling array&lt;/strong&gt; (which we don’t use most of the time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the callback in this case - &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;parseInt&lt;/a&gt; is often used with 1 &lt;strong&gt;argument&lt;/strong&gt; but it takes 2:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Syntax&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;string &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; radix&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;string&lt;/code&gt;: the value to parse&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;radix&lt;/code&gt; &lt;strong&gt;[Optional]&lt;/strong&gt;: an integer that represent the &lt;strong&gt;radix&lt;/strong&gt; (the base in mathematical numeral systems) - usually, it’s &lt;strong&gt;10&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; 10&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; 10&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; 2&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;10&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; 4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And here you can see the source of confusion 👀!&lt;/p&gt;
&lt;p&gt;The third &lt;strong&gt;argument&lt;/strong&gt; of &lt;strong&gt;map()&lt;/strong&gt; is ignored by &lt;strong&gt;parseInt&lt;/strong&gt; - but &lt;strong&gt;&lt;em&gt;not&lt;/em&gt;&lt;/strong&gt; the second one!&lt;/p&gt;
&lt;p&gt;Hence, the &lt;strong&gt;iteration&lt;/strong&gt; steps of &lt;strong&gt;map()&lt;/strong&gt; look like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// map(parseInt) =&gt; map(parseInt(value, index))&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* index is 0 */&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; 1&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* index is 1 */&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; NaN&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* index is 2 */&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; NaN&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;/* index is 3 */&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; NaN&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;solution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solution&quot; aria-label=&quot;solution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solution&lt;/h2&gt;
&lt;p&gt;As you’ve known the source of the problem, the solution is not to pass all of the &lt;strong&gt;map()&lt;/strong&gt;’s arguments to your &lt;strong&gt;callback&lt;/strong&gt; if you’re not sure how it works&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Passing only the arguments that your callback needs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;returnInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;element&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;returnInt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// =&gt; [1, 2, 3, 4]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Same as above, but using the concise arrow function syntax&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Better use this if you don&apos;t need to re-use the callback&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;numb&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numb&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// =&gt; [1, 2, 3, 4]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A simpler way to achieve our case like &lt;a href=&quot;https://github.com/airbnb/javascript#coercion--numbers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Airbnb style guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// =&gt; [1, 2, 3, 4]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And that’s what I know about &lt;strong&gt;Array.prototype.map&lt;/strong&gt; function, feel free to share your use case in the comment section 👇&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
&lt;h2 id=&quot;references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Array.prototype.map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/denysdovhan/wtfjs#parseint-is-a-bad-guy&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;strong&gt;parseInt&lt;/strong&gt; is a bad guy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wirfs-brock.com/allen/posts/166&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;A JavaScript Optional Argument Hazard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codesource.io/use-cases-of-array-map-you-should-know&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://codesource.io/use-cases-of-array-map-you-should-know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/airbnb/javascript#coercion--numbers&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://github.com/airbnb/javascript#coercion—numbers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Javascript - function declaration vs function expression]]></title><description><![CDATA[Phân biệt 2 khái niệm cơ bản trong Javascript - Function Declaration vs Function Expression và các trường hợp sử dụng]]></description><link>https://leohuynh.dev/posts/function-declaration-vs-function-expression-in-js</link><guid isPermaLink="false">https://leohuynh.dev/posts/function-declaration-vs-function-expression-in-js</guid><pubDate>Wed, 16 Sep 2020 22:12:03 GMT</pubDate><content:encoded>&lt;p&gt;Post này chỉ là 1 &lt;strong&gt;note&lt;/strong&gt; nhỏ của mình cho những &lt;strong&gt;dev&lt;/strong&gt; hay quên về 2 khái niệm &lt;strong&gt;function declaration&lt;/strong&gt; và &lt;strong&gt;function expression&lt;/strong&gt; để mỗi lần nhắc đến chỉ việc vào đây xem lại chứ không cần phải &lt;strong&gt;google&lt;/strong&gt; nữa 😅😅&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/take-note.gif&quot; alt=&quot;Take note&quot;&gt;&lt;/p&gt;
&lt;p&gt;Chắc hẳn anh em ngày ngày làm việc với &lt;strong&gt;javascript&lt;/strong&gt; sẽ viết rất nhiều &lt;strong&gt;function&lt;/strong&gt; với các cú pháp như:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// function declaration&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// hoặc&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doSomething&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// function expression&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// hoặc&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doSomething&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// function expression&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cách viết đầu tiên chính là &lt;strong&gt;function declaration&lt;/strong&gt;, và 2 cách sau là &lt;strong&gt;function expression&lt;/strong&gt;, vậy chúng khác gì nhau và sử dụng như thế nào?&lt;/p&gt;
&lt;h2 id=&quot;definition&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#definition&quot; aria-label=&quot;definition permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Definition&lt;/h2&gt;
&lt;p&gt;Khác biết đầu tiên chính là cách định nghĩa &lt;strong&gt;function&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Function declaraion&lt;/strong&gt; được khai báo với từ khóa &lt;code class=&quot;language-text&quot;&gt;function&lt;/code&gt; và &lt;strong&gt;luôn&lt;/strong&gt; bao gồm tên của &lt;strong&gt;function&lt;/strong&gt; đó&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Function expression&lt;/strong&gt; được khai báo tương tự như &lt;strong&gt;function declaraion&lt;/strong&gt; nhưng được gán vào 1 &lt;strong&gt;biến&lt;/strong&gt; và sẽ chạy khi được gọi qua &lt;strong&gt;biến&lt;/strong&gt; đó, tên của &lt;strong&gt;function&lt;/strong&gt; có thể bỏ đi (&lt;strong&gt;anonymous function&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doSomething&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Anonymous function in ES6 syntax&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;doSomething&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;hoisting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hoisting&quot; aria-label=&quot;hoisting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Hoisting&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hoisting&lt;/strong&gt; là 1 cơ chế của &lt;strong&gt;Javascript&lt;/strong&gt; thể hiện việc đưa &lt;strong&gt;function&lt;/strong&gt; và &lt;strong&gt;variable&lt;/strong&gt; lên trên cùng của &lt;strong&gt;scope&lt;/strong&gt; trước khi &lt;strong&gt;code&lt;/strong&gt; được thực thi.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hoisting&lt;/strong&gt; chỉ áp dụng &lt;strong&gt;function declarations&lt;/strong&gt;, không áp dụng cho &lt;strong&gt;function expressions&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Có thế hiểu đơn giản qua ví dụ sau:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; &quot;Hello&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bạn có thể &lt;strong&gt;call&lt;/strong&gt; &lt;strong&gt;function declaration&lt;/strong&gt; ở bất cứ đâu trong &lt;strong&gt;scope&lt;/strong&gt; nó khởi tạo&lt;/p&gt;
&lt;p&gt;Tuy nhiên &lt;strong&gt;function expression&lt;/strong&gt; chỉ có thể gọi sau khi định nghĩa&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sayHello&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// =&gt; Uncaught ReferenceError: Cannot access &apos;sayHello&apos; before initialization&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;sayHello&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Tùy theo thói quen của &lt;strong&gt;dev&lt;/strong&gt; và &lt;strong&gt;rule&lt;/strong&gt; của &lt;strong&gt;project&lt;/strong&gt; hoặc &lt;strong&gt;team leader&lt;/strong&gt; đặt ra mà có thể sử dụng 1 trong 2 cách &lt;strong&gt;define function&lt;/strong&gt; này.&lt;/p&gt;
&lt;p&gt;Tuy nhiên có 1 số trường hợp đặc biệt để sử dụng &lt;strong&gt;function expression&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;iife&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#iife&quot; aria-label=&quot;iife permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IIFE&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mariusschulz.com/blog/use-cases-for-javascripts-iifes&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Immediately Invoked Function Expressions&lt;/a&gt; hay 1 &lt;strong&gt;anonymous function&lt;/strong&gt; được chạy ngay sau khi khởi tạo&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Code runs!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ES6&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Code runs!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;callback&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#callback&quot; aria-label=&quot;callback permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Callback&lt;/h2&gt;
&lt;p&gt;1 trường hợp sử dụng &lt;strong&gt;function expression&lt;/strong&gt; nữa đó là dùng làm &lt;strong&gt;callback&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;buttonElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;click&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;button is clicked!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;hoặc&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// do stuff to an item&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Đây là trường hợp phổ biến sử dụng &lt;strong&gt;function expression&lt;/strong&gt; vì chúng ta không cần biết đến &lt;strong&gt;function&lt;/strong&gt; này trong toàn bộ scope&lt;/p&gt;
&lt;p&gt;Tóm lại, có thể sử dụng linh hoạt 2 cách &lt;strong&gt;define function&lt;/strong&gt; trên, nếu muốn 1 &lt;strong&gt;function&lt;/strong&gt; có thể sử dụng linh hoạt nhiều nơi trong &lt;strong&gt;scope&lt;/strong&gt; thì sử dụng &lt;strong&gt;function declaration&lt;/strong&gt; còn nếu chỉ cần giới hạn trong 1 thời điểm sử dụng thì dùng &lt;strong&gt;function expression&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;tham-khảo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tham-kh%E1%BA%A3o&quot; aria-label=&quot;tham khảo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tham khảo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Function declaration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Operators/function&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Function expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/when-to-use-a-function-declarations-vs-a-function-expression-70f15152a0a0/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.freecodecamp.org/news/when-to-use-a-function-declarations-vs-a-function-expression-70f15152a0a0/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gomakethings.com/function-expressions-vs-function-declarations/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://gomakethings.com/function-expressions-vs-function-declarations/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Tìm hiểu về Render Blocking CSS và đo page rendering time với Chrome Performance API]]></title><description><![CDATA[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?]]></description><link>https://leohuynh.dev/posts/render-blocking-css-and-chrome-performance-api</link><guid isPermaLink="false">https://leohuynh.dev/posts/render-blocking-css-and-chrome-performance-api</guid><pubDate>Sat, 12 Sep 2020 02:12:03 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt; được &lt;strong&gt;browser&lt;/strong&gt; xem là 1 trong những &lt;strong&gt;render blocking resources&lt;/strong&gt; - 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&lt;/p&gt;
&lt;h2 id=&quot;tại-sao-nên-tránh-render-blocking-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t%E1%BA%A1i-sao-n%C3%AAn-tr%C3%A1nh-render-blocking-css&quot; aria-label=&quot;tại sao nên tránh render blocking css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tại sao nên tránh Render Blocking CSS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Render blocking CSS&lt;/strong&gt; sẽ làm chậm việc hiển thị &lt;strong&gt;website&lt;/strong&gt; của bạn đến người dùng&lt;/li&gt;
&lt;li&gt;Mỗi file CSS mà &lt;strong&gt;website&lt;/strong&gt; của bạn tải sẽ tăng thêm thời gian vào &lt;strong&gt;first-paint&lt;/strong&gt; của page, có nghĩa là &lt;strong&gt;user&lt;/strong&gt; sẽ phải đợi lâu hơn để nhìn thấy &lt;strong&gt;content&lt;/strong&gt; nếu trang của bạn phải tải nhiều &lt;strong&gt;CSS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;img src=&quot;/media/render-blocking-css.png&quot; style=&quot;box-shadow: none;&quot;&gt;
&lt;br /&gt;
&lt;small&gt;CSS ảnh hưởng rất nhiều đến thời gian hiển thị trang&lt;/small&gt;
&lt;br /&gt;
&lt;p&gt;Khi bắt đầu tải trang, &lt;strong&gt;browser&lt;/strong&gt; sẽ luôn tự động tải tất cả các file &lt;strong&gt;CSS&lt;/strong&gt;, không quan tâm đến việc nó có &lt;strong&gt;block&lt;/strong&gt; quá trình &lt;strong&gt;render&lt;/strong&gt; hay không!&lt;/p&gt;
&lt;p&gt;Vậy phải làm thế nào để hạn chế được &lt;strong&gt;render blocking css&lt;/strong&gt; ?&lt;/p&gt;
&lt;h2 id=&quot;solutions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#solutions&quot; aria-label=&quot;solutions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Solutions&lt;/h2&gt;
&lt;p&gt;Nếu như bạn nhận thấy trang của mình có những &lt;strong&gt;CSS&lt;/strong&gt; mà chỉ sử dụng trong 1 vài điều kiện nhất định ví dụ như &lt;strong&gt;style&lt;/strong&gt; cho &lt;strong&gt;content&lt;/strong&gt; bên trong 1 &lt;strong&gt;modal&lt;/strong&gt; mà &lt;strong&gt;user&lt;/strong&gt; phải &lt;strong&gt;click&lt;/strong&gt; để open modal mới thấy, &lt;strong&gt;content&lt;/strong&gt; bên trong &lt;strong&gt;tab&lt;/strong&gt; không hiển thị đầu tiên, hoặc những style chỉ &lt;strong&gt;apply&lt;/strong&gt; riêng cho &lt;strong&gt;large monitor&lt;/strong&gt; hoặc &lt;strong&gt;mobile devices&lt;/strong&gt;…&lt;/p&gt;
&lt;p&gt;Thì đây là 1 số cách có thể giúp trang của bạn tải nhanh hơn&lt;/p&gt;
&lt;h3 id=&quot;sử-dụng-media-attribute&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#s%E1%BB%AD-d%E1%BB%A5ng-media-attribute&quot; aria-label=&quot;sử dụng media attribute permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sử dụng media attribute&lt;/h3&gt;
&lt;p&gt;Khi muốn &lt;strong&gt;load css&lt;/strong&gt; vào &lt;strong&gt;web page&lt;/strong&gt; của mình chúng ta sẽ sử dụng thẻ &lt;code class=&quot;language-text&quot;&gt;link&lt;/code&gt; như thế này&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;style.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;print.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;style.mobile.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Browser&lt;/strong&gt; sau khi load xong &lt;strong&gt;HTML&lt;/strong&gt; sẽ tải thêm 3 file &lt;strong&gt;CSS&lt;/strong&gt; này nữa và chỉ hiển thị nội dung sau khi đã tải xong tất cả&lt;/p&gt;
&lt;p&gt;Tuy nhiên &lt;code class=&quot;language-text&quot;&gt;print.css&lt;/code&gt; chỉ dùng khi in &lt;strong&gt;document&lt;/strong&gt; (&lt;strong&gt;Ctrl/Cmd + P&lt;/strong&gt;) và &lt;code class=&quot;language-text&quot;&gt;style.mobile.css&lt;/code&gt; là những &lt;strong&gt;style&lt;/strong&gt; chỉ &lt;strong&gt;apply&lt;/strong&gt; trên &lt;strong&gt;mobile&lt;/strong&gt; mà thôi&lt;/p&gt;
&lt;p&gt;Trong trường hợp này chúng ta có thể sử dụng &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-media&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;media attribute&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;style.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;print.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;print&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;style.mobile.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(max-width: 568px)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lúc này &lt;strong&gt;browser&lt;/strong&gt; sẽ hiểu rằng chỉ cần tải xong file &lt;strong&gt;style.css&lt;/strong&gt; 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&lt;/p&gt;
&lt;p&gt;Đối với &lt;strong&gt;link&lt;/strong&gt; sử dụng &lt;strong&gt;media attribute&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;media=&amp;quot;print&amp;quot;&lt;/code&gt;: những &lt;strong&gt;style&lt;/strong&gt; trong file này sẽ chỉ &lt;strong&gt;apply&lt;/strong&gt; khi in &lt;strong&gt;document&lt;/strong&gt;, không cần cho &lt;strong&gt;render&lt;/strong&gt; nên sẽ không &lt;strong&gt;block&lt;/strong&gt; lần &lt;strong&gt;render&lt;/strong&gt; đầu tiên khi tải trang&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;media=&amp;quot;(max-width: 568px)&amp;quot;&lt;/code&gt;: những &lt;strong&gt;style&lt;/strong&gt; này chỉ &lt;strong&gt;apply&lt;/strong&gt; trên những &lt;strong&gt;device&lt;/strong&gt; với &lt;code class=&quot;language-text&quot;&gt;max-witdh = 568px&lt;/code&gt; và cũng không &lt;strong&gt;block&lt;/strong&gt; lần &lt;strong&gt;render&lt;/strong&gt; đầu tiên khi tải trang trên &lt;strong&gt;desktop/tablet device&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sử dụng &lt;strong&gt;media attribute&lt;/strong&gt; 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)…&lt;/p&gt;
&lt;p&gt;Giá trị của &lt;strong&gt;media&lt;/strong&gt; bắt buộc phải là 1 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media#Description&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;media type&lt;/a&gt; hoặc &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;media query&lt;/a&gt;, rất hữu ích khi cần &lt;strong&gt;load&lt;/strong&gt; các &lt;strong&gt;external stylesheets&lt;/strong&gt; - nó hỗ trợ &lt;strong&gt;browser&lt;/strong&gt; lựa chọn được những &lt;strong&gt;CSS&lt;/strong&gt; cần thiết nhất cho lần &lt;strong&gt;render&lt;/strong&gt; đầu tiên&lt;/p&gt;
&lt;h3 id=&quot;combine-css-or-inline-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#combine-css-or-inline-css&quot; aria-label=&quot;combine css or inline css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Combine css or inline css&lt;/h3&gt;
&lt;p&gt;1 cách khá hiệu quả là các bạn có thể để trực tiếp &lt;strong&gt;CSS&lt;/strong&gt; vào trong 1 thẻ &lt;code class=&quot;language-text&quot;&gt;style&lt;/code&gt; trên &lt;strong&gt;header&lt;/strong&gt; của &lt;strong&gt;document&lt;/strong&gt; nếu &lt;strong&gt;CSS&lt;/strong&gt; không quá to, cách này cải thiện &lt;strong&gt;performance&lt;/strong&gt; rất tốt khi chỉ cần &lt;strong&gt;DOM&lt;/strong&gt; load xong là có thể hiển thị ngay được rồi&lt;/p&gt;
&lt;p&gt;Hoặc có thể hạn chế tải nhiều file &lt;strong&gt;CSS&lt;/strong&gt; quá. Thông thường khi &lt;strong&gt;code&lt;/strong&gt; các &lt;strong&gt;dev&lt;/strong&gt; sẽ có xu hướng tách ra nhiều file &lt;strong&gt;CSS&lt;/strong&gt; khác nhau theo &lt;strong&gt;component&lt;/strong&gt;, &lt;strong&gt;module&lt;/strong&gt;… để dễ quản lý, tuy nhiên việc &lt;strong&gt;load&lt;/strong&gt; nhiều file &lt;strong&gt;CSS&lt;/strong&gt; sẽ lâu hơn so với chỉ &lt;strong&gt;load&lt;/strong&gt; 1 hoặc 2 file&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/inline-css.png&quot; alt=&quot;inline-css&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;1 trong những kĩ thuật giúp &lt;b&gt;Gatsby site&lt;/b&gt; tải rất nhanh chính là &lt;b&gt;Inline CSS&lt;/b&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;performance-api&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#performance-api&quot; aria-label=&quot;performance api permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Performance API&lt;/h2&gt;
&lt;p&gt;Bây giờ chúng ta hãy thử đo đạc &lt;strong&gt;page rendering time&lt;/strong&gt; sau khi áp dụng 1 số kĩ thuật để tránh &lt;strong&gt;Render Blocking CSS&lt;/strong&gt; với &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Performance&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Chrome Perfomance API&lt;/a&gt; nhé&lt;/p&gt;
&lt;p&gt;Mình có viết 1 ví dụ đơn giản để các bạn có thể hiểu về &lt;strong&gt;Render Blocking CSS&lt;/strong&gt; ở đây: &lt;a href=&quot;https://hta218.github.io/render-blocking-css-example/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://hta218.github.io/render-blocking-css-example/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Trong ví dụ mình có load 2 file &lt;strong&gt;CSS&lt;/strong&gt; và so sánh &lt;strong&gt;page rendering time&lt;/strong&gt; với 2 màn hình có &lt;strong&gt;device-width&lt;/strong&gt; lớn hơn và nhỏ hơn &lt;strong&gt;800px&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;tailwind.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(min-width: 800px)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;stylesheet&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;bootstrap.css&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;(min-width: 800px)&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Để sử dụng &lt;strong&gt;Performance API&lt;/strong&gt; thì cần chú ý kiểm tra kĩ &lt;strong&gt;browser compatibility&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;PerformanceObserver&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// Create PerformanceObserver instance&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; perfObsever &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;PerformanceObserver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;perf&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; perfEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; perf&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEntriesByType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;paint&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			perfEntries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; startTime &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;// Get the result inside this callback&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;The time to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; was &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;startTime&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; milliseconds.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

		&lt;span class=&quot;token comment&quot;&gt;// observe &quot;paint&quot; event&lt;/span&gt;
		perfObsever&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; entryTypes&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;paint&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// Remember to check the browser compatibility before using this API&lt;/span&gt;
	console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Performance API isn&apos;t supported!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Có nhiều &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Performance metric&lt;/a&gt; khác nhau, trong trường hợp này mình sử dụng &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PerformancePaintTiming&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Để thấy rõ hơn kết quả các bạn có thể mở &lt;strong&gt;chrome devtool&lt;/strong&gt; lên, &lt;strong&gt;throttle internet&lt;/strong&gt; và &lt;strong&gt;CPU speed&lt;/strong&gt; cho giống với điều kiện ở máy &lt;strong&gt;user&lt;/strong&gt; hơn nhé&lt;/p&gt;
&lt;p&gt;Với màn hình &lt;strong&gt;&gt;800px&lt;/strong&gt; (ví dụ cho &lt;strong&gt;load&lt;/strong&gt; tất cả các &lt;strong&gt;CSS&lt;/strong&gt; trước &lt;strong&gt;first page render&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/css-block-render.png&quot; alt=&quot;css-block-render&quot;&gt;&lt;/p&gt;
&lt;p&gt;Chúng ta cần hơn &lt;strong&gt;6 giây&lt;/strong&gt; cho &lt;strong&gt;first paint&lt;/strong&gt; (sau khi tất cả &lt;strong&gt;CSS load&lt;/strong&gt; xong) - tương đương với &lt;strong&gt;user&lt;/strong&gt; phải đợi &lt;strong&gt;6s&lt;/strong&gt; mới thấy nội dung của &lt;strong&gt;page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Với trường hợp chỉ cần load 1 file &lt;strong&gt;CSS&lt;/strong&gt; cho &lt;strong&gt;first paint&lt;/strong&gt; (các file còn lại vẫn được &lt;strong&gt;load&lt;/strong&gt; nhưng không dùng đến hoặc không cần dùng cho lần &lt;strong&gt;render&lt;/strong&gt; đầu tiên)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/css-not-block-render.png&quot; alt=&quot;css-not-block-render&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt; nhìn thấy &lt;strong&gt;content&lt;/strong&gt; sớm hơn &lt;strong&gt;2 giây&lt;/strong&gt;, có thể thấy &lt;strong&gt;page render&lt;/strong&gt; ngay cả khi 2 file &lt;strong&gt;CSS&lt;/strong&gt; còn lại vẫn chưa &lt;strong&gt;load&lt;/strong&gt; xong&lt;/p&gt;
&lt;p&gt;Kết quả đo đạc với &lt;strong&gt;Performance API&lt;/strong&gt; được tổng hợp lại&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/render-result.png&quot; alt=&quot;render-result&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hoặc đơn giản hơn, các bạn có thể sử dụng trực tiếp &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PerformancePaintTiming API&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;performance&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; performance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;performance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; perfEntries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; performance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getEntriesByType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;paint&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	perfEntries&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; startTime &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;The time to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;name&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; was &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;startTime&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; milliseconds.&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Performance timing isn&apos;t supported.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;kết-bài&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k%E1%BA%BFt-b%C3%A0i&quot; aria-label=&quot;kết bài permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kết bài&lt;/h2&gt;
&lt;p&gt;Có thể thấy sự khác biệt rõ rệt với &lt;strong&gt;page rendering time&lt;/strong&gt;, ảnh hưởng trực tiếp đến &lt;strong&gt;user’s experience&lt;/strong&gt; khi &lt;strong&gt;webpage&lt;/strong&gt; phải tải quá nhiều &lt;strong&gt;CSS&lt;/strong&gt; không cần thiết, vì vậy chúng ta cần phải rất chú ý đến &lt;strong&gt;resource&lt;/strong&gt; này.&lt;/p&gt;
&lt;p&gt;Có nhiều biện pháp để tránh &lt;strong&gt;Render Blocking CSS&lt;/strong&gt; như: sử dụng &lt;strong&gt;media type&lt;/strong&gt; hoặc &lt;strong&gt;media query&lt;/strong&gt;, &lt;strong&gt;combine CSS&lt;/strong&gt;, &lt;strong&gt;inline CSS&lt;/strong&gt;, những thay đổi này tuy nhỏ nhưng ảnh hưởng rất tốt đến &lt;strong&gt;perfomance&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;tham-khảo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tham-kh%E1%BA%A3o&quot; aria-label=&quot;tham khảo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tham khảo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/render-blocking-resources/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Eliminate render-blocking resources
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-blocking-css&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Render Blocking CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://varvy.com/pagespeed/render-blocking-css.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://varvy.com/pagespeed/render-blocking-css.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Performance&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Chrome Performance API&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/PerformanceObserver&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PerformanceObserver&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PerformancePaintTiming&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PerformancePaintTiming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Tích hợp Tailwind CSS vào React application]]></title><description><![CDATA[Tailwind CSS là 1 low-level CSS framework rất dễ tùy biến, không như các framework khác khi tập trung vào các pre-design components như buttons, cards, modals... có thể giúp bạn phát triển nhanh ban đầu nhưng sau đó sẽ rất mất công để custom các component có sẵn, Tailwind tập trung vào low-level utility classes...]]></description><link>https://leohuynh.dev/posts/integrate-tailwind-css-with-react-application</link><guid isPermaLink="false">https://leohuynh.dev/posts/integrate-tailwind-css-with-react-application</guid><pubDate>Sun, 30 Aug 2020 22:12:03 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://tailwindcss.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Tailwind CSS&lt;/a&gt; là 1 &lt;strong&gt;low-level&lt;/strong&gt; CSS framework rất dễ tùy biến, không như những framework, UI Kits khác khi tập trung vào các &lt;strong&gt;pre-design components&lt;/strong&gt; (buttons, cards, modals…) có thể giúp bạn phát triển nhanh ban đầu nhưng sau đó sẽ rất mất công để custom styling cho các component đó. Tailwind tập trung vào low-level utility classes (&lt;strong&gt;utility-first&lt;/strong&gt;) giúp bạn tự build hoàn toàn design của mình mà không phải lo lắng về việc &lt;strong&gt;override&lt;/strong&gt; các &lt;strong&gt;style&lt;/strong&gt; có sẵn.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/tailwindcss.png&quot; alt=&quot;Tailwind CSS example&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small style=&quot;padding: 0px 30px&quot;&gt;Khá giống với &lt;strong&gt;Bootstrap&lt;/strong&gt; nhưng bộ utility class của &lt;strong&gt;Tailwind CSS&lt;/strong&gt; phong phú hơn rất nhiều&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Bài này mình sẽ hướng dẫn anh em cách để tích hợp Tailwind CSS vào React app nhé  😄 😄&lt;/p&gt;
&lt;h2 id=&quot;tạo-react-app&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t%E1%BA%A1o-react-app&quot; aria-label=&quot;tạo react app permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tạo react app&lt;/h2&gt;
&lt;p&gt;Cách đơn giản nhất để tạo react app là sử dụng &lt;a href=&quot;https://create-react-app.dev/docs/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;create-react-app&lt;/a&gt; script với &lt;code class=&quot;language-text&quot;&gt;npx&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npx create-react-app my-app &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; my-app&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sử dụng &lt;code class=&quot;language-text&quot;&gt;npx&lt;/code&gt; anh em có thể chạy &lt;code class=&quot;language-text&quot;&gt;create-react-app&lt;/code&gt; script mà không cần phải cài &lt;strong&gt;package&lt;/strong&gt; này&lt;/p&gt;
&lt;h2 id=&quot;thêm-dependencies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#th%C3%AAm-dependencies&quot; aria-label=&quot;thêm dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thêm dependencies&lt;/h2&gt;
&lt;p&gt;Cài đặt các &lt;strong&gt;dependency&lt;/strong&gt; sau để set up &lt;strong&gt;Tailwind CSS&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; tailwindcss postcss-cli autoprefixer -D
&lt;span class=&quot;token comment&quot;&gt;## hoặc npm install tailwindcss postcss-cli autoprefixer --save-dev&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Chỉ cần thêm vào &lt;strong&gt;devDependencies&lt;/strong&gt; thôi nhé&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Ở đây ngoài &lt;strong&gt;Tailwind CSS&lt;/strong&gt; chúng ta cài thêm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/postcss/postcss&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PostCSS&lt;/a&gt;: 1 công cụ để phân tích và chuyển đổi &lt;strong&gt;styling&lt;/strong&gt; bằng các &lt;strong&gt;JS plugin&lt;/strong&gt;, giúp bạn gợi ý &lt;strong&gt;CSS&lt;/strong&gt;, hỗ trợ &lt;strong&gt;variables&lt;/strong&gt; và &lt;strong&gt;mixins&lt;/strong&gt;, biên dịch các CSS mới…&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/postcss/autoprefixer&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Autoprefixer&lt;/a&gt;: 1 plugin của &lt;strong&gt;PostCSS&lt;/strong&gt; hỗ trợ việc thêm các &lt;a href=&quot;https://www.lifewire.com/css-vendor-prefixes-3466867&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;vendor prefix&lt;/a&gt;(&lt;code class=&quot;language-text&quot;&gt;-webkit-&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;-moz-&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;-ms-&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;-o-&lt;/code&gt;,…) bằng cách lấy thông tin từ &lt;a href=&quot;https://caniuse.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Can I Use&lt;/a&gt; để CSS bạn viết có thể tương thích ở nhiều trình duyệt khác nhau&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;config-postcss&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#config-postcss&quot; aria-label=&quot;config postcss permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Config PostCSS&lt;/h2&gt;
&lt;p&gt;PostCSS giúp quản lý và cấu hình việc build CSS.&lt;/p&gt;
&lt;p&gt;Tạo file config:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; postcss.config.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Thêm config sau:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    plugins&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;tailwindcss&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;autoprefixer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Quá trình &lt;strong&gt;build&lt;/strong&gt; sử dụng 2 &lt;strong&gt;plugin&lt;/strong&gt; là &lt;code class=&quot;language-text&quot;&gt;tailwindcss&lt;/code&gt; và &lt;code class=&quot;language-text&quot;&gt;autoprefixer&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;injecting-tailwind-css&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#injecting-tailwind-css&quot; aria-label=&quot;injecting tailwind css permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Injecting Tailwind CSS&lt;/h2&gt;
&lt;p&gt;Tạo 1 &lt;strong&gt;sub-folder&lt;/strong&gt; là &lt;strong&gt;styles&lt;/strong&gt; trong folder &lt;strong&gt;src&lt;/strong&gt;. Trong folder &lt;strong&gt;styles&lt;/strong&gt; tạo file &lt;strong&gt;tailwind.css&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hoặc dùng &lt;strong&gt;command line&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; src/styles &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; src/styles/tailwind.css&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Import&lt;/strong&gt; các &lt;strong&gt;module&lt;/strong&gt; sau của Tailwind CSS&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@tailwind&lt;/span&gt; base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@tailwind&lt;/span&gt; components&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token atrule&quot;&gt;&lt;span class=&quot;token rule&quot;&gt;@tailwind&lt;/span&gt; utilities&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;small&gt;tailwind.css&lt;/small&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Folder&lt;/strong&gt; chứa file &lt;strong&gt;tailwind.css&lt;/strong&gt; các bạn có thể đặt tùy ý theo &lt;strong&gt;project&lt;/strong&gt; của mình nhé, có thể là &lt;code class=&quot;language-text&quot;&gt;src/static&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;src/assets&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;src/styles&lt;/code&gt; …&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;thêm-build-script&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#th%C3%AAm-build-script&quot; aria-label=&quot;thêm build script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Thêm build script&lt;/h2&gt;
&lt;p&gt;Mở file &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt;, thêm &lt;strong&gt;build script&lt;/strong&gt; sau (vào object &lt;code class=&quot;language-text&quot;&gt;scripts&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;build:css&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;postcss src/styles/tailwind.css -o src/styles/main.css&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Script này sẽ sử dụng &lt;a href=&quot;https://github.com/postcss/postcss-cli&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PostCSS CLI&lt;/a&gt; để build css dựa trên những &lt;strong&gt;config&lt;/strong&gt; trong file &lt;strong&gt;tailwind.css&lt;/strong&gt; với output (flag &lt;code class=&quot;language-text&quot;&gt;-o&lt;/code&gt;) là file &lt;strong&gt;main.css&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anh em có thể tùy ý chọn tên file và vị trí, ở đây mình để cả file &lt;strong&gt;input&lt;/strong&gt; chứa &lt;strong&gt;config&lt;/strong&gt; và &lt;strong&gt;output&lt;/strong&gt; trong cùng 1 folder là &lt;code class=&quot;language-text&quot;&gt;src/styles&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bây giờ anh em có thể tự &lt;strong&gt;trigger&lt;/strong&gt; build bằng lệnh:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; build:css
&lt;span class=&quot;token comment&quot;&gt;# hoặc npm run build:css&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sau khi config và build xong, project của bạn sẽ trông như thế này:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/tailwind-project.png&quot; alt=&quot;Project structure&quot;&gt;&lt;/p&gt;
&lt;p&gt;Để tiện hơn thì các bạn nên tích hợp &lt;code class=&quot;language-text&quot;&gt;build:css&lt;/code&gt; command vào script &lt;code class=&quot;language-text&quot;&gt;start&lt;/code&gt; và &lt;code class=&quot;language-text&quot;&gt;build&lt;/code&gt; của &lt;strong&gt;project&lt;/strong&gt;, như vậy sẽ đảm bảo CSS luôn đc build lại theo những update mới nhất của mình mỗi lần &lt;strong&gt;start project&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm run build:css &amp;amp;&amp;amp; react-scripts start&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm run build:css &amp;amp;&amp;amp; react-scripts build&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react-scripts test&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;eject&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;react-scripts eject&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;build:css&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;postcss src/styles/tailwind.css -o src/styles/main.css&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Tất cả &lt;strong&gt;scripts&lt;/strong&gt; sau khi hoàn thiện&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Bây giờ để build CSS và start project thì chỉ cần &lt;code class=&quot;language-text&quot;&gt;yarn start&lt;/code&gt; là đủ.&lt;/p&gt;
&lt;h2 id=&quot;sử-dụng-trong-react-component&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#s%E1%BB%AD-d%E1%BB%A5ng-trong-react-component&quot; aria-label=&quot;sử dụng trong react component permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sử dụng trong react component&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Import&lt;/strong&gt; CSS đã build vào file start của &lt;strong&gt;project&lt;/strong&gt; (của mình là &lt;code class=&quot;language-text&quot;&gt;index.js&lt;/code&gt;):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;./styles/main.css&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ... other imports&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;small&gt;index.js&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Tạo 1 component cơ bản:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; React &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;react&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex justify-center pt-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;max-w-sm w-full lg:max-w-full lg:flex shadow-lg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;h-48 lg:h-auto lg:w-48 flex-none bg-cover rounded-t lg:rounded-t-none lg:rounded-l text-center overflow-hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; backgroundImage&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;url(&apos;https://image-us.24h.com.vn/upload/1-2020/images/2020-02-06/kodfd-1580928361-474-width640height480.jpg&apos;)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Woman holding a mug&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;border-r border-b border-l border-gray-400 lg:border-l-0 lg:border-t lg:border-gray-400 bg-white rounded-b lg:rounded-b-none lg:rounded-r p-4 flex flex-col justify-between leading-normal&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;mb-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-sm text-gray-600 flex items-center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Latest News&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
					&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-gray-900 font-bold text-xl mb-2&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Messi is moving to Manchester City&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
					&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-gray-700 text-base&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatibus quia, nulla! Maiores et perferendis eaque, exercitationem praesentium nihil.&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;flex items-center&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
					&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;w-10 h-10 rounded-full mr-4&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRG2WOlZ4KLuNN1ksjNOmh6oZ091IUhJiZD7w&amp;amp;usqp=CAU&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Avatar of Jonathan Reinink&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
					&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-sm&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
						&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-gray-900 leading-none&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Jonathan Reinink&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
						&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;className&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text-gray-600&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;Aug 18&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
					&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
				&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
			&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
		&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
	&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; App&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;small&gt;App.js&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Kết quả sẽ trông như thế này:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/messi.jpg&quot; alt=&quot;Tailwind css result&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;kết-bài&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k%E1%BA%BFt-b%C3%A0i&quot; aria-label=&quot;kết bài permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kết bài&lt;/h2&gt;
&lt;p&gt;Hi vọng anh em có thể tích hợp và sử dụng &lt;strong&gt;Tailwind CSS&lt;/strong&gt; trong &lt;strong&gt;project&lt;/strong&gt; của mình qua &lt;a href=&quot;/category//tutorial&quot;&gt;tutorial&lt;/a&gt; này, cá nhân mình thấy đây là 1 &lt;strong&gt;framework&lt;/strong&gt; khá đơn giản và dễ sử dụng, chất lượng ổn.&lt;/p&gt;
&lt;p&gt;Anh em để lại nhận xét cho mình ở dưới comment nhé :D&lt;/p&gt;
&lt;h2 id=&quot;tham-khảo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tham-kh%E1%BA%A3o&quot; aria-label=&quot;tham khảo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tham khảo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tailwindcss.com/docs/installation&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Tailwind CSS Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://create-react-app.dev/docs/getting-started/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Create React App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codingthesmartway.com/using-tailwind-css-with-react/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://codingthesmartway.com/using-tailwind-css-with-react/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2020/02/tailwindcss-react-project/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.smashingmagazine.com/2020/02/tailwindcss-react-project/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Set up path aliases trong Node.js + Typescript]]></title><description><![CDATA[Nếu như có thể định nghĩa alias (hiểu đơn giản là shortcut) cho những module mà chúng ta thường xuyên phải import trong toàn bộ project thì code sẽ đơn giản như thế nào... ]]></description><link>https://leohuynh.dev/posts/set-up-path-aliases-in-nodejs</link><guid isPermaLink="false">https://leohuynh.dev/posts/set-up-path-aliases-in-nodejs</guid><pubDate>Wed, 26 Aug 2020 22:12:03 GMT</pubDate><content:encoded>&lt;p&gt;Dạo gần đây mình đang code 1 &lt;strong&gt;pet project&lt;/strong&gt; sử dụng &lt;strong&gt;nodejs&lt;/strong&gt; ở &lt;strong&gt;back-end&lt;/strong&gt;, vừa để tự học thêm trong thời gian rảnh vừa khỏi quên kiến thức, thì gặp phải 1 vấn để rất nhức nhối liên quan đến đường dẫn (&lt;strong&gt;path&lt;/strong&gt;) mà có thể anh em đã gặp phải nhiều rồi…&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; saveUser &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../../../models/User&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; homeController &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;../../../../../controllers/home&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Code này hẳn đã khiến nhiều anh em đau đầu khi không thể biết được cần phải đi ra, đi vào bao nhiêu &lt;strong&gt;folder&lt;/strong&gt; để tìm đúng &lt;strong&gt;file&lt;/strong&gt; mong muốn 😭😭, nếu chẳng may cần chuyển chỗ 1 folder thì sẽ phải update lại &lt;strong&gt;path&lt;/strong&gt; ở tất cả những file &lt;strong&gt;import&lt;/strong&gt; module đó 😤&lt;/p&gt;
&lt;p&gt;Nhưng nếu chúng ta có thể định nghĩa &lt;strong&gt;alias&lt;/strong&gt; (hiểu đơn giản là &lt;strong&gt;shortcut&lt;/strong&gt;) cho những &lt;strong&gt;module&lt;/strong&gt; thường xuyên phải &lt;strong&gt;import&lt;/strong&gt; trong toàn bộ project thì sao?&lt;/p&gt;
&lt;p&gt;Ví dụ như này:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; saveUser &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@models/User&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; homeController &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@controllers/home&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Trong đó:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;@models&lt;/code&gt; tương đương với module &lt;code class=&quot;language-text&quot;&gt;./src/models/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;@controllers&lt;/code&gt; tương đương với module &lt;code class=&quot;language-text&quot;&gt;./src/controllers/*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Giải pháp hoàn toàn đơn giản với &lt;a href=&quot;https://www.npmjs.com/package/module-alias&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;module-alias&lt;/a&gt; và config &lt;code class=&quot;language-text&quot;&gt;tsconfig.json&lt;/code&gt;. Anh em làm theo hướng dẫn để set up nhé&lt;/p&gt;
&lt;h2 id=&quot;update-tsconfigjson&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#update-tsconfigjson&quot; aria-label=&quot;update tsconfigjson permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Update tsconfig.json&lt;/h2&gt;
&lt;p&gt;Mở file &lt;strong&gt;tsconfig.json&lt;/strong&gt; lên và thêm vào những config sau vào &lt;strong&gt;compilerOptions&lt;/strong&gt; object:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;compilerOptions&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// other configs...&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;baseUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./src&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;paths&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
					&lt;span class=&quot;token string&quot;&gt;&quot;node_modules/*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
					&lt;span class=&quot;token string&quot;&gt;&quot;src/types/*&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;@controllers/*&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
					&lt;span class=&quot;token string&quot;&gt;&quot;controllers/*&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token property&quot;&gt;&quot;@models/*&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
					&lt;span class=&quot;token string&quot;&gt;&quot;models/*&quot;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Trong đó &lt;code class=&quot;language-text&quot;&gt;@controllers&lt;/code&gt; hay &lt;code class=&quot;language-text&quot;&gt;@models&lt;/code&gt; chính là &lt;strong&gt;alias&lt;/strong&gt; cho module của các bạn (có thể dùng bất cứ &lt;strong&gt;naming convention&lt;/strong&gt; nào tùy ý, không cần thiết phải chứa &lt;code class=&quot;language-text&quot;&gt;@&lt;/code&gt; ở đầu, đó chỉ là &lt;strong&gt;prefix&lt;/strong&gt; mình dùng để dễ phân biệt thôi)&lt;/p&gt;
&lt;p&gt;Bây giờ bạn hoàn toàn có thể sử dụng &lt;strong&gt;alias&lt;/strong&gt; đã config trong project rồi, nhưng JS sẽ không &lt;strong&gt;resolve&lt;/strong&gt; được module import với lỗi sau&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[Node] Error: Cannot find module ‘@models/User’&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cài-đặt-module-alias-package&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#c%C3%A0i-%C4%91%E1%BA%B7t-module-alias-package&quot; aria-label=&quot;cài đặt module alias package permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cài đặt module-alias package&lt;/h2&gt;
&lt;p&gt;Module này sẽ giúp &lt;strong&gt;resolve&lt;/strong&gt; các &lt;strong&gt;path alias&lt;/strong&gt; trong file JS sau khi biên dịch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Cài đặt:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i --save module-alias &lt;span class=&quot;token comment&quot;&gt;# hoặc yarn add module-alias&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Config trong &lt;strong&gt;package.json&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;_moduleAliases&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;@models&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist/models&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;&quot;@controllers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dist/controllers&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lưu ý rằng &lt;code class=&quot;language-text&quot;&gt;dist/&lt;/code&gt; là &lt;strong&gt;folder&lt;/strong&gt; chứa code sau khi &lt;strong&gt;build&lt;/strong&gt; của các bạn nhé (tùy vào config nó có thể là &lt;code class=&quot;language-text&quot;&gt;dist/&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;build/&lt;/code&gt;…)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cuối cùng là register module vào app của anh em&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;module-alias/register&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Chỉ cần &lt;strong&gt;import&lt;/strong&gt; 1 lần vào file &lt;strong&gt;start&lt;/strong&gt; của project thôi nhé (có thể là &lt;code class=&quot;language-text&quot;&gt;index.ts&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;app.ts&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;server.ts&lt;/code&gt;…)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-done&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-done&quot; aria-label=&quot; done permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;🎉🎉🎉 Done&lt;/h2&gt;
&lt;p&gt;Bây giờ anh em chỉ cần reload &lt;strong&gt;IDE&lt;/strong&gt;, &lt;strong&gt;start project&lt;/strong&gt; và có thể xài &lt;strong&gt;alias&lt;/strong&gt; thoải mái rồi nhé.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/vscode.png&quot; alt=&quot;VS Code Recommendation&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS Code&lt;/strong&gt; support luôn tính năng này bằng cách đọc file &lt;strong&gt;tsconfig.json&lt;/strong&gt;, chỉ cần &lt;strong&gt;reload&lt;/strong&gt; lại là được.&lt;/p&gt;
&lt;p&gt;Chúc anh em thành công!&lt;/p&gt;
&lt;h2 id=&quot;tham-khảo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tham-kh%E1%BA%A3o&quot; aria-label=&quot;tham khảo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tham khảo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/zero-equals-false/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://medium.com/zero-equals-false/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/larswaechter/path-aliases-with-typescript-in-nodejs-4353&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://dev.to/larswaechter/path-aliases-with-typescript-in-nodejs-4353&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Việc tìm dev như thế nào? [Part 2] - Phỏng vấn, nhận offer và đi làm]]></title><description><![CDATA[Quy trình phỏng vấn dev như thế nào? Làm sao để deal được lương ngon và tìm được công ty tốt để phát triển sự nghiệp...]]></description><link>https://leohuynh.dev/posts/viec-tim-dev-nhu-the-nao-part-2</link><guid isPermaLink="false">https://leohuynh.dev/posts/viec-tim-dev-nhu-the-nao-part-2</guid><pubDate>Fri, 31 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/posts/viec-tim-dev-nhu-the-nao&quot;&gt;Phần trước&lt;/a&gt; mình đã chia sẻ với anh em cách chuẩn bị &lt;strong&gt;profile&lt;/strong&gt;, viết &lt;strong&gt;CV&lt;/strong&gt;, nhận &lt;strong&gt;job description&lt;/strong&gt; và apply vào vị trí mình mong muốn, nếu được gọi phỏng vấn thì anh em có thể tham khảo các kinh nghiệm phỏng vấn, deal lương của mình để nhận được &lt;strong&gt;offer&lt;/strong&gt; tốt nhé.&lt;/p&gt;
&lt;p&gt;Mình chọn được 1 số vị trí phù hợp để ứng tuyển và nhận được lời mời phỏng vấn ngay&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/interview1.png&quot; alt=&quot;Interview Calendar&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;1 vài chiếc interview&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;chuẩn-bị-và-sắp-xếp-thời-gian&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#chu%E1%BA%A9n-b%E1%BB%8B-v%C3%A0-s%E1%BA%AFp-x%E1%BA%BFp-th%E1%BB%9Di-gian&quot; aria-label=&quot;chuẩn bị và sắp xếp thời gian permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Chuẩn bị và sắp xếp thời gian&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Nếu anh em phỏng vấn offline thì chỉ nên hẹn 1 lần phỏng vấn 1 buổi thôi nhé, thời gian nói chuyện làm quen, test, phỏng vấn là khá mất thời gian đấy. Mình không thể đảm bảo được sẽ mất 1 hay 2 tiếng nên nếu mất quá nhiều thời gian là đến muộn buổi phỏng vấn tiếp theo thì dễ bị 1 điểm trừ nhé 😅&lt;/li&gt;
&lt;li&gt;Vì mình phỏng vấn vào đợt cách ly xã hội, hầu hết công ty đều &lt;strong&gt;work from home&lt;/strong&gt; nên tất cả đều là &lt;strong&gt;online interview&lt;/strong&gt;, nếu anh em cũng phỏng vấn online thì có thể sắp xếp được 2 shot phỏng vấn 1 buổi do không mất thời gian đi lại và chuẩn bị nhiều, chú ý hẹn lịch cách nhau để đủ thời gian nhé&lt;/li&gt;
&lt;li&gt;Nếu có nhiều buổi phỏng vấn thì anh em nên chủ động note lại vào &lt;strong&gt;calendar&lt;/strong&gt;, tải cả app để nhắc nhở mình khỏi quên&lt;/li&gt;
&lt;li&gt;Tốt nhất nên sắp xếp phỏng vấn trong 1,2 tuần nếu anh em đã nghỉ hẳn việc nhé, nghỉ nhiều thì không có tiền tiêu :)). Phỏng vấn trong lúc còn đi làm thì nên cách ngày ra không có sếp cũ quạo nha 😅😅&lt;/li&gt;
&lt;li&gt;Nên tìm hiểu trước về công ty, xem sản phẩm họ đang làm là gì, sử dụng công nghệ nào… có nơi sẽ hỏi ứng viên xem có biết mình vào sẽ làm sản phẩm gì không, chuẩn bị trước sẽ giúp bạn ghi điểm trong tình huống này&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;vòng-gửi-xe&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#v%C3%B2ng-g%E1%BB%ADi-xe&quot; aria-label=&quot;vòng gửi xe permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Vòng gửi xe&lt;/h2&gt;
&lt;p&gt;1 số công ty sẽ gửi bài test trước yêu cầu làm trong 1 vài ngày, hoặc cho test ngay tại buổi phỏng vấn, kinh nghiệm của mình phần này là anh em hãy coi đây như 1 task bình thường lúc mình đi làm, hỏi người phỏng vấn bạn thật kĩ để hiểu rõ &lt;strong&gt;requirements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anh em hãy xem người phỏng vấn như 1 đồng nghiệp của mình, hỏi ngay nếu cần bất kì sợ giúp đỡ nào. Bạn chắc chắn sẽ được đánh giá cao hơn nếu trao đổi với người phỏng vấn thay vì chỉ ngồi im code hối hả từ đầu đến cuối&lt;/p&gt;
&lt;h2 id=&quot;round-1️⃣&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#round-1%EF%B8%8F%E2%83%A3&quot; aria-label=&quot;round 1️⃣ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Round 1️⃣&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/round1.jpg&quot; alt=&quot;Round 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;Sau khi pass bài test sẽ đến &lt;strong&gt;technical interview&lt;/strong&gt;, bạn sẽ được phỏng vấn về kĩ thuật với &lt;strong&gt;Senior/Team Leader/Tech Lead/CTO&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Có công ty sẽ chỉ phỏng vấn bằng tiếng việt, có công ty cả việt cả anh, thông thường họ sẽ hỏi mình có phỏng vấn được bằng tiếng anh không, hoặc sẽ làm bài test tiếng anh trước. Nếu có thể mình khuyên các bạn nên phỏng vấn bằng tiếng anh nhé.&lt;/p&gt;
&lt;p&gt;Mình có 2 chiếc interview full tiếng anh, còn lại là technical tiếng việt sau đó sẽ có hr phỏng vấn tiếng anh (chủ đề tự do). Làm việc trong môi trường tiếng anh sẽ rất có ích cho sự nghiệp của bạn sau này (mình hiểu rất rõ vì hiện giờ sếp mình người Nga, ngày nào đi làm cũng nói tiếng anh &lt;del&gt;gãy&lt;/del&gt; với ổng hết…)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/english.jpg&quot; alt=&quot;Speak english&quot;&gt;&lt;/p&gt;
&lt;p&gt;Trong lúc phỏng vấn thì anh em chú ý có gì nói nấy thôi nhé, hãy nói hết ý hiểu của mình khi được hỏi, không chém gió, không à ừ mất thời gian, nếu câu nào mình không biết, không nhớ hoặc quá khó cứ thẳng thắn nói rằng mình không trả lời được&lt;/p&gt;
&lt;p&gt;Thường chỉ có 1 vòng phỏng vấn technical này thôi, nên đây là cơ hội duy nhất để người phỏng vấn đánh giá trình độ của bạn, vì vậy phần nào mà mình nắm chắc thì hãy trình bày tự tin, đầy đủ, chi tiết vào nhé!&lt;/p&gt;
&lt;p&gt;Anh em thấy đó, vòng phỏng vấn technical cũng không có gì phức tạp cả, cứ thoải mái ra là phỏng vấn ngon thôi 👏 👏&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chém thế chứ thật ra cũng run đấy 😅 =&gt; anh em đi phỏng vấn nhiều vào là sẽ tự tin ngay nhé 😎&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sau vòng này thường là các công ty sẽ trả lời xem mình có pass hay không, còn nếu anh em gặp các công ty không có tâm chờ mãi không thấy hr mail trả lời hay contact gì thì chắc suất là tạch rồi nhé&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/reject.png&quot; alt=&quot;Rejection&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Công ty có tâm thì cho dù reject cũng luôn báo cho ứng viên&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;round-2️⃣&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#round-2%EF%B8%8F%E2%83%A3&quot; aria-label=&quot;round 2️⃣ permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Round 2️⃣&lt;/h2&gt;
&lt;p&gt;Nếu hr contact anh em phỏng vấn vòng 2 thì chúc mừng anh em, đến đây thì 96.69% là pass nhé&lt;/p&gt;
&lt;p&gt;Vòng này thường sẽ là hr, pm, ceo, cto (tùy công ty)… sẽ join phỏng vấn cùng (không hỏi gì liên quan đến kĩ thuật) hầu hết đều là các câu hỏi để tìm hiểu thêm về mình, xem khả năng giao tiếp, tính cách, thái độ làm việc có hợp với văn hóa công ty hay không&lt;/p&gt;
&lt;p&gt;Phần này thì mình cứ ngoan ngoãn đối đáp thôi là ổn nhé (sếp nào cũng muốn nhân viên ngoan mà 😅)&lt;/p&gt;
&lt;p&gt; 🌟 1 điểm chú ý là ở vòng này thường bạn sẽ được hỏi về mức lương mong muốn (expected salary), theo kinh nghiệm của mình, anh em đừng nên đưa ra 1 con số cụ thể nhé! Hãy trả lời bằng khoảng lương mà anh em mong muốn. Ví dụ muốn lương $1k thì hãy trả lời là &lt;strong&gt;“mức lương mong muốn của em là từ 1k - 1k3”&lt;/strong&gt;, thường thì công ty chỉ trả mức &lt;strong&gt;minimum&lt;/strong&gt; mà mình yêu cầu thôi nên anh em chú ý nhé&lt;/p&gt;
&lt;p&gt;Sau đó sẽ hỏi đến ngày anh em có thể đi làm được, là mình thì sẽ không đi làm luôn mà chọn nghỉ 1,2 tuần cho thoải mái, tranh thủ đi đu đưa với gấu cho sướng 😁, anh em cũng nên nghỉ ngơi cho tinh thần thoải mái và chuẩn bị trước khi đi làm nhé!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Quy trình phỏng vấn mỗi công ty mỗi khác nhưng thông thường sẽ như trên, quan trọng nhất vẫn là anh em chuẩn bị kiến thức cho công việc mình làm thật chắc, tất cả những thứ khác chỉ là phụ thôi nhưng đều nên có để bản thân được đánh giá cao hơn, vì dev đâu phải chỉ code đâu đúng không? 😁&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;deal-lương-cao-ngon-ntn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deal-l%C6%B0%C6%A1ng-cao-ngon-ntn&quot; aria-label=&quot;deal lương cao ngon ntn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deal lương &lt;del&gt;cao&lt;/del&gt; ngon ntn?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Như mình đã nói, anh em nên đưa ra range lương mà mình muốn chứ không nên chỉ đưa ra 1 con số, hầu như các công ty sẽ không trả mức mà anh em mong muốn đâu (trừ khi anh em muốn quá ít thi ngta sẽ gật đầu cái rụp ngay nha 😅)&lt;/li&gt;
&lt;li&gt;Hãy sẵn sàng &lt;strong&gt;deal lương&lt;/strong&gt; nếu cảm thấy công ty trả thấp với khả năng của mình, đừng ngần ngại nói rằng mình mong muốn mức cao hơn họ trả, tuy nhiên lý do anh em đưa ra phải là hợp lý nhé, ví dụ như so sánh với mức lương cũ, hoặc 1 công ty khác có &lt;strong&gt;offer&lt;/strong&gt; cao hơn 1 chút nhưng mà mình muốn làm ở đây hơn! Chắc chắn anh em sẽ được trả cao hơn nếu chịu khó &lt;strong&gt;negotiate&lt;/strong&gt; nhé!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;làm-sao-tìm-được-công-ty-tốt&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#l%C3%A0m-sao-t%C3%ACm-%C4%91%C6%B0%E1%BB%A3c-c%C3%B4ng-ty-t%E1%BB%91t&quot; aria-label=&quot;làm sao tìm được công ty tốt permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Làm sao tìm được công ty tốt?&lt;/h2&gt;
&lt;p&gt;Sự nghiệp của anh em phụ thuộc rất nhiều vào nơi anh em làm việc, vậy làm sao để tìm được công ty tốt?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xem review&lt;/strong&gt;: anh em hãy tìm hiểu ngay về công ty của mình qua các kênh review như &lt;a href=&quot;https://reviewcongty.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;reviewcongty&lt;/a&gt;, &lt;a href=&quot;https://itviec.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;itviec&lt;/a&gt;, không nên quá tin vì nhiều công ty drama lắm, nhưng chỗ nào mà chửi nhiều quá thì anh em nên né nha vì công ty ngon thì ít khi ngta lên những chỗ thế này để khen, nhưng công ty mà nhiều người vào chê thì có vấn đề đấy. Anh em cũng có thể hỏi người quen làm ở đây, sẽ đáng tin cậy hơn nhiều nhé!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hỏi người phỏng vấn&lt;/strong&gt;: thường ngay sau khi phỏng vấn xong anh em sẽ được hỏi xem có thắc mắc hay câu hỏi gì không, lúc này anh em hãy cứ mạnh dạn hỏi những thứ sau nhé:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xin nhận xét của người phỏng vấn bạn về khả năng của mình sau khi phỏng vấn, đây chính là sếp của bạn sau này, người hằng ngày bạn sẽ làm việc, nói chuyện, gặp mặt nhiều hơn cả gặp người yêu.
Hỏi và chú ý cách họ phỏng vấn mình xem sếp có phải là 1 người vui vẻ, thoải mái, biết quan tâm không? Bạn không biết thì sẵn sàng chỉ cho bạn chứ không chê bai gì không?
&lt;br/&gt;
Đúng người thì anh em mới làm việc lâu dài được nhé, chứ gặp sếp khó đăm đăm, hay để ý, 3 bữa lại bảo e ở lại làm thêm 1 tý hoặc đến giờ về thì vào họp với &lt;del&gt;chị&lt;/del&gt; anh thì khó làm việc cùng lắm đấy!&lt;/li&gt;
&lt;li&gt;Hỏi về chính sách lương, thưởng của công ty, công ty có lương tháng 13 không? Benefit ntn? Bao nhiêu ngày phép 1 năm? Có &lt;strong&gt;remote working&lt;/strong&gt; không? công ty đóng bảo hiểm và thuế thu nhập cá nhân đầy đủ không?&lt;/li&gt;
&lt;li&gt;Hỏi về thời gian làm việc của team, có làm sáng thứ 7 không? công ty có hay OT không? Nếu OT thì trả lương cho nhân viên ntn?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Nhà tuyển dụng sẽ đánh giá cao khi bạn hỏi vì nó thể hiện sự nghiêm túc của bạn với công việc, nếu chọn thì bạn hãy tìm hiểu kĩ trước khi nhận offer nhé!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Đánh giá qua hr&lt;/strong&gt;: anh em hãy xem quá trình tiếp cận của hr, có quan tâm đến mình không, &lt;strong&gt;JD&lt;/strong&gt; có chuyên nghiệp không, hẹn giờ có chuẩn không, sau buổi phỏng vấn có hỏi han xem mình phỏng vấn thế nào… nếu họ được đào tạo ở công ty chuyên nghiệp thì chắc chắn sẽ luôn rất quan tâm đến ứng viên nhé.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kết-bài&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k%E1%BA%BFt-b%C3%A0i&quot; aria-label=&quot;kết bài permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kết bài&lt;/h2&gt;
&lt;p&gt;Hi vọng qua bài này anh em có thể nắm được quy trình tuyển dụng, biết cách chuẩn bị, trả lời phỏng vấn sao cho tốt, làm thế nào để deal lương ngon hay chọn được công ty tốt để phát triển sự nghiệp.&lt;/p&gt;
&lt;p&gt;Tuy nhu cầu tuyền dụng luôn rất cao nhưng dev cũng có dev this dev that, anh em hãy chú ý update kiến thức của mình liên tục, viết 1 profile đẹp, chăm đi phỏng vấn với 1 sự chuẩn bị kĩ càng và thái độ nghiêm túc thì chắc chắn sẽ luôn tìm được việc xịn lương cao!&lt;/p&gt;
&lt;p&gt;Hãy để công việc luôn tìm đến với dev nhé!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Việc tìm dev như thế nào? [Part 1] - Chuẩn bị profile]]></title><description><![CDATA[Hiện nay nhu cầu tuyển dụng ngành IT rất cao, là 1 software engineer bạn cần chuẩn bị những gì để có 1 công việc tốt và luôn được nhà tuyển dụng săn đón...]]></description><link>https://leohuynh.dev/posts/viec-tim-dev-nhu-the-nao</link><guid isPermaLink="false">https://leohuynh.dev/posts/viec-tim-dev-nhu-the-nao</guid><pubDate>Tue, 28 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Có thể anh em &lt;del&gt;đã&lt;/del&gt; chưa biết, mình mới chuyển công ty sang làm tại &lt;a href=&quot;https://coccoc.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Cốc Cốc&lt;/a&gt;, trải qua 2 tháng thử việc hiện nay mình đã là 1 nhân viên chính thức  🎉 🎉 🎉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/congrat.gif&quot; alt=&quot;Congratulations&quot; title=&quot;Congratulations&quot;&gt;&lt;/p&gt;
&lt;p&gt;Để có đc cơ hội này mình cũng đã trải qua cơ số cuộc phỏng vấn hay có, dở có. Bài này mình muốn chia sẻ với anh em cách chuẩn bị profile + phỏng vấn để có đc 1 công việc tốt nhé  😎!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Theo mình thấy, nhu cầu tuyển dụng ngành IT hiện nay là rất cao, sự thiếu hụt nhân lực cung &amp;#x3C; cầu sẽ còn kéo dài, do vậy chỉ cần có trình độ lập trình trên trung bình là hoàn toàn có thể tìm đc rất nhiều vị trí ứng tuyển với mức lương mình cho là ổn so với các ngành khác mà không cần nhờ vả hay quan hệ gì.&lt;/p&gt;
&lt;p&gt;Vậy làm sao để dev tìm đc công việc mà mình mong muốn 🤔?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Câu trả lời chính là ở cách bạn chuẩn bị chiếc &lt;strong&gt;profile&lt;/strong&gt; của mình!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;viết-cv&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vi%E1%BA%BFt-cv&quot; aria-label=&quot;viết cv permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Viết CV&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CV&lt;/strong&gt; chính là thứ tối thiểu nhưng lại cực kì quan trọng để bạn có đc 1 công việc, nếu chưa có bạn có thể google ngay từ khóa &lt;strong&gt;software developer/software engineer cv template&lt;/strong&gt; có rất nhiều mẫu để anh em có thể tham khảo và viết theo, tuy nhiên cần chú ý lựa chọn mẫu nào không quá màu mè, chỉ cần đơn giản, bố cục rõ ràng, dễ nhìn dễ đọc là đủ…&lt;/p&gt;
&lt;p&gt;Nên viết CV như thế nào?&lt;/p&gt;
&lt;h3 id=&quot;dos-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dos-&quot; aria-label=&quot;dos  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Do’s 👍&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CV của bạn phải có đầy đủ nội dung cần thiết cho nhà tuyển dụng, theo mình 2 phần quan trọng nhất là &lt;strong&gt;kỹ năng (skill)&lt;/strong&gt; và &lt;strong&gt;kinh nghiệm làm việc (working experiences)&lt;/strong&gt;, các bạn hãy trình bày hết những skill mà mình có (nhớ là chỉ những gì mình biết thôi nha, chém gió đến lúc người ta hỏi không trả lời đc là xấu hổ lắm đấy 😁😁), kinh nghiệm làm việc ở đây chính là những &lt;strong&gt;project&lt;/strong&gt; mà bạn đã kinh qua ở các cty trc, hay kể cả đồ án, bài tập lớn trong trường đại học.
&lt;br/&gt;
Bạn đã làm những gì, phụ trách công việc nào, có thành quả gì không?…&lt;/li&gt;
&lt;li&gt;Sắp xếp nội dung trong cv sao cho hợp lý, &lt;strong&gt;Kỹ năng&lt;/strong&gt; và &lt;strong&gt;Kinh nghiệm làm việc&lt;/strong&gt; là 2 phần đáng chú ý nhất, hãy xếp lên đầu, các phần còn lại như &lt;strong&gt;học tập&lt;/strong&gt;, &lt;strong&gt;thành tích&lt;/strong&gt;, &lt;strong&gt;side project&lt;/strong&gt; hay &lt;strong&gt;sở thích&lt;/strong&gt; thì hãy xếp xuống cuối, vì chúng k đc nhiều sự quan tâm, với mình những phần này cho vào chỉ để cv đẹp hơn thôi.&lt;/li&gt;
&lt;li&gt;Ngoài ra những thông tin thêm như điểm số, thành tích học tập, giải thưởng trong các cuộc thi hoặc recommendations từ &lt;strong&gt;ex-senior/ex-leader&lt;/strong&gt; cũng là 1 lợi thế  (cái này thì mình k có 😅)&lt;/li&gt;
&lt;li&gt;Nếu có khả năng tốt nhất nên viết CV của bạn bằng tiếng anh, theo mình đây là 1 điểm cộng lớn cho dev, vì ngành này tiếng anh là thực sự quan trọng&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;donts--&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#donts--&quot; aria-label=&quot;donts   permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Don’ts  👎&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Đừng kể tất cả những công nghệ mà bạn từng tiếp xúc, chỉ list những thứ mình đã kinh qua và có kinh nghiệm làm việc. Nếu bạn k hiểu về 1 skill mình viết trong cv thì sẽ k thể trả lời khi đc nhà tuyển dụng hỏi&lt;/li&gt;
&lt;li&gt;Không thêm thông tin dư thừa: các tài khoản mạng xã hội như &lt;strong&gt;facebook&lt;/strong&gt; hay &lt;strong&gt;instagram&lt;/strong&gt; không nên đưa vào vì không ai quan tâm đến chúng cả thậm chí còn thể hiện sự thiếu chuyên nghiệp với nhà tuyển dụng. Các bạn chỉ nên để những profile cá nhân như &lt;a href=&quot;https://github.com/hta218&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Github&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/hta218/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Linkedin&lt;/a&gt; hay các kênh contact cho công việc như &lt;strong&gt;Skype&lt;/strong&gt; hay &lt;strong&gt;Telegram&lt;/strong&gt;…&lt;/li&gt;
&lt;li&gt;Nếu để ảnh trong cv đừng nên để ảnh thiếu nghiêm túc, hãy chọn ảnh nghiêm túc của bạn hoặc có thể k cần ảnh trong cv, ng ta quan tâm đến bạn có làm đc việc k chứ k ai quan tâm bạn có đẹp chai khoai to hay k đâu (trừ vợ  😸)&lt;/li&gt;
&lt;li&gt;HTML: ⭐⭐⭐⭐⭐
&lt;br/&gt;
CSS: ⭐⭐⭐⭐⭐⭐⭐
&lt;br/&gt;
JavaScript: ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
&lt;br/&gt;
Progress bars or rankings to show off levels of skill are bullshit, never use them!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nếu k muốn tự viết anh em hoàn toàn có thể tìm các &lt;strong&gt;cv generator tool&lt;/strong&gt;, tuy nhiên mình khuyến khích anh em tự viết vì sẽ tiện nhất để customize theo ý muốn.&lt;/p&gt;
&lt;h2 id=&quot;tìm-cơ-hội&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t%C3%ACm-c%C6%A1-h%E1%BB%99i&quot; aria-label=&quot;tìm cơ hội permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tìm cơ hội&lt;/h2&gt;
&lt;p&gt;Mông má xong rồi thì ra chợ tìm mối thôi!&lt;/p&gt;
&lt;p&gt;Các kênh tuyển dụng là nơi dễ tìm kiếm cơ hội nhất, hãy tạo tài khoản cho mình ở 1 số kênh tuyển dụng lớn như:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://itviec.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://itviec.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://topdev.vn&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://topdev.vn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vietnamworks.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.vietnamworks.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1 số kênh bằng tiếng anh:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.linkedin.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://glints.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://glints.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.glassdoor.com&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.glassdoor.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chú ý tạo &lt;strong&gt;profile&lt;/strong&gt; đầy đủ, &lt;strong&gt;upload cv&lt;/strong&gt; và điền công việc mong muốn. Có thể bật thông báo hoặc subscribe để nhận thông tin về mail.&lt;/p&gt;
&lt;p&gt;Đảm bảo ngày nào cũng có các em hr xinh tươi gọi điện, nhắn tin mời về làm việc&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/comehere.gif&quot; alt=&quot;Come here babe&quot; title=&quot;Come here babe&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;kinh-nghiệm-bản-thân&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kinh-nghi%E1%BB%87m-b%E1%BA%A3n-th%C3%A2n&quot; aria-label=&quot;kinh nghiệm bản thân permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kinh nghiệm bản thân&lt;/h2&gt;
&lt;p&gt;Cá nhân mình thấy quan trọng nhất chính là &lt;strong&gt;Linkedin&lt;/strong&gt;, anh em hãy chú ý chuẩn bị 1 profile thật sáng sủa và đầy đủ ở đây (thậm chí còn có thể export cv từ profile &lt;strong&gt;Linkedin&lt;/strong&gt; hoặc import profile sang các kênh tuyển dụng khác)&lt;/p&gt;
&lt;p&gt;Hãy connect với thật nhiều người trong ngành, dev, hr, sale… mở rộng connection sẽ giúp các bạn nhận đc nhiều cơ hội tốt hơn.&lt;/p&gt;
&lt;p&gt;Bật chế độ &lt;strong&gt;Open for opportunity&lt;/strong&gt; để hr tìm đến bạn dễ dàng hơn (tuy nhiên khi có việc rồi anh em có thể tắt đi, vì các em hr spam tin nhắn và gọi điện nhiều lắm)&lt;/p&gt;
&lt;p&gt;Để chủ động hơn trong tìm kiếm cơ hội anh em có thể &lt;a href=&quot;https://www.linkedin.com/posts/hta218_webdeveloper-nodejs-reactjs-activity-6650609183601328128-pIci&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;post bài&lt;/a&gt; như mình&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/linkedin-post.png&quot; alt=&quot;Linkedin post&quot;&gt;&lt;/p&gt;
&lt;p&gt;Linkedin thực sự xịn khi giúp dev và hr connect&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/linkedin1.png&quot; alt=&quot;Linkedin 1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/linkedin2.png&quot; alt=&quot;Linkedin 2&quot;&gt;&lt;/p&gt;
&lt;p&gt;Sau đó là hàng loạt tin nhắn và cuộc gọi của hr trên mọi mặt trận&lt;/p&gt;
&lt;div class=&quot;img-group&quot;&gt;
  &lt;img src=&quot;/media/linkedin3.png&quot; width=&quot;33.33%&quot;/&gt;
  &lt;img src=&quot;/media/linkedin4.png&quot; width=&quot;33.33%&quot;/&gt;
  &lt;img src=&quot;/media/linkedin5.jpg&quot; width=&quot;33.33%&quot;/&gt;
&lt;/div&gt;
&lt;p&gt;Kinh nghiệm của mình là các bạn hãy hỏi hr đưa &lt;strong&gt;Job Description (JD)&lt;/strong&gt; trc, các bạn nên đọc kĩ để xem có fit với khả năng của mình k, cũng như công việc có phải là những việc thử thách, mình muốn làm hay k, công nghệ có phù hợp k…&lt;/p&gt;
&lt;p&gt;Tiếp theo hỏi &lt;strong&gt;range lương&lt;/strong&gt; cho vị trí đó ở cty, nếu &lt;del&gt;cao&lt;/del&gt; phù hợp thì mình apply ngay thôi.&lt;/p&gt;
&lt;p&gt;Khi đã xin JD rồi mà thấy k phù hợp thì các bạn cũng nên trả lời hr nhé, vì dù gì họ cũng đã mất công đưa thông tin cho mình rồi 😃.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/linkedin-jd.png&quot; alt=&quot;Linkedin JD&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;JD mà mình nhận đc (vẫn còn nhiều nữa 😅)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Các bạn thấy đấy, chỉ cần chuẩn bị 1 &lt;a href=&quot;https://www.linkedin.com/in/hta218/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;profile&lt;/a&gt; tốt và biết pr bản thân 1 chút là cơ hội đã tìm đến với mình rất nhiều rồi.&lt;/p&gt;
&lt;p&gt;Hi vọng sau phần này anh em nào đang có ý định nhảy việc sẽ tút tát lại &lt;strong&gt;profile&lt;/strong&gt; của mình để có nhiều cơ hội hơn, &lt;a href=&quot;/posts/viec-tim-dev-nhu-the-nao-part-2&quot;&gt;phần tiếp theo&lt;/a&gt; mình sẽ chia sẻ quá trình phỏng vấn, cách chọn công ty, deal lương và xách mông đi làm nhé!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Chia tay Bravebits - Từ Junior Developer đến Developer]]></title><description><![CDATA[Mình mới kết thúc 1 năm 8 tháng học tập và làm việc ở Bravebits (12/08/2018 - 17/04/2020). Dưới đây là đôi lời tâm sự chia sẻ về quá trình làm việc ở BB, nơi mình đã học đc vô số điểu bổ ích cả về công việc lẫn cuộc sống...]]></description><link>https://leohuynh.dev/posts/goodbye-bravebits-from-a-junior-developer-to-a-developer</link><guid isPermaLink="false">https://leohuynh.dev/posts/goodbye-bravebits-from-a-junior-developer-to-a-developer</guid><pubDate>Wed, 29 Apr 2020 16:20:03 GMT</pubDate><content:encoded>&lt;p&gt;Mình mới kết thúc 1 năm 8 tháng &lt;del&gt;fix bug&lt;/del&gt; học tập và làm việc ở &lt;a href=&quot;https://www.bravebits.co/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Bravebits&lt;/a&gt; (12/08/2018 - 17/04/2020)&lt;/p&gt;
&lt;img src=&quot;/media/sad.gif&quot; alt=&quot;Sad&quot; width=&quot;400&quot;&gt;
&lt;p&gt;Dưới đây là đôi lời tâm sự chia sẻ về quá trình làm việc ở BB, nơi mình đã học đc vô số điểu bổ ích cả về công việc và cuộc sống.&lt;/p&gt;
&lt;h2 id=&quot;phỏng-vấn-như-đi-chơi&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ph%E1%BB%8Fng-v%E1%BA%A5n-nh%C6%B0-%C4%91i-ch%C6%A1i&quot; aria-label=&quot;phỏng vấn như đi chơi permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Phỏng vấn như đi chơi&lt;/h2&gt;
&lt;p&gt;Cuối tháng 7/2018 mình nghỉ làm giảng viên lập trình tại &lt;a href=&quot;https://mindx.edu.vn/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;MindX Technology &amp;#x26; Startup School&lt;/a&gt; để tập trung vào con đường &lt;del&gt;fix bug&lt;/del&gt; trở thành 1 lập trình viên chuyên nghiệp.&lt;/p&gt;
&lt;p&gt;Theo dõi &lt;a href=&quot;https://www.facebook.com/bravebits&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;fanpage&lt;/a&gt; của BB từ ngày mới học lập trình đến nay mới có cơ hội nộp (mặc dù trc đó đã interview ở 1 số cty và cũng định bụng vào chỗ khác rồi 😅), đc vài hôm thì anh &lt;strong&gt;CEO&lt;/strong&gt; mail mời đến phỏng vấn…&lt;/p&gt;
&lt;p&gt;Ấn tượng đầu tiên là toà nhà tìm khó vãi (cái này nhiều ng tìm k đc chứ k phải mình &lt;del&gt;ngu&lt;/del&gt; k biết tìm nha). Đến nơi thì đc anh &lt;a href=&quot;https://www.facebook.com/iphongx&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Phong&lt;/a&gt; (&lt;strong&gt;CTO&lt;/strong&gt;) và &lt;a href=&quot;https://www.facebook.com/paul.the.phan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Minh&lt;/a&gt; (&lt;strong&gt;Technical Leader&lt;/strong&gt;) đưa vào bếp phỏng vấn.&lt;/p&gt;
&lt;p&gt;Không như các cty khác hỏi mình rất nhiều về kỹ thuật, anh Phong và Minh chả hỏi gì chỉ xem &lt;a href=&quot;https://github.com/hta218&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;github&lt;/a&gt;, đọc code và hỏi qua về các thứ mình đã làm. Anh Phong còn chỉ chú ý ngồi chơi thử &lt;a href=&quot;https://github.com/hta218/Travel_Egypt&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;game&lt;/a&gt; mình viết. Sau đó là: “Em có chơi game k”, “Có thích đi phượt k”, “Có nhậu không”…&lt;/p&gt;
&lt;p&gt;Phỏng vấn về mình thấy hơi thiếu chuyên nghiệp nên k có ý định vào, nhưng mấy hôm sau thì nhận đc tin cty mình thích reject (giờ nghĩ lại cũng thấy may) và thêm nữa anh &lt;strong&gt;CEO&lt;/strong&gt; đưa ra offer 1X.000.000 (x &gt; 1), với mình là ổn cho 1 sinh viên mới ra trường và thế là mối duyên tình với BB bắt đầu…&lt;/p&gt;
&lt;h2 id=&quot;đi-làm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%C4%91i-l%C3%A0m&quot; aria-label=&quot;đi làm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Đi làm&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/media/bb1.jpg&quot; alt=&quot;Team&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Mình (áo kẻ) trong 1 buổi họp cùng team&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Chính thức bắt đầu 1 cuộc sống giờ giấc, healthy và balance. Tháng đầu tiên mình đc giao học công nghệ, làm quen với app. Cảm thấy khá may mắn vì những thứ đc học đều là những thứ mình thích, sản phẩm chính (&lt;a href=&quot;https://apps.shopify.com/pagefly&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;PageFly&lt;/a&gt; - top 3 page builder app, &gt;25k users 👏) khá xịn công việc lại đc support bởi những anh em có rất nhiều kinh nghiệm và làm việc toàn chat với khách tây nên mấy tháng đầu kiến thức và trình tiếng anh của mình tăng vèo vèo…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/1A37Mgr.jpg&quot; alt=&quot;setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Set up những ngày đầu đi làm&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Công ty chu cấp đầy đủ trang thiết bị (Mac, phụ kiện …) cho anh em làm việc, cơm công ty (&lt;em&gt;gần bằng cơm gấu nhà mình nấu&lt;/em&gt;) rất ngon &lt;del&gt;vào mấy tháng mà tăng 5kg 🐷&lt;/del&gt;, lại thêm có sẵn bàn bóng bàn, máy PS cho anh em giải trí.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VWrOCHU.jpg&quot; alt=&quot;setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;Các xếp 3,4 tháng 1 lần lại tổ chức đi chơi, nhậu… thay đổi không khí&lt;/p&gt;
&lt;div class=&quot;img-group&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/gWCrENW.jpg&quot; alt=&quot;Cao bang&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/g6ODlLx.jpg&quot; alt=&quot;Tam Dao&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/Vk320YN.jpg&quot; alt=&quot;Quy Nhon&quot; width=&quot;33.33%&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Cao bằng - Tam đảo - Quy nhơn&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/IUR9Cfo.jpg&quot; alt=&quot;My Dinh&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;SVĐ Mỹ Đình - VN vs Malay&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/TujcCah.jpg&quot; alt=&quot;iD8 singapore&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Facebook iD8 - Singapore&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Quá trình làm việc cứ đều như vắt tranh, 8h đến công ty mở máy tính ra &lt;del&gt;lướt youtube&lt;/del&gt; check &lt;strong&gt;Crisp&lt;/strong&gt; support khách hàng, trong ngày tập trung vào &lt;del&gt;fix bug&lt;/del&gt; dev các feature mới, thỉnh thoảng &lt;del&gt;check fb&lt;/del&gt; hỗ trợ đội support, chiều đến lại code, họp, ăn rồi &lt;del&gt;đá pes&lt;/del&gt; về…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/OMY0EOL.jpg&quot; alt=&quot;BB choice awards&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;BB Choice Awards 2019&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;đồng-nghiệp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%C4%91%E1%BB%93ng-nghi%E1%BB%87p&quot; aria-label=&quot;đồng nghiệp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Đồng nghiệp&lt;/h2&gt;
&lt;p&gt;Ở BB có lẽ con người chính là nhân tố đáng trân trọng nhất, mình rất may mắn vì đã đc cùng làm việc với những người anh em tài giỏi, tốt bụng&lt;/p&gt;
&lt;h4 id=&quot;anh-quang-pm---không-chơi-fb&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#anh-quang-pm---kh%C3%B4ng-ch%C6%A1i-fb&quot; aria-label=&quot;anh quang pm   không chơi fb permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Anh Quang (PM) - không chơi fb&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/U3cdKsZ.jpg&quot; alt=&quot;Anh Quang&quot; width=&quot;450px&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Vịnh bắc bộ chưa tìm được người giỏi CSS hơn anh&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Một người xếp tốt nhất từ trc đến giờ đc làm việc cùng, tuy anh hơi già và ít tóc nhưng anh luôn quan tâm đến anh em, thường xuyên hỏi thăm công việc, cuộc sống và rất chu đáo với anh em.&lt;/p&gt;
&lt;p&gt;Không hiểu anh kén chọn hay sao mà tận đầu năm nay mới thấy lấy vợ, chúc anh chị trăm năm hạnh phúc sớm sinh quý tử 👦.&lt;/p&gt;
&lt;h4 id=&quot;minh-phan-technical-leader&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#minh-phan-technical-leader&quot; aria-label=&quot;minh phan technical leader permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.facebook.com/paul.the.phan&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Minh Phan (Technical Leader)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/irwAUD5.jpg&quot; alt=&quot;Imgur&quot;&gt;&lt;/p&gt;
&lt;p&gt;Có thể nói Minh là người mà mình ấn tượng nhất khi vào công ty, đẹp chai (khoai bé hơn mình), tài giỏi, luôn đảm bảo sự tin tưởng cho anh em trong việc đặc biệt là khả năng học hỏi và đáp ứng công nghệ mới là rất nhanh, Minh luôn là hình mẫu để mình học tập.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 41.86197916666667%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/iqMBJQEQqZA&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h4 id=&quot;và-những-người-anh-em-trên-bến-dưới-thuyền-khác&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#v%C3%A0-nh%E1%BB%AFng-ng%C6%B0%E1%BB%9Di-anh-em-tr%C3%AAn-b%E1%BA%BFn-d%C6%B0%E1%BB%9Bi-thuy%E1%BB%81n-kh%C3%A1c&quot; aria-label=&quot;và những người anh em trên bến dưới thuyền khác permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Và những người anh em trên bến dưới thuyền khác&lt;/h4&gt;
&lt;div class=&quot;img-group&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/MMPfTJt.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;A Phong&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/Vk320YN.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;Dung - Bao&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/bxZe3JI.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;Huong&quot; width=&quot;33.33%&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Anh Phong - Anh Dũng - Liquid Leader, Bảo - Hưởng&lt;/small&gt;&lt;/p&gt;
&lt;div class=&quot;img-group&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/LQbo7bz.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;Duy Anh&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/hx17EDB.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;Hung&quot; width=&quot;33.33%&quot;&gt;
  &lt;img src=&quot;https://i.imgur.com/RgZeMTl.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;Viet Anh - a Quyet&quot; width=&quot;33.33%&quot;&gt;
&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Duy Anh - Hùng - Việt Anh, Anh Quyết - Trưởng phòng IT&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Công ty nhân viên ít nhưng rất nhiều leader 😆😆&lt;/p&gt;
&lt;h2 id=&quot;kết-bài&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k%E1%BA%BFt-b%C3%A0i&quot; aria-label=&quot;kết bài permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kết bài&lt;/h2&gt;
&lt;div class=&quot;img-group&quot;&gt;
  &lt;img src=&quot;/media/bb2.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;view&quot; width=&quot;33.33%&quot;/&gt;
  &lt;img src=&quot;https://i.imgur.com/ZWlhVYR.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;decor&quot; width=&quot;33.33%&quot;/&gt;
  &lt;img src=&quot;https://i.imgur.com/ee9BtGn.jpg&quot; style=&quot;object-fit: cover;&quot; alt=&quot;decor&quot; width=&quot;33.33%&quot;/&gt;
&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Chia tay view đẹp từ văn phòng&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Khen thì nhiều nhưng sạn thì cũng cũng có 1 ít: nhiều lúc lương thưởng chưa đc hợp lý, cũng có đồng nghiệp this đồng nghiệp that, có những đợt anh em phải OT nhiều. Công ty bé nên dev đôi lúc phải cân thêm những việc khác k tập trung đc vào code, cty chưa biết giữ người giỏi…&lt;/p&gt;
&lt;p&gt;Tuy nhiên mình nghĩ công ty nào thì cũng có sạn cả thôi, quan trọng là mình sống chung với nó ntn.&lt;/p&gt;
&lt;p&gt;Gần 2 năm làm việc, buồn ít mà vui thì nhiều, mình đã học hỏi và phát triển bản thân hơn cả trong công việc và cuộc sống, từ 1 junior dev đến nay cũng đã đủ tự tin để xoá chữ &lt;del&gt;junior&lt;/del&gt; trong &lt;a href=&quot;/pages/resume&quot;&gt;CV&lt;/a&gt; của mình.&lt;/p&gt;
&lt;p&gt;Chúc các anh chị em ở lại luôn mạnh giỏi, thành công, chúc công ty phát triển hơn nữa 📈&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/xUPGcGyYhQTYtDtwBy/giphy.gif&quot; alt=&quot;Bye&quot;&gt;&lt;/p&gt;
&lt;p&gt;Tạm biệt Bravebits 👋 👋 👋&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Deploy và cấu hình website trên namecheap trong vòng 1 nốt nhạc [Part 2]]]></title><description><![CDATA[Ở phần trước mình đã hướng dẫn anh em mua và connect domain với hosting, activate SSL Certificate. Phần này mình sẽ hướng dẫn cách đẩy code lên server để website go live nhé 🚀 ...]]></description><link>https://leohuynh.dev/posts/deploy-and-config-website-on-namecheap-part-2</link><guid isPermaLink="false">https://leohuynh.dev/posts/deploy-and-config-website-on-namecheap-part-2</guid><pubDate>Sat, 25 Apr 2020 16:20:03 GMT</pubDate><content:encoded>&lt;p&gt;Ở &lt;a href=&quot;/posts/depoy-and-config-website-on-name-cheap-part-1&quot;&gt;phần trước&lt;/a&gt; mình đã hướng dẫn anh em mua và connect &lt;strong&gt;domain&lt;/strong&gt; với &lt;strong&gt;hosting&lt;/strong&gt;,  activate &lt;strong&gt;SSL Certificate&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Phần này mình sẽ hướng dẫn cách đẩy code lên &lt;strong&gt;server&lt;/strong&gt; để website go live nhé 🚀&lt;/p&gt;
&lt;h2 id=&quot;trên-server-có-những-gì-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tr%C3%AAn-server-c%C3%B3-nh%E1%BB%AFng-g%C3%AC-&quot; aria-label=&quot;trên server có những gì  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Trên server có những gì 👀?&lt;/h2&gt;
&lt;p&gt;Để tìm hiểu cấu trúc folder trên server anh em vào &lt;strong&gt;cPanel&lt;/strong&gt; (bài trc mình có hướng dẫn cách vào). Mở &lt;strong&gt;File Manager&lt;/strong&gt; trong section &lt;strong&gt;Files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/file-manager.png&quot; alt=&quot;cpanel file manager&quot;&gt;&lt;/p&gt;
&lt;p&gt;Đây chính là cấu trúc thư mục trên server! By default mình sẽ ở &lt;strong&gt;root directory&lt;/strong&gt; là &lt;code class=&quot;language-text&quot;&gt;/home/&amp;lt;cpanel-username&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Folder chúng ta cần quan tâm là &lt;code class=&quot;language-text&quot;&gt;./public_html&lt;/code&gt;, đây là nơi chứa toàn bộ source code (&lt;em&gt;html&lt;/em&gt;, &lt;em&gt;css&lt;/em&gt;, &lt;em&gt;js&lt;/em&gt;) của trang. Mục tiêu chính là đưa toàn bộ file code lên đây.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File Manager&lt;/strong&gt; cho phép upload trực tiếp file lên nhưng k cho upload &lt;strong&gt;folder&lt;/strong&gt; 💆. Chính vì vậy mình sử dụng 1 tool đc &lt;strong&gt;namecheap&lt;/strong&gt; &lt;a href=&quot;https://www.namecheap.com/support/knowledgebase/article.aspx/1279/205/how-to-set-up-filezilla/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;recommend&lt;/a&gt; là &lt;a href=&quot;https://filezilla-project.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;FileZilla&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;authorize-filezilla&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#authorize-filezilla&quot; aria-label=&quot;authorize filezilla permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Authorize FileZilla&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;FileZilla&lt;/strong&gt; sẽ kết nối và 🚚 lên &lt;strong&gt;server&lt;/strong&gt; thông qua việc truy cập đến server bằng FTP (&lt;strong&gt;File Transfer Protocol&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Để 1 &lt;strong&gt;middle-man&lt;/strong&gt; 👷 có thể giúp chúng ta đưa file lên &lt;strong&gt;server&lt;/strong&gt;, nghiễm nhiên cần cấp quyền cho tool đó =&gt; cần tạo 1 &lt;a href=&quot;https://www.namecheap.com/support/knowledgebase/article.aspx/9523/205/how-to-create-an-ftp-account&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;strong&gt;FTP Account&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;FileZilla&lt;/strong&gt; sẽ dùng tài khoản này để đưa code lên server cho chúng ta.&lt;/p&gt;
&lt;p&gt;Tạo 1 &lt;strong&gt;FTP Account&lt;/strong&gt; rất đơn giản:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vào &lt;strong&gt;cPanel&lt;/strong&gt;, click &lt;strong&gt;FPT Accounts&lt;/strong&gt; trong section &lt;strong&gt;Files&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nhập &lt;strong&gt;username&lt;/strong&gt;, &lt;strong&gt;password&lt;/strong&gt; (chú ý đừng quên nhé 😅).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/ftp.png&quot; alt=&quot;FTP Account&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note ⚠️:&lt;/strong&gt; 1 điểm cần chú ý khi tạo &lt;strong&gt;FTP Account&lt;/strong&gt; là anh em cần để &lt;code class=&quot;language-text&quot;&gt;access-directory&lt;/code&gt; cho account này là &lt;code class=&quot;language-text&quot;&gt;root-directory&lt;/code&gt; nhé, không thì account này sẽ k có quyền access vào &lt;code class=&quot;language-text&quot;&gt;./public_html&lt;/code&gt; folder đâu 😅.&lt;/p&gt;
&lt;h2 id=&quot;setup-filezilla&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setup-filezilla&quot; aria-label=&quot;setup filezilla permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setup FileZilla&lt;/h2&gt;
&lt;p&gt;Sau khi đã &lt;a href=&quot;https://filezilla-project.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;download&lt;/a&gt; và cài đặt &lt;strong&gt;FileZilla&lt;/strong&gt;, chúng ta sẽ connect đến server bằng &lt;strong&gt;FTP Account&lt;/strong&gt; vừa tạo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.namecheap.com/support/knowledgebase/article.aspx/1279/205/how-to-set-up-filezilla/#quickconnect&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Quick connect&lt;/a&gt; là cách đơn giản nhất để connect đến server, anh em cần 4 thông tin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Host name&lt;/strong&gt;: &lt;code class=&quot;language-text&quot;&gt;ftpes://&amp;lt;host-name&amp;gt;&lt;/code&gt; (đừng quên prefix &lt;code class=&quot;language-text&quot;&gt;ftpes://&lt;/code&gt; nhé!)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/hostname.png&quot; alt=&quot;Host name&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Host name ở ngay trên &lt;strong&gt;URL&lt;/strong&gt; trong &lt;strong&gt;cPanel&lt;/strong&gt;)&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;: chính là &lt;strong&gt;FTP Account&lt;/strong&gt; anh em vừa tạo, với format: &lt;code class=&quot;language-text&quot;&gt;&amp;lt;ftp-account-name&amp;gt;@&amp;lt;your-domain&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt;: auto là &lt;code class=&quot;language-text&quot;&gt;21&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cung cấp đủ thông tin rồi click &lt;strong&gt;Quickconnect&lt;/strong&gt;.
Phải thấy tín hiệu &lt;strong&gt;successful&lt;/strong&gt; thì mới đc nhé.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/filezilla.png&quot; alt=&quot;Connect to server via FileZilla&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Đừng giật mình khi thấy mất &lt;strong&gt;port&lt;/strong&gt; nhé, &lt;strong&gt;FileZilla&lt;/strong&gt; tự xoá đấy 😤)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;đẩy-code-lên-server&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%C4%91%E1%BA%A9y-code-l%C3%AAn-server&quot; aria-label=&quot;đẩy code lên server permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Đẩy code lên server&lt;/h2&gt;
&lt;p&gt;Phần phức tạp nhất đã xong 🙈 🙉, bây giờ đẩy code lên &lt;strong&gt;server&lt;/strong&gt; thôi!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/R2m2NzVxQ3pbG/giphy.gif&quot; alt=&quot;Close&quot;&gt;&lt;/p&gt;
&lt;p&gt;Trong &lt;strong&gt;FileZilla&lt;/strong&gt; gồm 2 phần:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local site&lt;/strong&gt;: toàn bộ thư mục trong máy, anh em tìm đến folder chứa code của mình (chú ý là phần code đã build nhé) - trong trường hợp này của mình là folder &lt;code class=&quot;language-text&quot;&gt;./public&lt;/code&gt; (có thể là &lt;code class=&quot;language-text&quot;&gt;./build&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;./dist&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;./public&lt;/code&gt; … tuỳ theo config app)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote site&lt;/strong&gt;: toàn bộ folder trên &lt;strong&gt;server&lt;/strong&gt;, anh em tìm đến &lt;code class=&quot;language-text&quot;&gt;./public_html&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/filezilla2.png&quot; alt=&quot;Close&quot;&gt;&lt;/p&gt;
&lt;p&gt;Chọn tất cả file ở &lt;strong&gt;Local&lt;/strong&gt; và kéo sang &lt;strong&gt;Remote&lt;/strong&gt; là … xong  🎉&lt;/p&gt;
&lt;p&gt;Bây giờ chỉ việc mở site của mình ra kiểm tra thành quả rồi fix lỗi typo thôi 😆😆😆&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://media.giphy.com/media/SfYTJuxdAbsVW/giphy.gif&quot; alt=&quot;Done&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;two-factor-authentication-optional&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#two-factor-authentication-optional&quot; aria-label=&quot;two factor authentication optional permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Two Factor Authentication (Optional)&lt;/h2&gt;
&lt;p&gt;Two Factor Authentication (&lt;strong&gt;2FA&lt;/strong&gt;) hay bảo mật 2 lớp (hoàn toàn free từ &lt;a href=&quot;https://www.namecheap.com/security/2fa-two-factor-authentication/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;namecheap&lt;/a&gt;) là việc thêm 1 lớp bảo mật cho tài khoản &lt;strong&gt;namecheap&lt;/strong&gt; (phải qua đc cả 2 lớp mới truy cập đc resource của mình - sẽ k lo lắng nếu chẳng may bị mất account vì lớp bảo mật thứ 2 nằm trên 1 device khác).&lt;/p&gt;
&lt;p&gt;Lớp thứ nhất chính là &lt;strong&gt;username/password&lt;/strong&gt; lớp thứ 2 có thể chọn 1 trong nhiều cách:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;U2F (Universal 2nd Factor)&lt;/strong&gt;: sử dụng 1 &lt;a href=&quot;https://www.namecheap.com/support/knowledgebase/article.aspx/10102/45/how-can-i-use-the-u2f-method-for-twofactor-authentication&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;physical device&lt;/a&gt; giống như 1 chiếc chìa khoá để bảo mật.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TOTP (Time-based One-Time Password)&lt;/strong&gt;: sử dụng 1 password ngắn hạn trên 1 device khác thông qua &lt;strong&gt;Authentication app&lt;/strong&gt; như: &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;#x26;hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Authenticator&lt;/a&gt;, &lt;a href=&quot;https://authy.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Authy&lt;/a&gt; …&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text Message Authentication&lt;/strong&gt;: thông qua tin nhắn trên điện thoại.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mình chọn sử dụng &lt;strong&gt;TOTP&lt;/strong&gt; thông qua app &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&amp;#x26;hl=en&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Google Authenticator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anh em tải app về điện thoại rồi vào &lt;strong&gt;cPanel&lt;/strong&gt; mở &lt;strong&gt;Two Factor Authentication&lt;/strong&gt; trong section &lt;strong&gt;Security&lt;/strong&gt;, scan &lt;strong&gt;QR Code&lt;/strong&gt;, Done!&lt;/p&gt;
&lt;p&gt;Mỗi lần đăng nhập &lt;strong&gt;namecheap&lt;/strong&gt; sẽ hỏi thêm &lt;strong&gt;TOTP&lt;/strong&gt; từ app để bảo an toàn.&lt;/p&gt;
&lt;h2 id=&quot;kết-bài&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#k%E1%BA%BFt-b%C3%A0i&quot; aria-label=&quot;kết bài permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kết bài&lt;/h2&gt;
&lt;p&gt;Hi vọng &lt;a href=&quot;/category/tutorials&quot;&gt;tutorial&lt;/a&gt; này giúp anh em hiểu thêm về server và có thể tự host 1 trang của riêng mình.&lt;/p&gt;
&lt;p&gt;Nếu k muốn mua chúng ta hoàn toàn có thể sử dụng các &lt;strong&gt;Free Hosting Service&lt;/strong&gt; khác như: &lt;strong&gt;Github Page&lt;/strong&gt;, &lt;strong&gt;Heroku&lt;/strong&gt;, &lt;strong&gt;Netlify&lt;/strong&gt;, &lt;strong&gt;Zeit Now&lt;/strong&gt;… (đều có hỗ trợ &lt;strong&gt;build tool&lt;/strong&gt; và &lt;strong&gt;config&lt;/strong&gt; đầy đủ, chỉ cần &lt;strong&gt;connect&lt;/strong&gt; source code là xong).&lt;/p&gt;
&lt;p&gt;Anh em có suy nghĩ gì thì để lại dưới phần comment nhé! (&lt;strong&gt;Email&lt;/strong&gt; chỉ để generate &lt;a href=&quot;https://gravatar.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;Gravatar&lt;/a&gt; thôi, mình k spam gì đâu 😉).&lt;/p&gt;
&lt;h2 id=&quot;tham-khảo&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tham-kh%E1%BA%A3o&quot; aria-label=&quot;tham khảo permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tham khảo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.namecheap.com/resource-center/tutorials/building-your-first-website/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.namecheap.com/resource-center/tutorials/building-your-first-website/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.namecheap.com/support/knowledgebase/article.aspx/1279/205/how-to-set-up-filezilla/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.namecheap.com/support/knowledgebase/article.aspx/1279/205/how-to-set-up-filezilla/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.namecheap.com/security/2fa-two-factor-authentication/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.namecheap.com/security/2fa-two-factor-authentication/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Deploy và cấu hình website trên namecheap trong vòng 1 nốt nhạc [Part 1]]]></title><description><![CDATA[Trước giờ mình luôn muốn sở hữu 1 site cá nhân, nhưng vì mình không có thời gian nên đợt này nghỉ việc, ở nhà cách ly mới tìm hiểu để làm đc...]]></description><link>https://leohuynh.dev/posts/depoy-and-config-website-on-name-cheap-part-1</link><guid isPermaLink="false">https://leohuynh.dev/posts/depoy-and-config-website-on-name-cheap-part-1</guid><pubDate>Thu, 23 Apr 2020 16:20:03 GMT</pubDate><content:encoded>&lt;p&gt;Trước giờ mình luôn muốn sở hữu 1 site cá nhân, nhưng vì mình &lt;del&gt;lười&lt;/del&gt; không có thời gian nên đợt này nghỉ việc, ở nhà cách ly mới tìm hiểu để làm đc.&lt;/p&gt;
&lt;p&gt;Bài này mình chỉ hướng dẫn anh em cách config &lt;strong&gt;domain&lt;/strong&gt; và &lt;strong&gt;web hosting&lt;/strong&gt; mua trên namecheap (nên mặc định anh em đã có source code của riêng mình rồi nhé 🗿)&lt;/p&gt;
&lt;h2 id=&quot;tại-sao-có-tutorial-này&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t%E1%BA%A1i-sao-c%C3%B3-tutorial-n%C3%A0y&quot; aria-label=&quot;tại sao có tutorial này permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tại sao có tutorial này?&lt;/h2&gt;
&lt;p&gt;Mặc dù namecheap đã có &lt;a href=&quot;https://www.namecheap.com/resource-center/tutorials/building-your-first-website/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;hướng dẫn&lt;/a&gt; đầy đủ để build 1 website from scratch nhưng bơi 🏊 trong 1 đống document là k dễ dàng gì.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/swim.gif&quot; alt=&quot;Kid swimming&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nên mình viết tutorial này để chia sẻ lại những gì mình đã làm và tìm hiểu trong &lt;strong&gt;2 ngày&lt;/strong&gt; để &lt;del&gt;mình xem lại nhỡ sau này quên&lt;/del&gt; giúp anh em có thể tự config site của mình nhanh hơn nhé 😄.&lt;/p&gt;
&lt;h2 id=&quot;để-có-1-site-hoàn-chỉnh-cần-những-gì&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%C4%91%E1%BB%83-c%C3%B3-1-site-ho%C3%A0n-ch%E1%BB%89nh-c%E1%BA%A7n-nh%E1%BB%AFng-g%C3%AC&quot; aria-label=&quot;để có 1 site hoàn chỉnh cần những gì permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Để có 1 site hoàn chỉnh cần những gì?&lt;/h2&gt;
&lt;p&gt;Lúc đầu mình nghĩ chỉ cần mua 1 tên miền (&lt;strong&gt;domain&lt;/strong&gt;) rồi đẩy code lên đó là xong. Nhưng k phải thế, 3 thứ cơ bản để chạy 1 website bao gồm: &lt;strong&gt;domain name&lt;/strong&gt;, &lt;strong&gt;hosting&lt;/strong&gt; và &lt;strong&gt;platform&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domain name&lt;/strong&gt; 🔍: là địa chỉ website của mình, vd: &lt;em&gt;&lt;a href=&quot;http://www.thepondhub.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;pondhub.com&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href=&quot;https://leohuynh.dev&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;leohuynh.dev&lt;/a&gt;&lt;/em&gt; … Có thể hiểu đây như là địa chỉ nhà của mình, thay cho địa chỉ ip giúp ng khác dễ dàng tìm kiếm.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hosting&lt;/strong&gt; 🏠: là nơi lưu trữ toàn bộ data và thông tin về website.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;— Web hosting, in the simplest term, is a remote hard drive connected to your computer by (you guessed it) the Internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nếu domain là địa chỉ nhà thì hosting chính là ngôi nhà của mình.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Platform&lt;/strong&gt; 💻: là những công cụ để build trang web, sản phẩm chính là phần source code của website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;=&gt; cần mua &lt;strong&gt;domain&lt;/strong&gt; và &lt;strong&gt;hosting&lt;/strong&gt; để có 1 trang hoàn chỉnh.&lt;/p&gt;
&lt;p&gt;Mình quyết định mua cả 2 trên namecheap &lt;del&gt;do chưa có nhiều kinh nghiệm&lt;/del&gt; cho tiện config và có gì còn dễ hỏi support bên họ 😄.&lt;/p&gt;
&lt;p&gt;Anh em lên &lt;a href=&quot;https://www.namecheap.com/domains/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;https://www.namecheap.com/domains/&lt;/a&gt; (nhớ tạo account trc nhé), search domain, click &lt;strong&gt;Add To Cart&lt;/strong&gt; thì namecheap sẽ gợi ý mua cùng &lt;strong&gt;Web Hosting&lt;/strong&gt; và &lt;strong&gt;PositiveSSL&lt;/strong&gt; (cái này để bảo mật cho site của mình, giải thích rõ hơn &lt;a href=&quot;#activate-ssl-certificate&quot;&gt;ở dưới&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/namecheap1.png&quot; alt=&quot;namecheap domain search&quot;&gt;&lt;/p&gt;
&lt;p&gt;Mua trên namecheap khá đơn giản, chỉ cần cung cấp đủ thông tin rồi 💸💸💸 thế là xong.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/bill.png&quot; alt=&quot;namecheap bill&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;connect-domain-với-hosting-như-thế-nào&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#connect-domain-v%E1%BB%9Bi-hosting-nh%C6%B0-th%E1%BA%BF-n%C3%A0o&quot; aria-label=&quot;connect domain với hosting như thế nào permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Connect domain với hosting như thế nào?&lt;/h2&gt;
&lt;p&gt;Nhà và địa chỉ tất nhiên ở 1 nơi rồi, tại sao phải connect làm gì nữa 👀?&lt;/p&gt;
&lt;p&gt;Lí do đơn giản là vì địa chỉ nhà (&lt;strong&gt;Web hosting&lt;/strong&gt;) thực chất là 1 dãy số (&lt;strong&gt;IP Address&lt;/strong&gt;, vd: &lt;strong&gt;127.0.0.1&lt;/strong&gt;) chúng ta đi đến địa chỉ này mới thực sự là truy cập vào website.&lt;/p&gt;
&lt;p&gt;=&gt; cần connect &lt;strong&gt;domain name&lt;/strong&gt; với &lt;strong&gt;hosting&lt;/strong&gt; để có thể đến đúng nơi bằng địa chỉ dễ nhớ.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/dns.jpg&quot; alt=&quot;name cheap dns&quot;&gt;&lt;/p&gt;
&lt;p&gt;Khi mua &lt;strong&gt;domain&lt;/strong&gt; và &lt;strong&gt;hosting&lt;/strong&gt; cùng ở &lt;strong&gt;namecheap&lt;/strong&gt;, việc config này sẽ rất dễ dàng&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vào &lt;strong&gt;Account / Dashboard / Domain List&lt;/strong&gt;, click &lt;strong&gt;Manage&lt;/strong&gt; ở domain vừa mua&lt;/li&gt;
&lt;li&gt;Chọn &lt;strong&gt;Namecheap Web Hosting DNS&lt;/strong&gt; ở section &lt;strong&gt;Nameservers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click save (dấu ✔️ ở cuối dòng)&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vậy tại sao truy cập vào &lt;del&gt;&lt;strong&gt;domain name&lt;/strong&gt;&lt;/del&gt; địa chỉ dễ nhớ hơn chúng ta vẫn đến đc nơi cần đến 👀??&lt;/p&gt;
&lt;p&gt;Chính là nhờ DNS (Mình k đi sâu vào khái niệm này)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;— DNS (domain name system) hiểu đơn giản là &lt;strong&gt;&lt;em&gt;The Phone Book of the Internet&lt;/em&gt;&lt;/strong&gt;, bạn hoàn toàn có thể bấm trực tiếp số (IP Address) để gọi cho gấu (hosting) hoặc tìm theo tên (domain) trong danh bạ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;activate-ssl-certificate&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#activate-ssl-certificate&quot; aria-label=&quot;activate ssl certificate permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Activate SSL Certificate&lt;/h2&gt;
&lt;p&gt;Nếu anh em k mua &lt;strong&gt;PositiveSSL&lt;/strong&gt; có thể bỏ qua phần này nhé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSL&lt;/strong&gt; (Secure Sockets Layer) là 1 lớp bảo mật cho website, bảo vệ website bằng &lt;strong&gt;HTTPS&lt;/strong&gt; với 2 nhiệm vụ chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Đảm bảo data đến và đi từ website luôn đc mã hóa.&lt;/li&gt;
&lt;li&gt;Kiểm duyệt data đến và đi có nội dung chính xác.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/media/https.png&quot; alt=&quot;SSL certificate&quot;&gt;&lt;/p&gt;
&lt;p&gt;Trang nào có &lt;strong&gt;SSL Certificate&lt;/strong&gt; sẽ đc gắn cờ &lt;strong&gt;Secured&lt;/strong&gt; trên Web browser, đảm bảo sự tin tưởng khi truy cập.&lt;/p&gt;
&lt;p&gt;Mình sẽ hướng dẫn anh em cách đơn giản nhất đó là sử dụng &lt;strong&gt;cPanel&lt;/strong&gt; của &lt;strong&gt;namecheap&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/cpanel.png&quot; alt=&quot;Go to cPanel&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vào &lt;strong&gt;Account / Dashboard / Domain List&lt;/strong&gt;, chọn tab &lt;strong&gt;Products&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Go to cPanel&lt;/strong&gt;, đăng nhập với tài khoản &lt;strong&gt;namecheap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Trong &lt;strong&gt;cPanel&lt;/strong&gt; mở &lt;strong&gt;Namecheap SSL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Activate&lt;/strong&gt; PossitiveSSL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Đợi khoảng 5-10’ rồi ấn &lt;strong&gt;sync&lt;/strong&gt; để xem đã &lt;strong&gt;activate&lt;/strong&gt; thành công chưa nhé (nếu chưa thì anh em đợi thêm rồi &lt;strong&gt;sync&lt;/strong&gt; lại cho đến khi status chuyển sang &lt;strong&gt;active&lt;/strong&gt; là đc).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/media/cpanel3.png&quot; alt=&quot;Go to cPanel&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;tạm-kết&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#t%E1%BA%A1m-k%E1%BA%BFt&quot; aria-label=&quot;tạm kết permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tạm kết&lt;/h2&gt;
&lt;p&gt;Đến đây anh em đã hoàn thiện đc 90% website của mình rồi 😮, &lt;a href=&quot;/posts/deploy-and-config-website-on-namecheap-part-2&quot;&gt;phần tiếp theo&lt;/a&gt; mình sẽ hướng dẫn &lt;del&gt;90%&lt;/del&gt; 10% còn lại 😢 bao gồm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tìm hiểu cấu trúc thư mục trên server (&lt;strong&gt;web hosting&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Sử dụng &lt;a href=&quot;https://filezilla-project.org/&quot; target=&quot;_blank&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;FileZilla&lt;/a&gt; để đẩy code lên server.&lt;/li&gt;
&lt;li&gt;Set up 2FA (&lt;strong&gt;Two Factor Authentication&lt;/strong&gt; - hay bảo mật 2 lớp) để tăng bảo mật.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rất cảm ơn anh em đã kiên nhẫn đọc đến đây 🙏, để lại suy nghĩ cho mình dưới phần bình luận nhé. Thanks you so much!&lt;/p&gt;</content:encoded></item></channel></rss>