{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/set-up-path-aliases-in-nodejs","result":{"data":{"markdownRemark":{"id":"7996da32-a203-51ff-b9e3-761f5b6f4fdd","html":"<p>Dạo gần đây mình đang code 1 <strong>pet project</strong> sử dụng <strong>nodejs</strong> ở <strong>back-end</strong>, vừa để tự học thêm trong thời gian rảnh vừa khỏi quên kiến thức, thì gặp phải 1 vấn để rất nhức nhối liên quan đến đường dẫn (<strong>path</strong>) mà có thể anh em đã gặp phải nhiều rồi…</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> saveUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'../../../../../models/User'</span>\n<span class=\"token keyword\">import</span> homeController <span class=\"token keyword\">from</span> <span class=\"token string\">'../../../../../controllers/home'</span></code></pre></div>\n<p>Code này hẳn đã khiến nhiều anh em đau đầu khi không thể biết được cần phải đi ra, đi vào bao nhiêu <strong>folder</strong> để tìm đúng <strong>file</strong> mong muốn 😭😭, nếu chẳng may cần chuyển chỗ 1 folder thì sẽ phải update lại <strong>path</strong> ở tất cả những file <strong>import</strong> module đó 😤</p>\n<p>Nhưng nếu chúng ta có thể định nghĩa <strong>alias</strong> (hiểu đơn giản là <strong>shortcut</strong>) cho những <strong>module</strong> thường xuyên phải <strong>import</strong> trong toàn bộ project thì sao?</p>\n<p>Ví dụ như này:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> saveUser <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'@models/User'</span>\n<span class=\"token keyword\">import</span> homeController <span class=\"token keyword\">from</span> <span class=\"token string\">'@controllers/home'</span></code></pre></div>\n<p>Trong đó:</p>\n<ul>\n<li><code class=\"language-text\">@models</code> tương đương với module <code class=\"language-text\">./src/models/*</code></li>\n<li><code class=\"language-text\">@controllers</code> tương đương với module <code class=\"language-text\">./src/controllers/*</code></li>\n</ul>\n<p>Giải pháp hoàn toàn đơn giản với <a href=\"https://www.npmjs.com/package/module-alias\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">module-alias</a> và config <code class=\"language-text\">tsconfig.json</code>. Anh em làm theo hướng dẫn để set up nhé</p>\n<h2 id=\"update-tsconfigjson\" style=\"position:relative;\"><a href=\"#update-tsconfigjson\" aria-label=\"update tsconfigjson permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Update tsconfig.json</h2>\n<p>Mở file <strong>tsconfig.json</strong> lên và thêm vào những config sau vào <strong>compilerOptions</strong> object:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"compilerOptions\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token comment\">// other configs...</span>\n\t<span class=\"token property\">\"baseUrl\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"./src\"</span><span class=\"token punctuation\">,</span>\n\t<span class=\"token property\">\"paths\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token property\">\"*\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n\t\t\t\t\t<span class=\"token string\">\"node_modules/*\"</span><span class=\"token punctuation\">,</span>\n\t\t\t\t\t<span class=\"token string\">\"src/types/*\"</span>\n\t\t\t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"@controllers/*\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n\t\t\t\t\t<span class=\"token string\">\"controllers/*\"</span>\n\t\t\t<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n\t\t\t<span class=\"token property\">\"@models/*\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n\t\t\t\t\t<span class=\"token string\">\"models/*\"</span>\n\t\t\t<span class=\"token punctuation\">]</span>\n\t<span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Trong đó <code class=\"language-text\">@controllers</code> hay <code class=\"language-text\">@models</code> chính là <strong>alias</strong> cho module của các bạn (có thể dùng bất cứ <strong>naming convention</strong> nào tùy ý, không cần thiết phải chứa <code class=\"language-text\">@</code> ở đầu, đó chỉ là <strong>prefix</strong> mình dùng để dễ phân biệt thôi)</p>\n<p>Bây giờ bạn hoàn toàn có thể sử dụng <strong>alias</strong> đã config trong project rồi, nhưng JS sẽ không <strong>resolve</strong> được module import với lỗi sau</p>\n<blockquote>\n<p>[Node] Error: Cannot find module ‘@models/User’</p>\n</blockquote>\n<h2 id=\"cài-đặt-module-alias-package\" style=\"position:relative;\"><a href=\"#c%C3%A0i-%C4%91%E1%BA%B7t-module-alias-package\" aria-label=\"cài đặt module alias package permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Cài đặt module-alias package</h2>\n<p>Module này sẽ giúp <strong>resolve</strong> các <strong>path alias</strong> trong file JS sau khi biên dịch</p>\n<ul>\n<li>\n<p>Cài đặt:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">npm</span> i --save module-alias <span class=\"token comment\"># hoặc yarn add module-alias</span></code></pre></div>\n</li>\n<li>\n<p>Config trong <strong>package.json</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"_moduleAliases\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token property\">\"@models\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dist/models\"</span><span class=\"token punctuation\">,</span>\n\t<span class=\"token property\">\"@controllers\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"dist/controllers\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Lưu ý rằng <code class=\"language-text\">dist/</code> là <strong>folder</strong> chứa code sau khi <strong>build</strong> của các bạn nhé (tùy vào config nó có thể là <code class=\"language-text\">dist/</code>, <code class=\"language-text\">build/</code>…)</p>\n</li>\n<li>\n<p>Cuối cùng là register module vào app của anh em</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token string\">'module-alias/register'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Chỉ cần <strong>import</strong> 1 lần vào file <strong>start</strong> của project thôi nhé (có thể là <code class=\"language-text\">index.ts</code>, <code class=\"language-text\">app.ts</code>, <code class=\"language-text\">server.ts</code>…)</p>\n</li>\n</ul>\n<h2 id=\"-done\" style=\"position:relative;\"><a href=\"#-done\" aria-label=\" done permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🎉🎉🎉 Done</h2>\n<p>Bây giờ anh em chỉ cần reload <strong>IDE</strong>, <strong>start project</strong> và có thể xài <strong>alias</strong> thoải mái rồi nhé.</p>\n<p><img src=\"/media/vscode.png\" alt=\"VS Code Recommendation\"></p>\n<p><strong>VS Code</strong> support luôn tính năng này bằng cách đọc file <strong>tsconfig.json</strong>, chỉ cần <strong>reload</strong> lại là được.</p>\n<p>Chúc anh em thành công!</p>\n<h2 id=\"tham-khảo\" style=\"position:relative;\"><a href=\"#tham-kh%E1%BA%A3o\" aria-label=\"tham khảo permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Tham khảo</h2>\n<ul>\n<li><a href=\"https://medium.com/zero-equals-false/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://medium.com/zero-equals-false/how-to-use-module-path-aliases-in-visual-studio-typescript-and-javascript-e7851df8eeaa</a></li>\n<li><a href=\"https://dev.to/larswaechter/path-aliases-with-typescript-in-nodejs-4353\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://dev.to/larswaechter/path-aliases-with-typescript-in-nodejs-4353</a></li>\n</ul>","fields":{"slug":"/posts/set-up-path-aliases-in-nodejs","tagSlugs":["/tag/alias/","/tag/path-aliases/","/tag/nodejs/","/tag/typescript/","/tag/tsconfig/","/tag/javascript/"]},"frontmatter":{"date":"2020-08-26T22:12:03.284Z","description":"Nếu như có thể định nghĩa alias (hiểu đơn giản là shortcut) cho những module mà chúng ta thường xuyên phải import trong toàn bộ project thì code sẽ đơn giản như thế nào... ","tags":["alias","path-aliases","nodejs","typescript","tsconfig","javascript"],"title":"Set up path aliases trong Node.js + Typescript","socialImage":"/media/road.jpg","headerImage":"/media/road.jpg"},"timeToRead":3}},"pageContext":{"slug":"/posts/set-up-path-aliases-in-nodejs"}}}