<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nguyen Thien Ly</title>
    <description>The latest articles on DEV Community by Nguyen Thien Ly (@nguyenthienly).</description>
    <link>https://dev.to/nguyenthienly</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F357107%2Fd1d6c1ea-b97b-422d-b8a6-05e805417211.jpg</url>
      <title>DEV Community: Nguyen Thien Ly</title>
      <link>https://dev.to/nguyenthienly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nguyenthienly"/>
    <language>en</language>
    <item>
      <title>Synthesis about git</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Sun, 03 May 2020 08:09:23 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/synthesis-about-git-1c0i</link>
      <guid>https://dev.to/nguyenthienly/synthesis-about-git-1c0i</guid>
      <description>&lt;h1&gt;
  
  
  Synthesis about git
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;New key word&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;synthesis: tổng hợp&lt;/li&gt;
&lt;li&gt;nature: bản chất&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remote
&lt;/h2&gt;

&lt;p&gt;To add a new remote, use the &lt;code&gt;git remote add&lt;/code&gt; command on the terminal, in the directory your repository is stored at.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;git remote add&lt;/code&gt; command takes two arguments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A remote name, for example, &lt;code&gt;origin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A remote URL, for example, &lt;code&gt;https://github.com/user/repo.git&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git remote add origin https://github.com/user/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
&amp;gt; origin  https://github.com/user/repo.git (fetch)
&amp;gt; origin  https://github.com/user/repo.git (push)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Branch
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Branching off (copy)
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout -b &amp;lt;new_working_branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Listing branches
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Switching branch
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git checkout &amp;lt;branch_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Remove branch on local
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git branch -D &amp;lt;branch_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Remove branch on remote
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push --delete origin &amp;lt;branch_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Status
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Diff
&lt;/h2&gt;

&lt;p&gt;show status change each file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git diff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If files have added (committed), use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git diff --cached
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note, add color to see easy and cool&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git config --global color.ui true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Commit
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add -A
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;add .&lt;/code&gt; and &lt;code&gt;add -A&lt;/code&gt; add all change into committed list.&lt;/p&gt;

&lt;p&gt;just add specific file need to commit, use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add &amp;lt;file_path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Reset commit, not create new commit, use&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git commit --amend -m "an updated commit message"
$ git commit --amend --no-edit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Log
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Press [Enter] to scroll the list till the end or press q to quit&lt;/p&gt;

&lt;p&gt;To search commit logs matching a specific pattern, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git log -g --grep=&amp;lt;pattern&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add flag –oneline to show on line 1 commit.&lt;/li&gt;
&lt;li&gt;Add flag –graph to show relationship parent-child&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  blame
&lt;/h2&gt;

&lt;p&gt;Check who is author of line in 1 file (and commit hash id, time)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git blame &amp;lt;file_path&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Push
&lt;/h2&gt;

&lt;p&gt;After to commit, push these changes on origin (remote repo)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push origin &amp;lt;branch_to_push&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Use push to delete remote branch (note have ":")&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push origin :&amp;lt;branch_to_remove&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Tag
&lt;/h2&gt;

&lt;p&gt;Tag version&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git tag -a &amp;lt;tag_name&amp;gt; -m 'message'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git tag &amp;lt;tag_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Push tag on remote repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push origin &amp;lt;tag_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Delete tag &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete in local first: $ git tag -d &lt;/li&gt;
&lt;li&gt;Delete in remote: $ git push origin -delete &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Merge
&lt;/h2&gt;

&lt;p&gt;Use to join 2 or more commit from difference branch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git merge &amp;lt;branch_to_merge&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Fetch
&lt;/h2&gt;

&lt;p&gt;Use to update branch origin in local with branch similar on remote repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git fetch origin &amp;lt;branch_on_remote_repo_to_fetch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Pull
&lt;/h2&gt;

&lt;p&gt;Nature is &lt;code&gt;fetch&lt;/code&gt; before &lt;code&gt;merge&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git pull origin &amp;lt;branch_on_remote_repo_to_pull&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or add flag &lt;code&gt;-rebase&lt;/code&gt; to &lt;code&gt;fetch&lt;/code&gt; before &lt;code&gt;rebase&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git pull --rebase origin &amp;lt;branch_on_remote_repo_to_pull&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Reset
&lt;/h2&gt;

&lt;p&gt;Point local repo to old commit in history&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset HEAD
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset &amp;lt;commit_hash_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: Use $ git reflog to show list &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Flag &lt;code&gt;–hard&lt;/code&gt;: destroy all change&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git reset --hard
$ git reset &amp;lt;commit_hash_id&amp;gt; --hard
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After reset can update changes on remote repo to override history commit of this branch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git push --force origin &amp;lt;remote_branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: you should limit the use of operations that change the commit history&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Revert
&lt;/h2&gt;

&lt;p&gt;Used to reverse the changes of an old commit in history, essentially creating a new commit with the opposite change from the selected commit.&lt;/p&gt;

&lt;p&gt;This is the safest way to revert changes because the commit history is completely unchanged, and the revert is also logged.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git revert &amp;lt;commit_hash_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codeboy.info/git-basic"&gt;https://codeboy.info/git-basic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.github.com/en/github/using-git"&gt;https://help.github.com/en/github/using-git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>What is closure? (Closure là gì?)</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Fri, 10 Apr 2020 18:04:25 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/what-is-closure-closure-la-gi-1m4b</link>
      <guid>https://dev.to/nguyenthienly/what-is-closure-closure-la-gi-1m4b</guid>
      <description>&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vấn đề&lt;/li&gt;
&lt;li&gt;Lexical scoping là gì ?&lt;/li&gt;
&lt;li&gt;Closure là gì?&lt;/li&gt;
&lt;li&gt;Giả lập class bằng closures&lt;/li&gt;
&lt;li&gt;Closure Scope Chain&lt;/li&gt;
&lt;li&gt;Các bài phỏng vấn thường thấy về closure&lt;/li&gt;
&lt;li&gt;Kết bài &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Vấn đề
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xin chào tất cả mọi người, mọi người có biết &lt;strong&gt;closures&lt;/strong&gt; là gì không? Đối với một người mới đi làm như mình thì cũng mơ hồ&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mình rất cay vì mình luôn được phỏng vần về &lt;strong&gt;closure&lt;/strong&gt; tưởng đã chuẩn bị chắc ăn nhưng cuối cùng toàn trả lời fail. Vì vậy hôm nay mình sẽ tổng hợp về &lt;strong&gt;closure&lt;/strong&gt; để tạo ra một bí kíp riêng cho mình và chia sẻ cùng mọi người nha&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bài viết này mình tổng hợp từ nhiều nguồn, nếu mọi người có góp ý gì thì mình rất sẵn lòng tiếp thu.&lt;/p&gt;

&lt;p&gt;Bắt đầu thôi @-@&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Lexical scoping là gì?
&lt;/h2&gt;

&lt;p&gt;Xem xét ví dụ dưới đây&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;outerFuc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nguyen Thien Ly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;innerFunc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;innerFunc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;outerFuc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Kết quả ra là Nguyen Thien ly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bên trong hàm &lt;strong&gt;outerFunc&lt;/strong&gt; gồm: Một biến cục bộ &lt;strong&gt;name&lt;/strong&gt;, và function &lt;strong&gt;innerFunc&lt;/strong&gt;. Bên trong function &lt;strong&gt;innerFunc&lt;/strong&gt; không có biến cục bộ nào cả nhưng trong hàm này đang sài một biết &lt;strong&gt;name&lt;/strong&gt; của cha nó function &lt;strong&gt;functionOuter&lt;/strong&gt;. Vậy đây là một ví dụ về &lt;strong&gt;lexical scopping&lt;/strong&gt; cách mà các function sử dụng một biến của một hàm nó lòng trong, hoặc nhiều hàm lòng vào nhau.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Closure là gì?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Closure là một hàm được viết lồng vào bên trong một hàm khác (hàm cha) nó có thể sử dụng biến toàn cục, biến cục bộ của hàm cha và biến cục bộ của chính nó (lexical scoping)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tiếp tục đoạn code trên và thay đổi một chút&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;outerFuc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nguyen Thien Ly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;innerFunc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;innerFunc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;refInnerFunc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;outerFuc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;refInnerFunc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Kết quả ra là Nguyen Thien ly&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nếu mà bạn không để ý thì bạn sẽ để ý được sự khác biệt mà &lt;strong&gt;javascript&lt;/strong&gt; mang lại.&lt;/p&gt;

&lt;p&gt;Cái chỗ thằng &lt;strong&gt;refInnerFunc&lt;/strong&gt; được gán bằng kết quả thực hàm &lt;strong&gt;outerFuc()&lt;/strong&gt;  vậy thì giờ thằng &lt;strong&gt;refInnerFunc&lt;/strong&gt; đang references đến kết quả chạy hàm &lt;strong&gt;outerFuc()&lt;/strong&gt; (refInnerFunc trỏ đến hàm innerFunc nhưng chưa thực thi hàm này nhé)&lt;/p&gt;

