Vue: ์ง„์ •ํ•œ ๋™์  ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ

์— ๋งŒ๋“  2020๋…„ 05์›” 28์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vuejs/vue

์ด ๊ธฐ๋Šฅ์€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

ํƒ€์‚ฌ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‹จ์ผ ํŒŒ์ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‚ด์žฅ ๊ตฌ์„ฑ ์š”์†Œ์ฒ˜๋Ÿผ ๊ฐ€์ ธ์™€์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{
template: "<div>stuff</div>",
props: ...
etc.
}

์ด๊ฒƒ์€ ์–ด์ƒ‰ํ•˜๊ณ  ์Šคํƒ€์ผ์„ ํฌํ•จํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ: https://stackoverflow.com/questions/62035019/load-vue-single-file-component-dynamically-at-runtime

๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๋…ผ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ vue-loader์— ์žˆ๊ณ  ์‹ค์ œ๋กœ Webpack๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Webpack์€ ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ API๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๊นŒ?

<template>
  <div>
    The component goes here:
    <component :is="pluginComponent"></component>
  </div>
</template>
<script>
import { compileSFC } from "vue-template-compiler";
export default {
  data() {
    return {
      pluginComponent: null
    };
  },
  mounted() {
    // fetch code from some external source here
    let code = "<template><div>hello</div></template><style>some styles</style><script>some code</script>";
    let comp = compileSFC(code);
    this.pluginComponent = comp;
  }
};
</script>

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋กค์—… ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ๊ธฐ๋ณธ ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ๋Œ€๋ถ€๋ถ„ ํ†ตํ•ฉ.js์™€ ๊ด€๋ จ๋œ ์ˆ˜๋งŽ์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import { createDefaultCompiler } from "@vue/component-compiler";

๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์„ ๋‹ซ์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ์˜ˆ์ œ๋Š” README์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์‚ฌ๋žŒ์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/vuejs/vue-component-compiler/issues/93

๋ชจ๋“  3 ๋Œ“๊ธ€

vue-loader ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/vuejs?q=compiler&type=&language=

์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๋กค์—… ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ๊ธฐ๋ณธ ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ๋Œ€๋ถ€๋ถ„ ํ†ตํ•ฉ.js์™€ ๊ด€๋ จ๋œ ์ˆ˜๋งŽ์€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

import { createDefaultCompiler } from "@vue/component-compiler";

๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ด๊ฒƒ์„ ๋‹ซ์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด ์˜ˆ์ œ๋Š” README์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ์‚ฌ๋žŒ์˜ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/vuejs/vue-component-compiler/issues/93

@posva ์œ„์˜ ๋‚ด ์˜๊ฒฌ์„ ๋ณด์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