0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Hướng Dẫn Quản Lý Tài Nguyên Tĩnh Trong Kiến Trúc Microfrontend

Đăng vào 1 tháng trước

• 3 phút đọc

Xin chào các bạn! Chúng ta lại gặp nhau trong series "Chập Chững Làm Quen Với Microfrontend". Hôm nay, chúng ta sẽ cùng nhau tìm hiểu về cách xử lý các tài nguyên tĩnh như hình ảnh, file, SVG, v.v... trong kiến trúc microfrontend.

Bắt Đầu

Trước tiên, các bạn hãy clone nguồn code từ kho lưu trữ sau: Github Repository. Trong đó, bạn sẽ thấy 4 thư mục (1 app shell và 3 microfrontend ứng dụng).

Hãy chạy lệnh npm install trong từng thư mục để cài đặt các dependencies cần thiết.

Khởi Động Ứng Dụng

Chúng ta sẽ bắt đầu bằng cách khởi động ứng dụng React. Hãy vào thư mục react-app và chạy lệnh sau:

Copy
npm run dev

Bạn có thể truy cập địa chỉ http://localhost:3002 từ trình duyệt để xem kết quả.

Trong thư mục public, mình đã để sẵn 2 file SVG và PNG. Hãy thử hiển thị chúng bằng cách sửa đổi file src/App.tsx như sau:

javascript Copy
import "./App.css";

const App = () => {
  return (
    <div className="content">
      <h1>Rsbuild with React</h1>
      <p>Bắt đầu tạo ra những điều tuyệt vời với Rsbuild.</p>
      <div>
        <img src="/react.svg" alt="React Logo" width={50} />
      </div>
      <div>
        <img src="/rspack.png" alt="React Logo" height={100} />
      </div>
    </div>
  );
};

export default App;

Sau khi lưu lại, quay lại trình duyệt, bạn sẽ thấy hình ảnh đã hiển thị thành công.

Kết Nối Vào Kiến Trúc Microfrontend

Tiếp theo, chúng ta sẽ khởi động app-shell bằng lệnh sau:

Copy
npm start

Truy cập vào http://localhost:4200 và login với thông tin user/user. Tuy nhiên, có một vấn đề phát sinh: hình ảnh không hiển thị do chúng đang được hướng đến app shell.

Để khắc phục, bạn cần chỉ rõ đường dẫn cho các hình ảnh sử dụng định dạng mà các bundler cung cấp. Cụ thể là việc sử dụng import trong file JavaScript hoặc TypeScript. Dưới đây là cách cập nhật cho sử dụng Rsbuild:

javascript Copy
import "./App.css";
import reactLogo from "../public/react.svg";
import rsPackLogo from "../public/rspack.png";

const App = () => {
  return (
    <div className="content">
      <h1>Rsbuild with React</h1>
      <p>Bắt đầu tạo ra những điều tuyệt vời với Rsbuild.</p>
      <div>
        <img src={reactLogo} alt="React Logo" width={50} />
      </div>
      <div>
        <img src={rsPackLogo} alt="React Logo" height={100} />
      </div>
    </div>
  );
};

export default App;

Tùy Chọn Về Kích Thước Tài Nguyên

Mặc định, các tài nguyên có kích thước nhỏ hơn 4KB sẽ được inline thành base64, trong khi đó tài nguyên lớn hơn sẽ giữ URL. Bạn cũng có thể ép buộc inline bằng cách:

Copy
import reactLogo from "../public/react.svg?inline";

Xử Lý Tài Nguyên Tĩnh Với Vite

Giờ hãy tiếp tục với vue-app sử dụng Vite. Chạy lệnh:

Copy
npm run dev

Thay đổi file vue-app/src/App.vue như sau:

javascript Copy
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue';
import viteLogo from './assets/vite.svg';
import vueLogo from './assets/vue.png';
</script>

<template>
  <div>
    <a href="https://vitejs.dev" target="_blank">
      <img :src="viteLogo" alt="Vite Logo" />
    </a>
    <a href="https://vuejs.org/" target="_blank">
      <img :src="vueLogo" alt="Vue Logo" />
    </a>
  </div>
  <HelloWorld msg="Vite + Vue" />
</template>

Vite có thể tự động inline tài nguyên nhỏ hơn 4KB. Tuy nhiên, để sử dụng đúng cách, bạn cần thêm tài nguyên vào thư mục src thay vì public.

Cuối Cùng Là Angular Với Webpack

Cuối cùng, với ứng dụng Angular được xây dựng bằng Webpack, bạn cần thiết lập các loader để xử lý ảnh. Đừng quên kiểm tra cài đặt Typescript của bạn để đảm bảo hỗ trợ import JSON và hình ảnh.

json Copy
{
  "compilerOptions": {
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true
  }
}

Khởi động lại ứng dụng và kiểm tra kết quả.

Kết Luận

Như các bạn đã thấy, việc xử lý tài nguyên tĩnh trong microfrontend phụ thuộc vào từng bundler mà bạn sử dụng. Hãy luôn sử dụng lệnh import để đảm bảo tài nguyên được truy cập chính xác. Nếu có vấn đề, bạn hãy kiểm tra cấu hình của bundler và đường dẫn tài nguyên.
Chúc các bạn thành công!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào