Làm thế nào để setup path alias với React, Typescript, Webpack

Code by love

Đặt vấn đề

Khi bạn làm một project và import một component vào bên trong một component. Và component này nằm rất sâu so với component dùng nó thì bạn sẽ gặp trường hợp như sau:

import MyComponent from../../../../../components/MyComponent”

Mọi thứ hoạt động hoàn toàn bình thường. NHƯNG nếu bạn move MyComponent đi thì sao? Đoạn code import bên trên chỉ là đường dẫn relative. khi bạn move thì sẽ ảnh hưởng đến toàn bộ component đang dùng MyComponent và việc lúc này là phải đi rà soát lại toàn bộ những nơi dùng component đấy. Mệt phải không?

Giải pháp mang tên path alias

Thay vì dùng đường dẫn relative dài loằng ngoằng như vậy thì chúng ta sẽ định nghĩa một đường dẫn kiểu alias (bạn có thể hiểu là nó như một biến, đại diện cho đường dẫn đến component)

Cấu trúc thư mục như này

src
  |
  components
  |
  helpers

Thêm vào tsconfig.json

{
  “compilerOptions”: {
    //other rules,
    "baseUrl": "./src", // complier sẽ tính gốc bắt đầu từ src
    "paths": {
      "@Components/*": ["./components/*"], // gốc lúc này là src cho nên sẽ là ./components
      "@Helpers/*": ["./helpers/*"],    
    }
  }
}

Ngoài ra để webpack có thể hiểu được thì ta cần setup thêm như sau

yarn add --dev tsconfig-paths-webpack-plugin

// or

npm install --save-dev tsconfig-paths-webpack-plugin
// webpack.config.ts

const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');

module.exports = {
  //other rules
  resolve: {
    plugins: [new TsconfigPathsPlugin()],
  }
}

Sau đó thay vì như này

import MyComponent from../../../../../components/MyComponent”

Sẽ thành như này

import MyComponent from “@Components/MyComponent”

Và kèm theo đó bây giờ bạn có di chuyển component đấy đi đâu cũng đc, chỉ cần nó vẫn nằm trong folder components là được 😍. Thật là đỉnh phải không?

Example

Bạn có thể tham khảo qua link git này của mình. Muốn chi tiết hơn và đúng với bài này bạn nên tìm commit add path alias

Source

Comments

Contact for work:Skype
Code from my 💕