์ ๋ฒ์ฃผ์๋ Webpack 5์ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก Module Federation์ ํตํด Micro Frontend Architecture ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ต๋๋ค.
์ด๋ฒ์ฃผ์๋ Module Federation์ ๋ค๋ฅธ build ๋๊ตฌ(vite)์์ ๊ตฌํํ๊ธฐ ์ํด ๊ฒช์ ๊ณผ์ ์ ์ค๋ช ํด๋๋ฆด๋ ค๊ณ ํฉ๋๋ค.
๋ค์ด๊ฐ๊ธฐ์ ์์ vue ํ๋ก์ ํธ๋ฅผ ์์ฑ์ ์ํด ๋ง์ ๊ฐ๋ฐ์๋ค์ vue-cli(webpack)
, vite
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๊ฐ ๋ค๋๊ณ ์๋ ํ์ฌ์์๋ vue3 + vite
, vue3 + webpack
์ ํ๋ก์ ํธ๋ค์ด ๊ตฌ์ฑ๋์ด์์ต๋๋ค. ๋๋ถ๋ถ ํ๋ก์ ํธ๋ค์ vue3 + vite
๋ก ๋ง์ด๊ทธ๋ ์ด์
๋์ด์๋ ์ํ์
๋๋ค.
๋นํธ๋ Vue ์ฐฝ์์ Evan You๊ฐ ๋ง๋ ์๋ก์ด ํ๋ก ํธ์๋ ๋๊ตฌ๋ก ํ๋์ค์ด๋ก ๋น ๋ฅด๋ค๋ฅผ ์๋ฏธํ๋ฉฐ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ๋ชจ๋ ์น ํ๋ก์ ํธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ด์ ์ ๋ง์ถฐ ํ์ํ ๋น๋ ๋๊ตฌ์ ๋๋ค.
์ํฉ์ ๋ฐ๋ผ ESbuild์ Rollup ๋๊ฐ์ง๋ฅผ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ์ฉ ์๋ฒ์์๋ Esbuild๋ฅผ ํตํด ๋ฒ๋ค๋ง ํ๊ณ ํ๋ฌ๋์ ๋ฒ์ ์ผ๋ก ๋น๋๋ฅผ ์ํด์๋ Rollup์ ํตํด ๋ฒ๋ค๋ง ํฉ๋๋ค.
Esbuild๋ ๊ต์ฅํ ๋น ๋ฅธ ์๋๋ก ๋ฒ๋ค๋ง์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์์ผ๋, ๋ฒ๋ค๋ง์ ํ์์ ์ผ๋ก ์๊ตฌ๋๋ ๊ธฐ๋ฅ์ธ
์ฝ๋ ๋ถํ (Code-splitting)
๋ฐCSS์ ๊ด๋ จ๋ ์ฒ๋ฆฌ
๊ฐ ์์ง ๋ฏธ๋นํฉ๋๋ค. Vite์์ ์ฌ์ฉ์ค์ธ Rollup์ ์ด์ ๋ํด ์กฐ๊ธ ๋ ๊ฒ์ฆ๋์๊ณ ์ ์ฐํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ๋ ๊ตฌํ๋์ด ์๊ธฐ์ ํ์ฌ๋ก์๋ ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ํฅํ Esbuild๊ฐ ์์ ํ ๋์์ ๋ ์ด๋ค ํ๋ก๋์ ๋ฒ๋ค๋ง ๋๊ตฌ๊ฐ ์ ์ ํ ๊ฒ์ธ์ง ๋ค์ ๋ ผ์ํ ์์ ์ ๋๋ค.
์ค์ ๋ก ESbuild ๋ก๋๋งต์ ์ดํด ๋ณด์๋ฉด Code Splitting ๊ทธ๋ฆฌ๊ณ CSS content type ์ ๊ฐ์ ์ด์๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์งํ์ค์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ๋กค์ ์์ค์์ ํด๊ฒฐํด์ผ ํ๋ ๊ฒ์ ๋๋ค. ๋ ผ์ํ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ด์ง๋ง Vite์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
vite์์ module federation์ (์ ์ฌํ) ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
(์ค์ ๋ก ํ์ ์์๋ webpack๊ณผ ๊ฐ์ด ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๋ฉฐ ๊ฒ์ฆ๋์ง ์์์ ์ฌ์ฉํ๊ธฐ ํ๋ค๋ค๊ณ ์๊ฐํฉ๋๋ค.)
import federation from '@originjs/vite-plugin-federation';
export default defineConfig({
plugins: [
vue(),
federation({
name: 'home',
filename: 'remoteEntry.js',
exposes: {
'./Component1': {
name: 'component',
import: './src/components/Component1.vue',
},
},
remotes: {
remote1: 'http://localhost:5000/assets/remoteEntry.js',
},
shared: ['vue'],
}),
],
build: {
target: 'esnext',
rollupOptions: {
output: {
format: 'esm',
entryFileNames: 'assets/[name].js',
},
},
},
});
federation ์์๋ module federation๊ณผ ๋์ผํ ๊ตฌ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
-
name
ํด๋น์ฑ์ ์ ์ผํ ์ด๋ฆ์ผ๋ก ์ค๋ณต๋ ์ด๋ฆ์ด ์์ผ๋ฉด ์๋ฉ๋๋ค.
-
filename
ํด๋น ์ฑ์ ๋ค๋ฅธ ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ํ ์ ๋ณด๊ฐ ๋ด๊ธด Manifest ํ์ผ์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
-
remotes
ํด๋น ์ฑ์ด ์ฌ์ฉํ ๋ฆฌ๋ชจํธ ์ฑ๋ค์ ์ ์ํ๋ ๊ณณ์ ๋๋ค.
-
exposes
์ธ๋ถ์์ ์ฌ์ฉํ๊ธฐ ์ํด expose ์ํฌ ๋ชจ๋๋ค์ ์ ์ํฉ๋๋ค.
-
shared
๋ฐํ์์ Federated๋ ์ฑ ๊ฐ์ ๊ณต์ ํ๊ฑฐ๋ ๊ณต์ ๋ฐ์ ์์กด์ฑ ํจํค์ง๋ฅผ ์ ์ํฉ๋๋ค.
Evan You์ ๋ง์ฒ๋ผ rollup ๋จ๊ณ์์ build ์์ผ ์ฌ์ฉํ๊ธฐ ์ํ ์ต์ ์ ์ค์ ํ๋ ๋ถ๋ถ์ ๋๋ค.
-
target
๋ธ๋ผ์ฐ์ ํธ์์ฑ์ ์ํด es๋ฅผ ์ ์ํฉ๋๋ค.
-
-
format
์์ฑ๋ ๋ฒ๋คํ์ผ์ ํ์์ ์ ์ํฉ๋๋ค.
-
entryFileNames
์ง์ ์ ์ด ๋ ํ์ผ ์์น๋ฅผ ์ ์ํฉ๋๋ค.
-