๐ ๋ชฉ์ฐจ
- ์๋ก
- usedExport ๋๋ผ ํ๋ฐฉ
- devtool ๋ฌด๊ธฐ ํ๋
- webpack-bundle-analyzer ์ธ๊ณ ์ง๋ ํ๋
- Element-UI ๋๋ผ์์ ์ ์ ๊ทธ๋ฆฌ๊ณ ํจ๋ฐฐ…
- Lottie.js ๋๋ผ์์ ์ ์
- ๊ฒฐ๋ก
๐ ์๋ก
์๋ ํ์ธ์. ํ์ฌ์์ ๋น๋ ํ์์ด ๊ธธ์ด์ ธ ๋ง์ ๋น์ฉ์ด ๋ฐ์ํ๊ณ ์์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํ๋ฒ ํด๊ฒฐ์ ํด๋ณด๊ณ ์ถ์์ต๋๋ค.
main ํ๋ก์ ํธ์์ build ์ต์ ํ๋ฅผ ์ํค๋๋ฐ ๊ธฐ์น์ ๊ฒฐ์ ํ์์ผ๋ก ์ฌ๋ฐ๊ฒ ํ์ด๋๊ฐ๋ณด๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ผ ์ฌ๋ฐ๊ฒ ์ฝ์ด์ฃผ์ธ์! (ํผ๋๋ฐฑ๋ ๋๋ฌด๋ ํ์ํฉ๋๋ค. ) ๊ทธ๋ผ ์ถ๋ฐ ! ๐
๐ usedExport
๐ก ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ค์ด build๊ฐ ๋๋ ๋ชจ์ต์ ๋ณด์๊ณ ๋๋ ๊ทธ๊ฑธ ์์ ๊ณ ์ถ์์ต๋๋ค.
์ถ๊ทผ์ ํ์ฌ ๋ค๋ฌ ๋ง์์ผ๋ก build๊ฐ ๋ main.js๋ฅผ ์ฝ๊ณ ์์์๋ ์์ต๋๋ค…
์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ค์ด ์ฐํ์ฃฝ์์ผ๋ก ๋ถ์ด์๋๊ฑธ ๋ณด์์ต๋๋ค.
๋ง์นจ webpack tree shaking์ด ๋ ์ค๋ฅด๊ฒ ๋์์ต๋๋ค.
๋จผ์ ํด๋น ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ webpack์์ optimization(usedExports)์ ์ค์ ํด์ฃผ์์ต๋๋ค.
๐จ usedExports ๋?
ํด๋น ๊ฐ์ bool์ ๊ฐ์ผ๋ก ์ ํ์ด ๊ฐ๋ฅํ๋ฉฐ exports์ด์ง๋ง ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ ๋น๋ํ์ง ์์ต๋๋ค. production๋ชจ๋ ์ผ๋๋ default๋ก true๊ฐ ์ค์ ์ด ๋์ด์์ต๋๋ค.
// vue.config.js
configureWebpack: config => {
if (!config.optimization) config.optimization = {};
config.optimization.usedExports = true;
},
main.js์ ํฌ๊ธฐ๋ฅผ 19.9MB -> 19.6MB๋ก ์ค์ผ ์ ์์์ต๋๋ค.
0.3MB๋ฅผ ์ค์ธ ์ ์ด๋ 1๋ฐ์ดํธ๊ฐ ๊ธ์ ํ๋๋ ๋ณดํต ํ๊ท ํ์ค์ด 60๋ฐ์ดํธ๋ผ๊ณ ๊ฐ์ ์ ํ๋ค๋ฉด ์ฝ 5000์ค์ ์ค์ธ์ ์ ๋๋ค. ํ์ง๋ง ์ข ์ ๋ฒ๋ ์ด๊ฒ์ผ๋ก ๋ง์กฑ์ ํ ์ ์์์ต๋๋ค. ๊ทธ๋์ ์ข ๋ ๊ฐ๋ ฅํ ์ ์ค์ ๋ฌด๊ธฐ๋ฅผ ์ฐพ์ ๋ ๋๊ฒ ๋์์ต๋๋ค.
๐ devtool ๋ฌด๊ธฐ ํ๋
๐ก source-map์ ์ ์์ถํด์ค๋ค๋ ์ฅ์ ์ ์์ง๋ง ๋๋ฆฌ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
์์ง build์ ์๋๋ฅผ ๊ฐ์ํด๋ดค์๋ ๊ทผ๋ณธ์ ์ธ ๋ถ๋ถ์ ํด๊ฒฐ์ ๋ชปํ๊ฒ ๊ฐ์ ๋๋์ด์์ต๋๋ค. ๊ทธ๋์ devtools๊ด๋ จ ๋งํฌ๋ฅผ ์ฐพ์๋ณด๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ devtool source-map์์ eval๋ก ๋ฌด๊ธฐ๋ฅผ ๋์ฒด ํ์์ต๋๋ค. ํ์ฌ production mode ์ด๊ฑฐ๋ development mode ๋๊ฐ๋ค devtool๋ก source-map์ ์ฌ์ฉํด์ฃผ๊ณ ์๋๋ฐ ์ด์ development mode ์ผ๋ ๊ฐ์ฅ ๋น ๋ฅด๋ค๋ eval์ด๋ผ ๋ถ๋ฆฌ๋ ๋ฌด๊ธฐ๋ก ๋์ฒด ํด๋ณด์์ต๋๋ค.
// vue.config.js
configureWebpack: config => {
config.devtool = isDevOrLocal ? 'eval' : 'source-map';
},
์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ฝค ๋ง์ ์๊ฐ์ ์ค์ผ์ ์์์ง๋ง ์ข ์ ๋ฒ๋ ์กฐ๊ธ ๋ ๊ณผ๊ฐํ ์ ํ์ ํ๊ณ ์ถ์์ต๋๋ค.
๐ webpack-bundle-analyer ์ธ๊ณ ์ง๋ ํ๋
๐ก ์ธ๊ณ์๋ ํฐ ์๊ตญ์ด ์ด๋ฏธ ์๋ฆฌ ์ก๊ณ ์์๋ค.
์กฐ๊ธ ๋ ๊ณผ๊ฐํ ์ ํ์ ํ๊ธฐ์ ์์ ์ค์ bundle์ ํฌ๊ธฐ๋ฅผ ์ ํ์๊ฐ ์์์ต๋๋ค. ๊ทธ๋์ ํด๋น ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์๋ ค์ฃผ๋ webpack-bundle-analyzer๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค์น๋ฅผ ํด์ฃผ์์ต๋๋ค.
// vue.config.js
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
configureWebpack: config => {
config.plugins.push(new BundleAnalyzerPlugin());
},
๊ทธ๋ ๊ฒ ์์ ์ด ๋๋ํ ์ด๋ค ๋ฒ๋ค์ ํฌ๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋์ด์๋์ง ์ ์ ์์์ต๋๋ค.
๐ Element-UI ์์ ์ ์ ๊ทธ๋ฆฌ๊ณ ํจ๋ฐฐ...
๐ก ๋๋ฌด๋ ๊ฐ๋ ฅํ ์๋๋ฅผ ๋ง๋ ์ข์
์ธ๊ณ ์ง๋๋ฅผ ํ๋ํ ํจ๊ธฐ๋กญ๊ฒ ๊ฐ์ฅ ๋ง์ ์์ญ์ ์ฐจ์งํ๊ณ ์๋ Element-ui ๋๋ผ๋ฅผ ์ ๋ณตํ๊ณ ์ถ์์ต๋๋ค. ํด๋น ๋ฐฉ๋ฒ์ผ๋ก cdn์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ด ํด๋น ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๊ณต๋ต์ ํด๋ณด์์ต๋๋ค. ํ์ง๋ง ์ด๋ด ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
๐ง ๋ฌธ์ ์ ๋ค?
- Element ui ์์ฒด๊ฐ ์ ์ญ์ ์ ์ธ์ด ๋์ด์์ง ์๊ณ ๊ฐ๊ฐ์ ํ์ผ๋ค๋ก ์ ์ธ๋์ด Vue.use()์ ์์กด์ฑ์ ์ ๊ฑฐํ๊ธฐ๊ฐ ํ๋ค์์ต๋๋ค. (์ฝ 110๊ฐ์ ํ์ผ๋ค)
- ์ ๊ฑฐ ํ๋๋ผ๋ element ui dark theme์ผ๋ก css ์์ฒด๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
์ด๋ฐ ๋ฌธ์ ์ ๋ค ๋๋ฌธ์ cdn์ผ๋ก ํด๊ฒฐํ๊ธฐ๊ฐ ์ด๋ ค์ ์ต๋๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ์์๊ฐ ์๋ ์์กด์ฑ์ด ๋ง์ด ์ฎ์ฌ์์ง ์์ง๋ง ํ์ผ์ด ํฐ ๊ฒ์ ์ ํํด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค.
๐ Lottie.js ๋๋ผ์์ ์ ์
๐ก ํ๋ฒ์ ํจ๋ฐฐ ์ดํ ์ ๋ต์ ์์ ํ์ฌ ๋์น๋ฆฌ
์์ ๊ตํ์ ํ ๋๋ก ์ ๋ฆฌํด๋ณธ ๊ฒฐ๊ณผ `lottie.js ๋ผ๋ ํ๊ฒ`์ด ๋์ ๋ค์ด์์ต๋๋ค.
- ์์กด์ฑ์ด ์ ์ด์ผ ํจ → ์ด 4๊ฐ์ ํ์ผ์์ Lottie.js๋ฅผ ์ฌ์ฉํ๊ณ ์์.
- ๋ฒ๋ค์ ํฌ๊ธฐ๊ฐ ์ปค์ผํจ → ์์ ๊ทธ๋ฆผ์์ ๋ณด๋ค์ถ์ด ๋ฒ๋คํฌ๊ธฐ๊ฐ 5๋ฒ์งธ๋ก ํผ (element > lodash > sendbird > moment > lottie)
๊ทธ๋ ๊ฒ lottie.js๋ฅผ ๊ณต๋ต์ ๊ฒฐ์ ํ๊ณ index.html, index-dev.html์ ๊ฐ๊ฐ cdn์ ์ฝ์ ํด์ฃผ์์ต๋๋ค. async์ defer๋ฅผ ๊ฑธ์ด์ฃผ์ง ์์ ์ด์ ๋ ํน์ vue-script๊ฐ ์คํ๋ ์ดํ ์คํ์ด ๋์ด๋ฒ๋ฆด ์ํ์ฑ์ด ์์ด ์๋ต์ ํด์ฃผ์์ต๋๋ค. (์ ๋ง ๋ง์ฝ์ ๊ฒฝ์ฐ → 99.9%์ ๋๋ถ๋ถ ๊ทธ๋ ์ง ์์๊ฑฐ๋ผ๊ณ ์๊ฐ์ ํ์.)
<!-- index.html & index-dev.html -->
<!-- LOTTIE-WEB -->
<script
src="https://cdnjs.cloudflare.com/ajax/libs/lottie-web/5.6.10/lottie.min.js"
integrity="sha512-QGaslwkb2XoQM7dTYUB8YucbFcUC+Mhm/xTkz+pXNv0Dm9aZSj1Js7OwXrXa1OrMJUpSi2Bj21srh8mwsFNKTQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer" >
</script>
๊ทธ๋ฆฌ๊ณ vue.config.js์ externals๋ฅผ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
// vue.config.js
chainWebpack: config => {
config.externals({ IMP: 'IMP', 'lottie-web': 'lottie', });
},
๐ง webpack externals๋?
import packages์ ๋ฒ๋ค๋ง์ ๋ง๊ณ ์ธ๋ถ dependecies๋ฅผ runtime์ ์ฃผ์ ์ํต๋๋ค.
๊ทธ๋ ๊ฒ lottie.js์๊ตญ์ ๋ฉธ๋ง์ํฌ์ ์์์ต๋๋ค.๐๐๐
๐ ๊ฒฐ๋ก
๐ก ์คํ์์ค๋ ๋งค์ง์ด ๋๋ฌด ๋ง์์. by ์ด๋ฌธ๊ตญ๋
์ค์ ๋ก ๋น๋๋ฅผ ์ต์ ํ ์ํค๋ฉด์ ์คํ์์ค๊ฐ ์ ๋ง ์๋ ์ ๊ฒ์ด๊ตฌ๋ ๋ผ๋ ์๊ฐ์ ๋ง์ด ํ์ต๋๋ค.
์ฌ์ค ์ ๋ ์คํ์์ค๋ฅผ ๋งค์ฐ ์ข์ํฉ๋๋ค. ์ ๊ฐ ๊ทธ๋ค๋ณด๋ค ์ ๋ง๋ค ์์ ๋ ์๊ธฐ๋ ํ๊ณ ๋ฅ๋ ฅ์๋ถ๋ค์ด ์ ๋ง๋ค์ด ๋์๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ์ฐ๋ฉด ์ข์ง๋ง ๊ทธ๋ ์ง ์์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ๋ก๋ํธ์ ๊ธฐ๋ฅ๊ณผ๋ ์๊ด์๋ ๊ธฐ๋ฅ(๋งค์ง)๋ค์ด ๋ง์ด ๋ค์ด๊ฐ ํฌ๊ธฐ๋ง ๋ง์ด ์ฐจ์งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋์ ํ๋ก๋ํธ์ '์ ๋ง ํ์ํ ์คํ์์ค ์ธ์ ํ์ํ ๋ฐ๋ก ํ๋ก๋ํธ๋ฅผ ์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์ ํด์ผํ๊ฒ ๋ค' ์๊ฐ์ด ๋ง์ด ๋๋ ์ ์ตํ ์๊ฐ ์ด์๋๊ฑฐ ๊ฐ๋ค์. ๊ทธ๋ผ ๋ค์ ์ฌํ๊ธฐ๋ ๊ธฐ๋ํด์ฃผ์ธ์!
๊ธด๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๐
'Vue Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ฌ vue ํ๋ก์ ํธ vite ์ ์ฉํ๊ธฐ (2) | 2022.01.01 |
---|---|
Vue2 ClientOnly ์ปดํฌ๋ํธ ์ ์๊ธฐ (0) | 2021.07.29 |
Vue3 - v model (0) | 2020.11.08 |
Vue3 - teleport (0) | 2020.11.08 |
Vue3 - Provide/Inject (0) | 2020.11.04 |