&lt;p&gt;Hàm &lt;strong&gt;outerFuc()&lt;/strong&gt; giờ đã thực thi xong các biến cục bộ của nó sẽ được giải phóng&lt;/p&gt;

&lt;p&gt;Giờ đến lượt thực thi function &lt;strong&gt;innerFunc()&lt;/strong&gt; (Chạy dòng này nè refInnerFunc()). kết quả in ra &lt;strong&gt;Nguyen Thien Ly&lt;/strong&gt;. Ủa đây là biến thằng cha mà, nó đã bị hủy rồi sao còn in ra được zậy, không phải &lt;strong&gt;undefined&lt;/strong&gt; à. Vậy đã có điều gì xảy ra?&lt;/p&gt;

&lt;p&gt;Ở &lt;strong&gt;javascript&lt;/strong&gt; khi một hàm nằm trong một hàm khác, thì cái hàm nằm trong chưa thực thi mà thằng cha nó lỡ thực thi trước, thì nó sẽ tạo ra một &lt;strong&gt;Lexical Enviroment&lt;/strong&gt; để đặt tất cả các biến của nó đang có và "gắn" vào hàm con để đề phòng trường hợp thằng con có cần thì có mà xài :v&lt;/p&gt;

&lt;p&gt;Ở trường hợp trên sau khi function &lt;strong&gt;outerFuc()&lt;/strong&gt; đã chết rồi nó để lại di chúc cho thằng hàm con trong nó là một tài sản biến &lt;strong&gt;name&lt;/strong&gt;, sẽ đi theo thằng hàm &lt;strong&gt;innerFunc()&lt;/strong&gt; cho đến khi mà thằng này cũng chết thì nó mới giải phóng&lt;/p&gt;

&lt;p&gt;Vậy trong ví dụ trên ai là Closure? Câu trả lời là &lt;strong&gt;refInnerFunc&lt;/strong&gt; vì nó đang là một hàm nằm trong hàm khác (Vì nó đã được assign &lt;strong&gt;innerFunc&lt;/strong&gt;) và nó đang có biến &lt;strong&gt;name&lt;/strong&gt; của cha nó (Có thể sài dù cha nó có thể mất đi) và biến global (nếu có) và biến cục bộ của nó (nếu có). (Lexical enviroment). &lt;strong&gt;refInnerFunc&lt;/strong&gt; sẽ reference đến cái &lt;strong&gt;Lexical enviroment&lt;/strong&gt; (Trỏ vào đây). Vậy thằng &lt;strong&gt;refInnerFunc&lt;/strong&gt; đang trỏ vào function &lt;strong&gt;innerFunc()&lt;/strong&gt; và lexical enviroment của nó nhá. &lt;/p&gt;

&lt;p&gt;Nhìn vào hình dưới đây sẽ thấy&lt;/p&gt;

&lt;p&gt;&lt;a href="closure"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F2DsHJru.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Một ví dụ khác :v&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeAdder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;add5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeAdder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;add10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;makeAdder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// 7&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cả hai thằng &lt;strong&gt;add5&lt;/strong&gt; và &lt;strong&gt;add10&lt;/strong&gt; đều là &lt;strong&gt;closure&lt;/strong&gt; và thằng mỗi thằng có mỗi &lt;strong&gt;lexical enviroment&lt;/strong&gt; riêng. &lt;/p&gt;

&lt;p&gt;add5 (Cha nó để lại di chúc biến &lt;strong&gt;x=5&lt;/strong&gt; và nó đang trỏ tới anonymous function và trong đó có biến cục bộ là &lt;strong&gt;y&lt;/strong&gt;) &lt;/p&gt;

&lt;p&gt;ddd10 (Cha nó để lại di chúc biến &lt;strong&gt;x=10&lt;/strong&gt; và nó đang trỏ tới anonymous function và trong đó có biến cục bộ là &lt;strong&gt;y&lt;/strong&gt;) &lt;/p&gt;

&lt;p&gt;Đậy là dạng &lt;strong&gt;closure&lt;/strong&gt; dùng khác &lt;strong&gt;lexical enviroment&lt;/strong&gt; (thằng x = 5 thằng x = 10) và chung xử lí (Chung hàm anonymous y)&lt;br&gt;
(Dạng 1)&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Giả lập class bằng closures
&lt;/h2&gt;

&lt;p&gt;javascript là ngôn ngữ hướng hàm &lt;strong&gt;functional programming&lt;/strong&gt; nhưng ai cũng biết được rằng ngôn ngữ hướng đổi tưởng &lt;strong&gt;object oriented programming&lt;/strong&gt; có những thứ rất hay ho ví dụ: Tính chất bao bọc và bảo vệ dữ liệu, vậy trong ES6 có class thì thực chất là khai báo và dùng tính chất closure này để mô phỏng tương đối&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;//Ví dụ 2&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;privateCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;changeBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;privateCounter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;changeBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nf"&gt;changeBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;privateCounter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;   
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 0&lt;/span&gt;
&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 2&lt;/span&gt;
&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 1&lt;/span&gt;

&lt;span class="c1"&gt;//Ví dụ 2&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;privateCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// function changeBy(val) {&lt;/span&gt;
  &lt;span class="c1"&gt;//   privateCounter += val;&lt;/span&gt;
  &lt;span class="c1"&gt;// }&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;privateCounter&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;privateCounter&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;privateCounter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;   
&lt;span class="p"&gt;})();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 0&lt;/span&gt;
&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 2&lt;/span&gt;
&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counter2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// logs 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ở đây ta có một closure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;counter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dùng chung một &lt;strong&gt;lexical enviroment&lt;/strong&gt; gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Biến privateCounter&lt;/li&gt;
&lt;li&gt;Function changeBy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Và khác phần xử lí&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;increment&lt;/li&gt;
&lt;li&gt;decrement&lt;/li&gt;
&lt;li&gt;value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Dạng 2) coi lại dạng 1 phần 2&lt;/p&gt;

&lt;p&gt;Vì dùng chung nên cả ba thằng này đều có thể dùng function &lt;strong&gt;changeBy()&lt;/strong&gt; để điểu khiến biến &lt;strong&gt;privateCounter&lt;/strong&gt; như ví dụ 1 hoặc có thể tự điều khiển &lt;strong&gt;privateCounter&lt;/strong&gt; bên trong mỗi hàm như ví dụ 2&lt;/p&gt;

&lt;p&gt;Vậy ta không thể thấy hay điều khiển được các biến trong &lt;strong&gt;lexical enviroment&lt;/strong&gt; này mà chỉ được tác động đến &lt;strong&gt;privateCounter&lt;/strong&gt; thông qua những function mà nó cung cấp (&lt;strong&gt;increment, decrement, value&lt;/strong&gt;) . Khá giống với OOP phải không nào ^^&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Closure Scope Chain
&lt;/h2&gt;

&lt;p&gt;Ví dụ dưới đây&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// global scope&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="c1"&gt;// outer functions scope&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sum4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="c1"&gt;// local scope&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;//log 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trong ví đụ dưới đây ta thấy có các closure như sau&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;s (Có lexical enviroment gồm biến a và e trỏ vào function &lt;strong&gt;sum2&lt;/strong&gt; )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;s1 (Có lexical enviroment gồm biến a, b và e trỏ vào function &lt;strong&gt;sum3&lt;/strong&gt; )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;s2 (Có lexical enviroment gồm biến a, b, c và e trỏ vào function &lt;strong&gt;sum4&lt;/strong&gt; )&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;s3 (Có lexical enviroment gồm biến a, b, c, d và e và thực thi và giải phong a, b, c, d)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vậy nhận ra rằng&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tất cả có chung biến global là e&lt;/li&gt;
&lt;li&gt;Thằng đằng trong sẽ lấy tất cả các dữ liệu thằng ngoài có&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Bài phỏng vấn thường thấy về closure
&lt;/h2&gt;

&lt;p&gt;Ví dụ dưới đây&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// logs 3, 3, 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chúng ta thấy rằng function &lt;strong&gt;anonymous để console biến i của cha nó&lt;/strong&gt; sẽ chạy sau khi cha nó chạy xong (Vì thằng này delay ít nhất 1s), vì vậy &lt;strong&gt;javascript&lt;/strong&gt; sẽ tạo ra &lt;strong&gt;closure&lt;/strong&gt; để cung cấp cho thằng hàm con trong có thể sài, vì vòng lặp là 3 nên sẽ tạo ra 3 &lt;strong&gt;closure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Giờ xem xét cái &lt;strong&gt;lexical enviroment&lt;/strong&gt; nào, t biết rằng &lt;strong&gt;var i&lt;/strong&gt; tuân thủ nguyên tắc &lt;strong&gt;function scope&lt;/strong&gt; nó sẽ được tạo mới trong mỗi function còn ngoài function thì &lt;strong&gt;var i&lt;/strong&gt; nhiều lần cũng chỉ là biến &lt;strong&gt;i&lt;/strong&gt; đó thôi. Vậy chúng nó sài chung &lt;strong&gt;lexical enviroment&lt;/strong&gt; (Giống bài mô phỏng class phần 3).&lt;/p&gt;

