Skip to content

๋ผ์šฐํŠธ ์ง€์—ฐ ๋กœ๋”ฉ โ€‹

๋ฒˆ๋“ค๋Ÿฌ๋กœ ์•ฑ์„ ๋นŒ๋“œํ•  ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ๊ฝค ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ผ์šฐํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ํ•ด๋‹น ๋ผ์šฐํŠธ๊ฐ€ ๋ฐฉ๋ฌธ๋  ๋•Œ๋งŒ ๋กœ๋“œํ•œ๋‹ค๋ฉด ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Vue Router๋Š” ๋™์  import๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ, ์ •์  import๋ฅผ ๋™์  import๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

js
// ๋‹ค์Œ์„ ๋Œ€์ฒด
// import UserDetails from './views/UserDetails'
// ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ
const UserDetails = () => import('./views/UserDetails.vue')

const router = createRouter({
  // ...
  routes: [
    { path: '/users/:id', component: UserDetails }
    // ๋˜๋Š” ๋ผ์šฐํŠธ ์ •์˜์—์„œ ์ง์ ‘ ์‚ฌ์šฉ
    { path: '/users/:id', component: () => import('./views/UserDetails.vue') },
  ],
})

component(๋ฐ components) ์˜ต์…˜์€ ์ปดํฌ๋„ŒํŠธ์˜ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Vue Router๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ฒ˜์Œ ์ง„์ž…ํ•  ๋•Œ๋งŒ ์ด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ดํ›„์—๋Š” ์บ์‹œ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•œ ๋” ๋ณต์žกํ•œ ํ•จ์ˆ˜๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

js
const UserDetails = () =>
  Promise.resolve({
    /* ์ปดํฌ๋„ŒํŠธ ์ •์˜ */
  })

์ผ๋ฐ˜์ ์œผ๋กœ, ๋ชจ๋“  ๋ผ์šฐํŠธ์— ๋™์  import๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๋ผ์šฐํŠธ์—๋Š” ๋น„๋™๊ธฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ๋น„๋™๊ธฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ผ์šฐํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ผ์šฐํŠธ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋Š” ๋™์  import๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

webpack๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ž๋™์œผ๋กœ ์ฝ”๋“œ ๋ถ„ํ• ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Babel์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, Babel์ด ํ•ด๋‹น ๋ฌธ๋ฒ•์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก syntax-dynamic-import ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผ ์ฒญํฌ๋กœ ์ปดํฌ๋„ŒํŠธ ๊ทธ๋ฃนํ™” โ€‹

webpack์—์„œ โ€‹

๋•Œ๋•Œ๋กœ ๋™์ผํ•œ ๋ผ์šฐํŠธ ์•„๋ž˜์— ์ค‘์ฒฉ๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ผํ•œ ๋น„๋™๊ธฐ ์ฒญํฌ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ด๋ฆ„์ด ์ง€์ •๋œ ์ฒญํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ํŠน๋ณ„ํ•œ ์ฃผ์„ ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ฒญํฌ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(webpack > 2.4 ํ•„์š”):

js
const UserDetails = () =>
  import(/* webpackChunkName: "group-user" */ './UserDetails.vue')
const UserDashboard = () =>
  import(/* webpackChunkName: "group-user" */ './UserDashboard.vue')
const UserProfileEdit = () =>
  import(/* webpackChunkName: "group-user" */ './UserProfileEdit.vue')

webpack์€ ๋™์ผํ•œ ์ฒญํฌ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋น„๋™๊ธฐ ๋ชจ๋“ˆ์„ ๋™์ผํ•œ ๋น„๋™๊ธฐ ์ฒญํฌ๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.

Vite์—์„œ โ€‹

Vite์—์„œ๋Š” rollupOptions ์•„๋ž˜์—์„œ ์ฒญํฌ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

js
// vite.config.js
export default defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/guide/en/#outputmanualchunks
      output: {
        manualChunks: {
          'group-user': [
            './src/UserDetails',
            './src/UserDashboard',
            './src/UserProfileEdit',
          ],
        },
      },
    },
  },
})

๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋ฌธ์„œ ํ•œ๊ธ€ํ™”