&lt;p&gt;Mà để hàm thực thi function &lt;strong&gt;log i&lt;/strong&gt; ra cần tới 1s sau, vậy theo như ví dụ trên, vòng lặp for sẽ được chạy xong trước khi thực thi function &lt;strong&gt;log i&lt;/strong&gt; sớm nhất được thực thi vậy biến i lúc này sẽ luôn là giá trị sau khi chạy xong vòng &lt;strong&gt;for, i = 3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vậy sẽ ra kết quả là 3, 3, 3&lt;/p&gt;

&lt;p&gt;Để sửa lỗi này t có nhiều cách nhưng mình sẽ đề xuất một cách là dùng &lt;strong&gt;let&lt;/strong&gt; thay cho &lt;strong&gt;var&lt;/strong&gt; vì let theo nguyên tắc &lt;strong&gt;block scope&lt;/strong&gt; biến sẽ được tạo mới trong dấu &lt;strong&gt;{  }&lt;/strong&gt; nên sẽ có 3 closure dùng 3 &lt;strong&gt;lexical enviroment&lt;/strong&gt; khác nhau nhé&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// logs 0, 1, 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Kết bài
&lt;/h2&gt;

&lt;p&gt;Đến đây cũng đã hết bài viết rồi, cảm ơn mọi người đã theo dõi. Nếu có góp ý hay thắc mắc gì thì cứ để lại comment bên dưới mình sẽ trả lời. Xin chào mọi người. &lt;/p&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@giangcoffee/closure-l%C3%A0-g%C3%AC-ebd02b153f07" rel="noopener noreferrer"&gt;https://medium.com/@giangcoffee/closure-l%C3%A0-g%C3%AC-ebd02b153f07&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/vi/docs/Web/JavaScript/Closures" rel="noopener noreferrer"&gt;https://developer.mozilla.org/vi/docs/Web/JavaScript/Closures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>closure</category>
    </item>
    <item>
      <title>Create CV with BEM - 2</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Thu, 02 Apr 2020 08:44:21 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/create-cv-with-bem-2-29m7</link>
      <guid>https://dev.to/nguyenthienly/create-cv-with-bem-2-29m7</guid>
      <description>&lt;h3&gt;
  
  
  Series về cách tạo một CV đơn giản nhưng cực chất cho dev cực chất
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Phần 1: Chuẩn bị và cấu trúc project &lt;strong&gt;html, css, js&lt;/strong&gt; cùng &lt;strong&gt;BEM&lt;/strong&gt; thần thánh (&lt;a href="https://dev.to/nguyenthienly/create-cv-with-bem-4io1"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Phần 2: Thiết kế, lắp ráp &lt;strong&gt;index-page&lt;/strong&gt; và deploy lên &lt;strong&gt;github-page&lt;/strong&gt; (&lt;a href="https://dev.to/nguyenthienly/create-cv-with-bem-2-29m7"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Phần 3:  Refactor code và các chú ý về &lt;strong&gt;BEM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Phần 4:  Thiết kế và fetch Gist, lắp ráp &lt;strong&gt;blog-page&lt;/strong&gt; và deploy lên &lt;strong&gt;github-page&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Kết quả: &lt;strong&gt;&lt;a href="https://nguyenthienly.github.io/MY_PROFILE"&gt;https://nguyenthienly.github.io/MY_PROFILE&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;h1&gt;
  
  
  2. Phần 2: Thiết kế, lắp ráp &lt;strong&gt;index-page&lt;/strong&gt; và deploy lên &lt;strong&gt;github-page&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Cài đặt live-server&lt;/li&gt;
&lt;li&gt;Thêm một &lt;strong&gt;fonts&lt;/strong&gt; bằng &lt;strong&gt;fonts.google.com&lt;/strong&gt; và một số thứ khác&lt;/li&gt;
&lt;li&gt;Cài đặt &lt;strong&gt;block header&lt;/strong&gt; và các sai lầm dễ mắc phải về BEM&lt;/li&gt;
&lt;li&gt;Deploy lên &lt;strong&gt;github-page&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Kết bài&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Cài đặt live-server
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thông thường thì mọi người code &lt;strong&gt;html, csss&lt;/strong&gt;, mỗi khi thêm một ít code mới lại &lt;strong&gt;refresh&lt;/strong&gt; khá mất thời gian vì vậy mình sẽ giới thiệu một &lt;strong&gt;extension&lt;/strong&gt; của &lt;strong&gt;VScode&lt;/strong&gt;, để làm điều này tự động&lt;/p&gt;

&lt;p&gt;Các bước cài đặt&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ấn tổ hợp phím (Ctrl + Shift + X)&lt;/li&gt;
&lt;li&gt;Gõ lên thanh tìm kiếm &lt;strong&gt;live server&lt;/strong&gt; và ấn vào &lt;strong&gt;install&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Sau khi cài đặt xong thì, ấn tổ hợp phím (Ctrl + Shift + E) chọn file &lt;strong&gt;.html&lt;/strong&gt; kích chuột phải
trong &lt;strong&gt;Open with live server&lt;/strong&gt; nha&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Thêm một &lt;strong&gt;fonts&lt;/strong&gt; bằng &lt;strong&gt;fonts.google.com&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Để cài các &lt;strong&gt;font&lt;/strong&gt; phù hợp và đẹp mắt thì mình sẽ chỉ cho các bạn một trang rất hay của anh &lt;strong&gt;google&lt;/strong&gt;&lt;br&gt;
nha, mình sẽ lấy font chữ để phục vụ cho project mình hôm nay luôn&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vào trang &lt;strong&gt;fonts.google.com&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tìm font &lt;strong&gt;fira code&lt;/strong&gt; và chọn&lt;/li&gt;
&lt;li&gt;Mình lấy các &lt;strong&gt;options&lt;/strong&gt; và sẽ được một &lt;strong&gt;embed&lt;/strong&gt; như vầy
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt;
  &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css2?family=Fira+Code:wght@300;400;500;515;600;700&amp;amp;display=swap"&lt;/span&gt;
  &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Lúc khai báo thì mình sẽ sài như dưới đây&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Fira Code"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;monospace&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Trong bài mình dùng các &lt;strong&gt;icon&lt;/strong&gt; của &lt;strong&gt;fontawesome.com&lt;/strong&gt; vì vậy các bạn cũng có thể chọn như mình&lt;/p&gt;

&lt;p&gt;Về hình ảnh thì có vài cách:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Các bạn bỏ vào thư mục &lt;strong&gt;images&lt;/strong&gt; và push lên &lt;strong&gt;github&lt;/strong&gt; để lấy url&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dùng một url có sẵn để dev nha mình xài thằng này &lt;strong&gt;picsum.photos&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Cài đặt mẫu &lt;strong&gt;block header&lt;/strong&gt; và các sai lầm dễ mắc phải về BEM
&lt;/h2&gt;

&lt;p&gt;Sau khi đã phân chia thư mục như phần trước&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── images
└─── css
│     └─── page
│     │      └─── index.css
│     │      └─── blog.css
│     └─── container
│     │      └─── header.css
│     └─── component
│            └─── button.css
└─── js
│     └─── page
│     └─── container
│     └─── component
└─── index.html
└─── blog.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ở file &lt;strong&gt;index.html&lt;/strong&gt; có bạn nào sẽ khai báo &lt;strong&gt;Block header&lt;/strong&gt; như dưới đây không?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list__item__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Nếu bạn đã nghĩ khai báo như vậy là đúng, xin chúc mừng bạn đã hiểu nhầm về &lt;strong&gt;BEM&lt;/strong&gt; rồi đấy&lt;/p&gt;

&lt;p&gt;Bạn nên khai báo file &lt;strong&gt;index.html&lt;/strong&gt; như dưới này:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;tại sao như vậy?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Nguyên tắc 1
&lt;/h3&gt;

&lt;p&gt;Khi làm &lt;strong&gt;BEM&lt;/strong&gt; thì nên tuân thủ &lt;strong&gt;Block__Element&lt;/strong&gt; chứ không phải &lt;strong&gt;Block_&lt;em&gt;Element&lt;/em&gt;_Element&lt;/strong&gt;. Vì &lt;strong&gt;BEM&lt;/strong&gt; không thể hiện các level hoặc độ sâu của các element, mà &lt;strong&gt;BEM&lt;/strong&gt; giúp bạn dễ dàng định danh mối quan hệ với &lt;strong&gt;top-level block&lt;/strong&gt; (Block mà nó nằm trong). Nên các bạn hãy cố gắng đặt đúng nguyên tắc &lt;strong&gt;BEM&lt;/strong&gt; nha&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tiếp theo,&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.toheader"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9qZqeU1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/Sg0bW09.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trong &lt;strong&gt;Block Header&lt;/strong&gt; này có 3 Element gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logo&lt;/strong&gt; bên trái&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menu&lt;/strong&gt; ở giữa&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;button&lt;/strong&gt; bên phải&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ở bài trước mình đã tách &lt;strong&gt;Button&lt;/strong&gt; ra một block riêng, sẽ có &lt;strong&gt;Block chứa Block khác&lt;/strong&gt;, ví dụ dưới đây&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;

         &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;My blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Vậy bây giờ các bạn sẽ gặp trường hợp. Là thằng &lt;strong&gt;Block cha (header)&lt;/strong&gt; muốn điều khiển thằng &lt;strong&gt;Block con (btn)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vậy bạn sẽ khai báo như nào, có bạn nào định làm như dưới đây không?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;

         &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__btn btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;My blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Như các bạn thấy mình vừa thêm class &lt;code&gt;header__btn&lt;/code&gt; vào, nếu các bạn nghĩ như này là đúng thì hình như lại hiểu nhầm &lt;strong&gt;BEM&lt;/strong&gt; nữa rồi ^^&lt;/p&gt;

&lt;h3&gt;
  
  
  Nguyên tắc 2
&lt;/h3&gt;

&lt;p&gt;Chúng ta không nên cho một &lt;strong&gt;Block&lt;/strong&gt; này can thiệp vào một &lt;strong&gt;Block&lt;/strong&gt; khác. Điều này vô tình có khiến bạn đang sửa đổi một hoặc thuộc tính của thằng &lt;strong&gt;Block&lt;/strong&gt; bị can thiệp đang có nhé. Điều này cũng đã vi phạm nguyên tắc &lt;strong&gt;Open/Close&lt;/strong&gt; của &lt;strong&gt;SOLID&lt;/strong&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ai không biết thì kích vào &lt;a href="https://itnext.io/solid-principles-explanation-and-examples-715b975dcad4"&gt;đây&lt;/a&gt; để đọc thêm về nó nhá&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vậy chúng ta phải làm sao để có thể giải quyết vấn đề trên?&lt;/p&gt;

&lt;p&gt;Đây là lúc dùng thằng &lt;strong&gt;Modifier&lt;/strong&gt; này nha, ví dụ dưới trong file &lt;strong&gt;index.html&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;

         &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn--mt-50 btn"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;My blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Mình có thay thằng &lt;code&gt;header__btn&lt;/code&gt; bằng thằng &lt;code&gt;btn--mt-50&lt;/code&gt; để ví dụ rằng mình muốn trong &lt;strong&gt;Block header&lt;/strong&gt; này &lt;strong&gt;Block btn&lt;/strong&gt; sẽ &lt;strong&gt;margin-top: 50px&lt;/strong&gt;. Sẽ có cách giải quyết hay hơn nhưng mình sẽ trình bày ở &lt;strong&gt;Phần 3 nhé&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cuối cùng&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ở &lt;strong&gt;Phần 1&lt;/strong&gt; mình đã cũng nói lí do là muốn tách &lt;strong&gt;Block btn&lt;/strong&gt; ra riêng vì trong &lt;strong&gt;project&lt;/strong&gt; có dùng lại.&lt;/p&gt;

&lt;p&gt;Mình giả sử nếu bạn không tách ra, mà xem &lt;strong&gt;Block btn&lt;/strong&gt; như một &lt;strong&gt;Element btn của Block header&lt;/strong&gt; và sau đó lại có một nơi nào đó sài một &lt;strong&gt;btn khá giống với cái element btn trong Block header&lt;/strong&gt; thì phải code lại hay tạo ra &lt;strong&gt;block btn mới&lt;/strong&gt; phải không nào, điều này cũng vi phạm nguyên tác về &lt;strong&gt;BEM&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nguyên tắc 3
&lt;/h3&gt;

&lt;p&gt;Khi nào mà vẫn có thể &lt;strong&gt;Modifier&lt;/strong&gt; được thì ưu tiên &lt;strong&gt;Modifier&lt;/strong&gt; hơn là tạo ra một &lt;strong&gt;Block&lt;/strong&gt; mới&lt;/p&gt;

&lt;p&gt;Vậy cũng là ví dụ này, khi mình muốn trong &lt;strong&gt;Block Header&lt;/strong&gt; cái &lt;strong&gt;Block btn&lt;/strong&gt; nhỏ hơn những cái khác thì mình thêm class &lt;strong&gt;btn--small&lt;/strong&gt; là được&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ol&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__list"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header__link"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ol&amp;gt;&lt;/span&gt;

         &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn--mt-50 btn--small"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;My blog&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Và kết quả sẽ được như hình nhá (Mình chỉ dựa theo thôi và trình mình không thể clone giống bạn này 100% các bạn thông cảm)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tomy-header"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3qdycgmI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/qbl5sUO.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trên đây là các kinh nghiệm mà mình đã có khi làm việc với &lt;strong&gt;BEM&lt;/strong&gt; mình hy vọng các bạn có thể thực hành và hiểu hơn về BEM nhé&lt;/p&gt;

&lt;h3&gt;
  
  
  Nếu không có người yêu khiến bạn buồn, thì BEM sẽ khiến bạn hanh phúc, hãy tin là như vậy
&lt;/h3&gt;

&lt;h2&gt;
  
  
  4. Deploy lên github-page
&lt;/h2&gt;

&lt;p&gt;Sau một hồi code và refactor code thì cơ bản cũng đã xong trang &lt;strong&gt;index.html&lt;/strong&gt; với cấu trúc thư mục như sau&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── images
└─── css
│     └─── page
│     │      └─── index.css
│     │      └─── blog.css
│     └─── container
│     │      └─── header.css
│     │      └─── ...
│     └─── component
│            └─── button.css
│            └─── ...
└─── js
│     └─── page
│     └─── container
│     └─── component
│            └─── ...
└─── index.html
└─── blog.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Chú ý giúp mình đặt tên có &lt;strong&gt;index.html&lt;/strong&gt; và bố trí như trên để push lên &lt;strong&gt;github&lt;/strong&gt; nhận luôn nhá&lt;/p&gt;

&lt;p&gt;Các bạn gõ các lệnh sau&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "create home.html"
git push origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sau đó lên trang github làm theo các bước sau &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kích vào phần setting 
&lt;a href="https://dev.tosetting-github"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uJve8ohc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/1wJcKeT.png"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cuộn xuống phần &lt;strong&gt;github pages&lt;/strong&gt; và select phần &lt;strong&gt;Master branch&lt;/strong&gt;
&lt;a href="https://dev.tosetting-github"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O3XQHIx3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/UdJdcDv.png"&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Đợi &lt;strong&gt;github&lt;/strong&gt; load lại và cuộn dưới phần đó sẽ thấy link
&lt;a href="https://dev.tosetting-github"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rdLAGo8N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/qnhapSu.png"&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Kết quả &lt;strong&gt;&lt;a href="https://nguyenthienly.github.io/MY_PROFILE"&gt;https://nguyenthienly.github.io/MY_PROFILE&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  4. Kết bài
&lt;/h2&gt;

&lt;p&gt;Đến đây cũng đã hết phần này rồi, các bạn nếu thấy thú vị và hữu ích thì tiếp tục theo dõi, mình sẽ có phần 3 sớm nhất có thể&lt;/p&gt;

&lt;p&gt;Chúc mọi người vượt qua mùa dịch an toàn, và làm những điều thật có ít nhé&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mày không thoát được đâu con trai, tu be không tình yêu&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;shorturl.at/nsvN0&lt;/li&gt;
&lt;li&gt;shorturl.at/fqsRT&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getbem.com/"&gt;http://getbem.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>html</category>
      <category>github</category>
      <category>css</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Create CV with BEM - 1</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Thu, 02 Apr 2020 08:41:40 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/create-cv-with-bem-4io1</link>
      <guid>https://dev.to/nguyenthienly/create-cv-with-bem-4io1</guid>
      <description>&lt;h3&gt;
  
  
  Series về cách tạo một CV đơn giản nhưng cực chất cho dev cực chất
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Phần 1: Chuẩn bị và cấu trúc project &lt;strong&gt;html, css, js&lt;/strong&gt; cùng &lt;strong&gt;BEM&lt;/strong&gt; thần thánh (&lt;a href="https://dev.to/nguyenthienly/create-cv-with-bem-4io1"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Phần 2: Thiết kế, lắp ráp &lt;strong&gt;index-page&lt;/strong&gt; và deploy lên &lt;strong&gt;github-page&lt;/strong&gt; (&lt;a href="https://dev.to/nguyenthienly/create-cv-with-bem-2-29m7"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Phần 3:  Refactor code và các chú ý về &lt;strong&gt;BEM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Phần 4:  Thiết kế và fetch Gist, lắp ráp &lt;strong&gt;blog-page&lt;/strong&gt; và deploy lên &lt;strong&gt;github-page&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  1. Phần 1: Chuẩn bị và cấu trúc project &lt;strong&gt;html, css, js&lt;/strong&gt; cùng &lt;strong&gt;BEM&lt;/strong&gt; thần thánh
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vấn đề&lt;/li&gt;
&lt;li&gt;Những thứ cần chuẩn bị&lt;/li&gt;
&lt;li&gt;Tạo repository trên &lt;strong&gt;github.com&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BEM&lt;/strong&gt; là gì, sao phải dùng &lt;strong&gt;BEM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cấu trúc Project&lt;/li&gt;
&lt;li&gt;Kết bài&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Vấn đề
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xin chào tất cả mọi người, trước đây khi mà mình đi xin việc thì đến giai đoạn nộp CV, thì mình hay lên &lt;strong&gt;topcv.vn&lt;/strong&gt; hay là &lt;strong&gt;cvsimply.com&lt;/strong&gt; để tậu cho mình một cái &lt;strong&gt;CV&lt;/strong&gt; phải không nào, việc đó rất tiện nhưng mình cảm thấy nếu mình là &lt;strong&gt;dev&lt;/strong&gt; có thể xây dựng cho mình một &lt;strong&gt;CV&lt;/strong&gt; theo phong cách của riêng mình thì gây &lt;strong&gt;ấn tượng&lt;/strong&gt; mạnh hơn với &lt;strong&gt;nhà tuyển dụng&lt;/strong&gt; nha (Biết đâu lọt vào vòng gửi xe ^^)&lt;/p&gt;

&lt;p&gt;Hôm nay ở nhà chống dịch &lt;strong&gt;deadline&lt;/strong&gt; cũng không nhiều, vì vậy mình sẽ viết một series về cách tạo &lt;strong&gt;CV đơn giản nhưng cực chất cho dev he&lt;/strong&gt;, à không riêng gì dev các bạn nào muốn tạo cho mình một &lt;strong&gt;CV của riêng mình&lt;/strong&gt; thì cứ đọc. Cái này mình chỉ muốn chia sẻ cho mọi người nên có gì đắc tội mong mọi người nhẹ tay cho em &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's go&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Những thứ cần chuẩn bị
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Nào cặp nào bút, nào sách nào vở, không không &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Editor (Mình sài &lt;strong&gt;VScode&lt;/strong&gt; nha ai thích thì sài không thích thì sài ^^)&lt;/li&gt;
&lt;li&gt;Một ít kiến thức về &lt;strong&gt;HTML, CSS, JS&lt;/strong&gt; không biết gì lên &lt;a href="https://www.w3schools.com/"&gt;đây&lt;/a&gt; tìm nha&lt;/li&gt;
&lt;li&gt;Biết dùng &lt;strong&gt;git&lt;/strong&gt; căn bản, ai chưa rành vô &lt;a href="https://www.youtube.com/watch?v=0J2aou7Kj7s&amp;amp;list=PLkY6Xj8Sg8-viFVtaVps_h_Emi2wQyE7q"&gt;đây&lt;/a&gt; để học, học hết video đảm bảo biết sài &lt;strong&gt;git&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Có một &lt;strong&gt;repository&lt;/strong&gt; trên &lt;strong&gt;git hub&lt;/strong&gt; không có thì xem dưới mình bày tạo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Tạo repository trên &lt;strong&gt;github.com&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Truy cập vào trang web &lt;a href="https://github.com/"&gt;https://github.com/&lt;/a&gt;, chọn đăng nhập bằng &lt;strong&gt;google&lt;/strong&gt; hoặc đăng kí mới&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New repository&lt;/strong&gt;, giao diện hiện ra như hình dưới điền tên vào nha (Mà điền tên nào liên quan tí vì cái này sẽ là &lt;strong&gt;domain&lt;/strong&gt; của mình luôn ấy)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://dev.tocreate-new-repository"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKsl-WKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/4gRn07W.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sau đó nhấn &lt;strong&gt;Create repository&lt;/strong&gt; và làm theo các bước dưới đây (gõ trong command line nhé)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir MY_PROFILE 
README.md // Tạo file tên như vậy nhá
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/NguyenThienLy/MY_PROFILE.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Như vậy, sau khi thao tác xong reponsitory của bạn sẽ giống hình dưới đây, rồi chuẩn bị xong rồi đó @-@&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tomy-repository"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UVE4Zksi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/C4dLxqu.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. &lt;strong&gt;BEM&lt;/strong&gt; là gì, sao phải dùng &lt;strong&gt;BEM&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.toBEM-example"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MflkDMFg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/b41uo5R.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;BEM — Block Element Modifier is a methodology that helps you to create reusable components and code sharing in front-end development&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Qui ước đặt tên
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.block {}   /* Block */

.block__element {}  /* Element */

.block--modifier {}  /* Modifier */
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Định nghĩa ở trên đây (Đọc thêm về &lt;strong&gt;BEM&lt;/strong&gt; ở &lt;a href="http://getbem.com/"&gt;đây&lt;/a&gt;) nhưng mình chỉ muốn nói rằng trước đây khi chúng ta đặt tên &lt;strong&gt;class&lt;/strong&gt; trong &lt;strong&gt;css&lt;/strong&gt; đôi khi đã xảy ra những lỗi về &lt;strong&gt;mức độ ưu tiên&lt;/strong&gt; trong &lt;strong&gt;css&lt;/strong&gt;, hay đặt tên không chuẩn một khi &lt;strong&gt;project&lt;/strong&gt; lớn lên sẽ gây nhiều phiền phức ... Có nhiều quy tắc để giải quyết vấn đề này nhưng mình thấy &lt;strong&gt;BEM&lt;/strong&gt; là dễ hiểu và thực hành mà vẫn giải quyết được các vấn đề liên quan&lt;/p&gt;

&lt;p&gt;Cách thực hành &lt;strong&gt;BEM&lt;/strong&gt; mình sẽ làm ứng dụng trực tiếp vào cái &lt;strong&gt;Project CV&lt;/strong&gt; này luôn ^^&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Cấu trúc Project
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Các bạn có thể tự thiết kế cho mình một bản &lt;strong&gt;PSD&lt;/strong&gt; theo ý thích nhưng mình thiết kế không đẹp, nên mình sẽ chọn một &lt;strong&gt;CV&lt;/strong&gt; đã có sẵn để &lt;strong&gt;clone&lt;/strong&gt; lại nha. Từ bản clone này các bạn có thể thêm mắm, muối để biến nó thành một bản &lt;strong&gt;CV&lt;/strong&gt; của chính mình !!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;CV&lt;/strong&gt; này mình được một người bạn gửi cho và thực sự mình cảm thấy nó quá đẹp và đáng để mình học hỏi nha, link đây &lt;strong&gt;brittanychiang.com&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bắt đầy với việc chia cấu trúc project như dưới đây (Mình chia như vầy để &lt;strong&gt;deploy&lt;/strong&gt; lên &lt;strong&gt;git-hub&lt;/strong&gt; chạy được luôn nha)&lt;/p&gt;

&lt;p&gt;Cây thư mục sẽ trông như vậy&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── images
└─── css
│     └─── page
│     │      └─── index.css
│     │      └─── blog.css
│     └─── container
│     └─── component
└─── js
│     └─── page
│     └─── container
│     └─── component
└─── index.html
└─── blog.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Giờ mình sẽ bắt đầu phân tích một thành phần dưới đây trong trang web theo &lt;strong&gt;BEM&lt;/strong&gt; nhé&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.toheader"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9qZqeU1H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/Sg0bW09.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bạn để ý rằng &lt;strong&gt;block header&lt;/strong&gt; này có 3 &lt;strong&gt;Element&lt;/strong&gt; gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logo&lt;/strong&gt; bên trái&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menu&lt;/strong&gt; ở giữa&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;button&lt;/strong&gt; bên phải&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Một chú ý là &lt;strong&gt;Element button&lt;/strong&gt; sẽ được dùng lại trong project này vì vậy mình cũng sẽ xem &lt;strong&gt;Element Button như một Block độc lập và nằm trong Block Header&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vậy giờ sẽ thêm các file thích hợp vào cây thư mục, nó sẽ trông như vầy ^^&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── images
└─── css
│     └─── page
│     │      └─── index.css
│     │      └─── blog.css
│     └─── container
│     │      └─── header.css
│     └─── component
│            └─── button.css
└─── js
│     └─── page
│     └─── container
│     └─── component
└─── index.html
└─── blog.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Khi bắt đầu với &lt;strong&gt;BEM&lt;/strong&gt; mình đã dùng sai về nguyên tắc của nó, vì vậy vào phần sau mình sẽ chia sẽ cho các bạn nghe nhé ^^&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Kết bài
&lt;/h2&gt;

&lt;p&gt;Đến đây cũng đã hết phần này rồi, để tiếp tục theo dõi mấy bạn kích vào &lt;a href="https://dev.to/nguyenthienly/create-cv-with-bem-2-29m7"&gt;đây&lt;/a&gt; để đi qua phần 2 nhé&lt;/p&gt;

&lt;p&gt;Chúc mọi người vượt qua mùa dịch an toàn, và làm những điều thật có ít nhé&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mày không thoát được đâu con trai, tu be không tình yêu&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/"&gt;https://www.w3schools.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.topcv.vn/"&gt;https://www.topcv.vn/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cvsimply.com/"&gt;https://www.cvsimply.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getbem.com/"&gt;http://getbem.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bem</category>
      <category>html</category>
      <category>github</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Unit test in typescript by jest</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Wed, 01 Apr 2020 06:37:37 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/unit-test-in-typescript-by-jest-hb0</link>
      <guid>https://dev.to/nguyenthienly/unit-test-in-typescript-by-jest-hb0</guid>
      <description>&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vấn đề&lt;/li&gt;
&lt;li&gt;Chuẩn bị&lt;/li&gt;
&lt;li&gt;Unit testing là gì?&lt;/li&gt;
&lt;li&gt;Jest là gì?&lt;/li&gt;
&lt;li&gt;Config jest &lt;/li&gt;
&lt;li&gt;Demo nhẹ &lt;/li&gt;
&lt;li&gt;Kết bài&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Vấn đề
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xin chào tất cả mọi người, làm developer thì ai cũng phải viết &lt;strong&gt;unit test&lt;/strong&gt; (Định nghĩa phần 2) phải không nào, bài viết này mình xin giới thiệu một package hỗ trợ viết &lt;strong&gt;unit test&lt;/strong&gt; trong &lt;strong&gt;javascript&lt;/strong&gt; rất hay ho đó là &lt;strong&gt;jest&lt;/strong&gt;, mọi người cùng theo dõi nhé&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mình sẽ config và demo &lt;strong&gt;jest&lt;/strong&gt; trong typescript nhé, mong mọi người chú ý theo dõi&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Chuẩn bị
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Editor (Mình đề xuất &lt;strong&gt;VScode&lt;/strong&gt; nhé vì mình xài cái này)&lt;/li&gt;
&lt;li&gt;Nodejs&lt;/li&gt;
&lt;li&gt;Có sẵn một project viết bằng &lt;strong&gt;typescript + expressjs nhé&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jest&lt;/strong&gt; plugin (Hôm nay mình demo cái này)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Giờ thì, &lt;strong&gt;let's go !!!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Unit testing là gì?
&lt;/h2&gt;

&lt;p&gt;Unit Test là một loại kiểm thử phần mềm trong đó các đơn vị hay thành phần riêng lẻ của phần mềm được kiểm thử. Kiểm thử đơn vị được thực hiện trong quá trình phát triển ứng dụng. Mục tiêu của Kiểm thử đơn vị là cô lập một phần code và xác minh tính chính xác của đơn vị đó.&lt;/p&gt;

&lt;p&gt;Một Unit là một thành phần PM nhỏ nhất mà ta có thể kiểm tra được như các hàm (Function), thủ tục (Procedure), lớp (Class), hoặc các phương thức (Method).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Các bạn đọc thêm ở &lt;a href="https://topdev.vn/blog/unit-test-la-gi/"&gt;đây&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Jest là gì
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Jest is a delightful JavaScript Testing Framework with a focus on simplicity.&lt;/p&gt;

&lt;p&gt;It works with projects using: Babel, TypeScript, Node, React, Angular, Vue and more!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Định nghĩa trên lấy từ &lt;a href="https://jestjs.io/"&gt;đây&lt;/a&gt;. Nếu ai xài &lt;strong&gt;Mocha&lt;/strong&gt; rồi thì biết &lt;strong&gt;jest&lt;/strong&gt; này tương tự về cách giải quyết vấn đề nha, nhưng &lt;strong&gt;jest&lt;/strong&gt; tích hợp đầy đủ hơn không như &lt;strong&gt;mocha&lt;/strong&gt; phải cài thêm &lt;strong&gt;chai và sinon&lt;/strong&gt; nữa, các bạn xem thêm trên &lt;a href="https://www.npmtrends.com/mocha-vs-jest"&gt;đây&lt;/a&gt; để so sánh khách quan nhé  &lt;/p&gt;

&lt;h2&gt;
  
  
  4. Config jest
&lt;/h2&gt;

&lt;p&gt;Cài đặt các &lt;strong&gt;package&lt;/strong&gt; bằng lệnh dưới đây&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @types/jest jest ts-jest 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@types/jest&lt;/strong&gt; &lt;strong&gt;type jest&lt;/strong&gt; trong &lt;strong&gt;typescript&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jest&lt;/strong&gt; package hỗ trợ viết &lt;strong&gt;unit testing&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ts-jest&lt;/strong&gt; hỗ trợ &lt;strong&gt;jest&lt;/strong&gt; trong &lt;strong&gt;typescript&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vào trong project có sẵn về &lt;strong&gt;typescript&lt;/strong&gt; ở &lt;strong&gt;root project&lt;/strong&gt; tạo file &lt;strong&gt;jest.config.js&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;jest.config.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;roots&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;rootDir&amp;gt;/src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt; 
  &lt;span class="c1"&gt;// Xác định nơi bỏ các file testing &lt;/span&gt;
  &lt;span class="c1"&gt;// Thông thuòng ra sẽ bỏ các file typescript vào hết thư mục src&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;testMatch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/__tests__/**/*.+(ts|tsx|js)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/?(*.)+(spec|test).+(ts|tsx|js)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt; 
  &lt;span class="c1"&gt;// Jest sẽ dựa định dạng này để phát hiện các file &lt;/span&gt;
  &lt;span class="c1"&gt;// cần được testing nhé&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transform&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^.+&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;.(ts|tsx)$&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ts-jest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; 
  &lt;span class="c1"&gt;// Thằng ts-jest sẽ xác định các file có dạng này&lt;/span&gt;
  &lt;span class="c1"&gt;// Sau đó sẽ biến đổi về dạng nó có thể hiểu được&lt;/span&gt;
  &lt;span class="c1"&gt;// Để chạy jest&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;verbose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Báo cáo các bài test lúc đang chạy &lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;globals&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ts-jest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;diagnostics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// Ồ ồ cái này cần à nghe, cái này để các hàm&lt;/span&gt;
  &lt;span class="c1"&gt;// của thằng jest trở thành globals&lt;/span&gt;
  &lt;span class="c1"&gt;// không cần phải require hay import khi dùng nữa&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Giờ trong file &lt;strong&gt;tsconfig.json&lt;/strong&gt; sẽ thêm một ít&lt;br&gt;
ở &lt;strong&gt;exclude&lt;/strong&gt; nó trông như vậy nè&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tsconfig.json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"es6"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resolveJsonModule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"reflect-metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Chú&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ý&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ở&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;đây&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;phải&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;có&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cài&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;này&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;không&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;.ts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sẽ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;báo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;lỗi&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"esModuleInterop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"commonjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moduleResolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"experimentalDecorators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"emitDecoratorMetadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/*.spec.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"**/*.test.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"./src/**/*"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Rồi giờ để chạy được &lt;strong&gt;test&lt;/strong&gt; thì mình sẽ thêm  tý ở file &lt;strong&gt;package.json&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;package.json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "scripts": {
      ...
      "test": "jest --detectOpenHandles"
    },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Khi nào muốn chạy thì gõ &lt;strong&gt;npm run test&lt;/strong&gt; là được nha, như vậy là phần &lt;strong&gt;config&lt;/strong&gt; như xong, cây thư mục sẽ nhìn giống dưới đây nè ^^&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── node_modules
└─── jest.config.js
└─── tsconfig.json
└─── package.json
│ 
└─── src
    └─── test
    └─── app.ts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Demo nhẹ
&lt;/h2&gt;

&lt;p&gt;describe("Filter function", () =&amp;gt; {&lt;br&gt;
Tạo một file &lt;strong&gt;app.spec.ts&lt;/strong&gt; (hoặc &lt;strong&gt;app.test.ts&lt;/strong&gt;) trong thư mục &lt;strong&gt;test&lt;/strong&gt;, các hàm &lt;strong&gt;test&lt;/strong&gt;, &lt;strong&gt;describe&lt;/strong&gt; đều là &lt;strong&gt;global&lt;/strong&gt; nãy mình đã &lt;strong&gt;config&lt;/strong&gt; rồi nhé @-@&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app.spec.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;filterByTerm&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Filter function&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;it should filter by a search term (link)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.url1.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.url2.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.link3.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.link3.dev&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}];&lt;/span&gt;

    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filterByTerm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Coppy đoạn code dưới đây vào &lt;strong&gt;app.ts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;filterByTerm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputArr&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;inputArr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arrayElement&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arrayElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;searchTerm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cấu trúc thư mục sẽ trông như vầy nhé&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;└─── node_modules
└─── jest.config.js
└─── tsconfig.json
└─── package.json
│ 
└─── src
    └─── test
          └─── app.spec.ts
    └─── app.ts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Kết quả:&lt;br&gt;
&lt;a href="https://i.imgur.com/6ThkADR.jpg/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qYI1aOwJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/6ThkADR.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Kết bài
&lt;/h2&gt;

&lt;p&gt;Vậy cũng đã hết bài rồi, hy vọng bài viết này sẽ giúp các bạn cài đặt được &lt;strong&gt;jest&lt;/strong&gt; trong &lt;strong&gt;typescript&lt;/strong&gt; để sử dụng nhé, cảm ơn và xin chào&lt;/p&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://topdev.vn/blog/unit-test-la-gi"&gt;https://topdev.vn/blog/unit-test-la-gi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/"&gt;https://jestjs.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmtrends.com/mocha-vs-jest"&gt;https://www.npmtrends.com/mocha-vs-jest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jest</category>
      <category>typescript</category>
      <category>unittest</category>
    </item>
    <item>
      <title>Intergrate jade into typescript expressjs</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Mon, 30 Mar 2020 15:13:56 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/intergrate-jade-into-typescript-expressjs-281l</link>
      <guid>https://dev.to/nguyenthienly/intergrate-jade-into-typescript-expressjs-281l</guid>
      <description>&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vấn đề&lt;/li&gt;
&lt;li&gt;Jade là gì ?&lt;/li&gt;
&lt;li&gt;Cài đặt thư mục static (express) và dùng &lt;strong&gt;jade&lt;/strong&gt; trong &lt;strong&gt;typescript&lt;/strong&gt; và &lt;/li&gt;
&lt;li&gt;Cài đặt package coppyfiles&lt;/li&gt;
&lt;li&gt;Tạo Key api trong google và chèn map google vào html của bạn&lt;/li&gt;
&lt;li&gt;Embed map dark-sky vào html của bạn&lt;/li&gt;
&lt;li&gt;Kết bài&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Vấn đề
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xin chào mọi người hôm này mình sẽ demo thằng &lt;strong&gt;Jade&lt;/strong&gt; một &lt;strong&gt;template engines&lt;/strong&gt; dùng cho &lt;strong&gt;Nodejs&lt;/strong&gt; để render &lt;strong&gt;html, css, js&lt;/strong&gt; nhé&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Khi bạn cài đặt được thằng &lt;strong&gt;Jade&lt;/strong&gt; này rồi thì những thằng &lt;strong&gt;Pug, handlebars, ejs&lt;/strong&gt; tương tự thôi nhé&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nào cùng bắt đầu thôi :v &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Jade là gì?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Jade is a template engine for Node.js. Jade syntax is easy to learn. It uses whitespace and indentation as a part of the syntax.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Trên là định nghĩa nha (đọc thêm ở &lt;a href="https://www.tutorialsteacher.com/nodejs/jade-template-engine"&gt;đây&lt;/a&gt;), nếu bạn nào dùng &lt;strong&gt;Pug&lt;/strong&gt; (đọc thêm ở &lt;a href="https://pugjs.org/api/getting-started.html"&gt;đây&lt;/a&gt;) rồi thì hai thằng này khá giống nhau đó&lt;/p&gt;

&lt;p&gt;Dưới đây là cú pháp của thằng &lt;strong&gt;Jade&lt;/strong&gt; nha&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.jade&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;doctype html
html
    head
        title Jade Page
    body
        h1 This page is produced by Jade engine
        p some paragraph here..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;html dưới đây sau khi chuyển thành jade thì nó ra ở trên nha &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Jade Page&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;This page is produced by Jade engine&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;some paragraph here..&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Lúc code mình cứ code &lt;strong&gt;html&lt;/strong&gt; như thường. Code xong coppy hết đống code đó dán vào &lt;a href="https://html2jade.org/"&gt;đây&lt;/a&gt;. Như vậy là chạy ngon luôn&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Cài đặt thư mục static (express) trong &lt;strong&gt;typescript&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Khi bạn code một trang &lt;strong&gt;html&lt;/strong&gt; thông thường bạn sẽ có file .css hay .js phải không nào, vậy thì khi sài express bạn sẽ để chúng ở đâu để các file &lt;strong&gt;.jade&lt;/strong&gt; có thể sử dụng được. Câu trả lời là sử dụng &lt;strong&gt;express.static&lt;/strong&gt; một middle function trong &lt;strong&gt;expressjs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cách cài đặt trong &lt;strong&gt;typescript&lt;/strong&gt; dưới đây nhé, giờ mình bỏ hết các file &lt;strong&gt;.js, .css&lt;/strong&gt; vào thư mục &lt;strong&gt;public&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;app.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;views&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;views&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Các template engine khác tương tự nhé&lt;/span&gt;
   &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;view engine&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jade&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="c1"&gt;// Mà nhớ là thằng expressjs nó sẽ đi tìm mặc định thư mục views nên nhớ nhét đống file .jade đúng chỗ coi chừng không chạy được đâu :V&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Mọi người chú ý là dùng &lt;strong&gt;__dirname&lt;/strong&gt; để lấy đường dẫn tuyệt đối nhé chứ không có khi code không chạy không biết tại sao đâu :v, xong rồi&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Cài đặt package coppyfiles
&lt;/h2&gt;

&lt;p&gt;Thông thường thì thằng &lt;strong&gt;tsc&lt;/strong&gt; nó chỉ nhận diện các file &lt;strong&gt;.ts&lt;/strong&gt; và chuyển vào thư mục hết đống code &lt;strong&gt;..ts&lt;/strong&gt; đó ra &lt;strong&gt;.js&lt;/strong&gt;. Vì thế nếu trong thư &lt;strong&gt;src (Thư mục chứa code)&lt;/strong&gt; có file định kiểu &lt;strong&gt;.html, .js, .jade&lt;/strong&gt; thì chúng ta phải coppy bằng tay khá là lằng nhằng. Vì vậy mình xài một package chuyên làm việc này nhá đó là &lt;strong&gt;coppyfiles&lt;/strong&gt; (Đọc thêm ở &lt;a href="https://www.npmjs.com/package/copyfiles"&gt;đây&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Làm tuần tự theo dưới đây nhé&lt;/p&gt;

&lt;p&gt;Gõ vào &lt;strong&gt;command line&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i -d copyfiles 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Giờ vào file &lt;strong&gt;package.json&lt;/strong&gt; để cấu hình như sau&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"jade": "copyfiles -u 1 src/**/*.jade build/" // Cái này cấu hình cho em .jace mà mình đang sài nè
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"public": "copyfiles -u 1 src/**/**/*.css src/**/**/*.js src/**/*.html build/" // Cái cuối cùng cấu hình cho nguyên cái thư mục static mình cài ở trên nè :v
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Xong rồi, mà nhớ lúc chạy, sau khi cho thằng &lt;strong&gt;tsc&lt;/strong&gt; đưa hết các file &lt;strong&gt;.ts&lt;/strong&gt; sang &lt;strong&gt;js&lt;/strong&gt; rồi, thì gõ lệnh mình đã cài ở trên&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run jade
npm run public
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Tạo Key api trong google và chèn map google vào html của bạn
&lt;/h2&gt;

&lt;p&gt;Cái bước này thì cũng dễ thôi vì api của anh &lt;strong&gt;google&lt;/strong&gt; là dễ xài nhất rồi (Các bước ở &lt;a href="https://developers.google.com/maps/documentation/embed/get-api-key"&gt;đây&lt;/a&gt;) nhưng có vài chú ý anh em để ý hộ mình nha.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search &lt;strong&gt;Maps JavaScript API&lt;/strong&gt; để check xem nó đã &lt;strong&gt;enable&lt;/strong&gt; chưa nhé vì mình sài &lt;strong&gt;google maps&lt;/strong&gt; mà không bật nó lên không sài được đâu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vào mục &lt;strong&gt;Credentials&lt;/strong&gt; của phần &lt;strong&gt;API và Services&lt;/strong&gt;, chọn &lt;strong&gt;api_key&lt;/strong&gt; vừa tạo =&amp;gt; &lt;strong&gt;Application restrictions&lt;/strong&gt; =&amp;gt; &lt;strong&gt;HTTP referrers(web site)&lt;/strong&gt; =&amp;gt; Thêm địa chỉ mà mình dùng để dev nhé&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:5500 // Cái này chạy live server khi code html, css

http://127.0.0.1:9001 // Cái này chạy web app với express nè
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cuối cùng anh em đọc bài &lt;a href="https://developers.google.com/maps/documentation/embed/get-api-key"&gt;này&lt;/a&gt; là show lên được rồi á nha (Mà hình như chỉ dev được thôi chứ không dùng product với dạng free này)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Embed map dark-sky vào html của bạn
&lt;/h2&gt;

&lt;p&gt;Thằng &lt;strong&gt;dark-sky&lt;/strong&gt; (đọc thêm ở &lt;a href="https://darksky.net/forecast/40.7127,-74.0059/us12/en"&gt;đây&lt;/a&gt;) này rất hay đó :v, ai muốn làm ứng dụng dự báo thời tiết thì cực ngon rồi, có hỗ trợ API và dùng free cho dev luôn&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mà mình lúc đầu không tích hợp được map nó vào trong website của mình (Đọc được chính sách nó không cho sài luôn :v), search hồi thấy người khác sài được nên mình mạng phép lấy cái &lt;strong&gt;embed&lt;/strong&gt; này share cho anh em nha, cứ thả vào là chạy quá ngon&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;iframe style="height: 100%;" src="https://maps.darksky.net/@temperature,34.595,20.013,undefined?embed=true&amp;amp;amp;timeControl=true&amp;amp;amp;fieldControl=true&amp;amp;amp;defaultField=temperature&amp;amp;amp;defaultUnits=_f" width="100%" height="150" frameborder="0"&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Kết bài
&lt;/h2&gt;

&lt;p&gt;Bài viết này mình viết theo xu hướng là giữ lại kiến thức cho bản thân và share cho nhưng ai đã làm được phần nào project &lt;strong&gt;expressjs&lt;/strong&gt; có sài &lt;strong&gt;template engines&lt;/strong&gt; rồi nha có gì khó hiểu mong mọi người bỏ qua cho cảm ơn mọi người rất nhiều&lt;/p&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.tutorialsteacher.com/nodejs/jade-template-engine"&gt;https://www.tutorialsteacher.com/nodejs/jade-template-engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://html2jade.org/"&gt;https://html2jade.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/copyfiles"&gt;https://www.npmjs.com/package/copyfiles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/maps/documentation/embed/get-api-key"&gt;https://developers.google.com/maps/documentation/embed/get-api-key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/maps/documentation/embed/get-api-key"&gt;https://developers.google.com/maps/documentation/embed/get-api-key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://darksky.net/forecast/40.7127,-74.0059/us12/en"&gt;https://darksky.net/forecast/40.7127,-74.0059/us12/en&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://geoawesomeness.com/darksky-launched-weather-website-really-cool-maps/https:/geoawesomeness.com/darksky-launched-weather-website-really-cool-maps/"&gt;https://geoawesomeness.com/darksky-launched-weather-website-really-cool-maps/https:/geoawesomeness.com/darksky-launched-weather-website-really-cool-maps/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>googleapi</category>
      <category>darksky</category>
    </item>
    <item>
      <title>Import vs require</title>
      <dc:creator>Nguyen Thien Ly</dc:creator>
      <pubDate>Sun, 29 Mar 2020 08:29:13 +0000</pubDate>
      <link>https://dev.to/nguyenthienly/import-vs-require-3kmn</link>
      <guid>https://dev.to/nguyenthienly/import-vs-require-3kmn</guid>
      <description>&lt;h2&gt;
  
  
  Mục lục
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Vấn đề&lt;/li&gt;
&lt;li&gt;Require là gì ?&lt;/li&gt;
&lt;li&gt;Import là gì?&lt;/li&gt;
&lt;li&gt;Sự khác nhau giữa require và import&lt;/li&gt;
&lt;li&gt;Kết bài&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  0. Vấn đề
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Heyzo what's up&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xin chào tất cả mọi người, trước đây khi bắt đầu sử dụng &lt;strong&gt;import&lt;/strong&gt; để thay thế &lt;strong&gt;require&lt;/strong&gt; một package hay một module đã có để sử dụng. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Có một thắc mắc là tại sao lại sinh ra thằng &lt;strong&gt;import&lt;/strong&gt; nhỉ trong khi &lt;strong&gt;require&lt;/strong&gt; vẫn dùng tốt?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sau khi tìm hiểu hôm nay mình sẽ trả lời thắc mắc đó theo suy nghĩ của mình, các bạn cùng đọc và cho ý kiến nhé &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Require là gì?
&lt;/h2&gt;

&lt;p&gt;Là hàm được xây dựng trong &lt;strong&gt;Nodejs theo chuẩn commonjs&lt;/strong&gt; giúp việc khai báo sử dụng các module đã có sẵn rất dễ dàng, xem ví dụ dưới nhé&lt;/p&gt;

&lt;p&gt;Tạo ra một module trong file&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;hello.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = function () {
  console.log('Hello everybody!')
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Giờ, require &lt;strong&gt;hello.js&lt;/strong&gt; vào để sử dụng &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;main.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var hello = require('./hello.js')

hello(); // Hello everybody
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Rất dễ dàng phải không nào :v&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Import là gì?
&lt;/h2&gt;

&lt;p&gt;Là tính năng trong &lt;strong&gt;ES6&lt;/strong&gt; giúp việc khai báo sử dụng các module đã có sẵn rất dễ dàng, à hình như cũng khá là giống &lt;strong&gt;require&lt;/strong&gt; nhỉ :v. Vậy chúng khác nhau cái gì đây, &lt;em&gt;_- chả nhẻ chỉ đổi cách xưng hô, qua phần 3 sẽ rõ nhé. **Let's go&lt;/em&gt;*&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sự khác nhau giữa require và import
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Giống nhau
&lt;/h3&gt;

&lt;p&gt;Trước khi nói điểm khác thì mình xin nói điểm giống giữa hai thằng &lt;strong&gt;require&lt;/strong&gt; và &lt;strong&gt;import&lt;/strong&gt; này nhé&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giúp việc khai báo sử dụng các module đã có sẵn rất dễ dàng, quản lí code theo module tốt hơn&lt;/li&gt;
&lt;li&gt;Khi biên dịch thì &lt;strong&gt;import&lt;/strong&gt; cũng trở về &lt;strong&gt;require&lt;/strong&gt; để code có thể thực thi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Khác nhau
&lt;/h3&gt;

&lt;p&gt;Thực chất là những thứ hay ho mà thằng &lt;strong&gt;import&lt;/strong&gt; này có mà thằng có nhé (Lí do được sinh ra)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Theo mình cảm nhận thì khi dùng thằng import thì mọi người thấy code mình sáng hơn phải không nào đó là điều đầu tiền mà &lt;strong&gt;import&lt;/strong&gt; mang lại nhé (Cảm quan thôi :v) =&amp;gt; &lt;strong&gt;Giúp code dễ nhìn đẹp đẽ hơn&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;require&lt;/strong&gt; trong &lt;strong&gt;Nodejs theo chuẩn commonjs&lt;/strong&gt;, còn &lt;strong&gt;import&lt;/strong&gt; mới có trong &lt;strong&gt;ES6&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trong một &lt;em&gt;package, file&lt;/em&gt; có nhiều module thì việc mong muốn chỉ khai báo các module muốn sử dụng để khỏi lãng phí tài nguyên là mong muốn chính đáng phải không nào &lt;strong&gt;&lt;em&gt;(Good good good)&lt;/em&gt;&lt;/strong&gt;. &lt;strong&gt;import&lt;/strong&gt; cho phép bạn lấy ra từng phần mà bạn thực sự dùng (Không cần lấy ra cả package hay file như anh require nhé) =&amp;gt; &lt;strong&gt;Giúp tiết kiệm bộ nhớ&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Đối với &lt;strong&gt;require&lt;/strong&gt; việc thực thi theo &lt;strong&gt;synchronous&lt;/strong&gt; (Đồng bộ). Còn đối với &lt;strong&gt;import&lt;/strong&gt; sẽ thực thi theo &lt;strong&gt;asynchronous&lt;/strong&gt; (Bất đồng bộ), không quan tâm &lt;strong&gt;Chi Dân&lt;/strong&gt; tới &lt;strong&gt;import&lt;/strong&gt; thằng trên mình =&amp;gt; &lt;strong&gt;Hiệu suất cải thiện hơn&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var hello = require('./hello.js')
var hello1 = require('./hello1.js')
var hello2 = require('./hello2.js')

Lúc loading lên lần lượt là hello -&amp;gt; hello1 -&amp;gt; hello2
-----------------------------

import hello from './hello.js'
import hello1 from './hello1.js'
import hello2 from './hello2.js'

Lúc loading lên có thể là là hello2 -&amp;gt; hello -&amp;gt; hello1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Kết bài
&lt;/h2&gt;

&lt;p&gt;Đến đây cũng đã hết bài viết rồi, cảm ơn mọi người đã theo dõi. Nếu có góp ý hay thắc mắc gì thì cứ để lại comment bên dưới mình sẽ trả lời. Xin chào mọi người. &lt;/p&gt;

&lt;h4&gt;
  
  
  Link tham khảo:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/46677752/the-difference-between-requirex-and-import-x"&gt;https://stackoverflow.com/questions/46677752/the-difference-between-requirex-and-import-x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/knowledge/getting-started/what-is-require/"&gt;https://nodejs.org/en/knowledge/getting-started/what-is-require/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
