# Vite + Vue 3 第一個網站 ###### tags: `Vue3` `Vite` ## Vite簡介 Vite(法語意為 "快速的")是一種新型前端構建工具,能夠顯著提升前端開發體驗。它主要由兩部分組成: * 一個開發服務器,它基於原生ES模組提供了豐富的內建功能,如速度快到驚人的模塊熱更新(HMR)。 * 一套構建指令,它使用Rollup打包你的代碼,並且它是預配置的,可輸出用於生產環境的高度優化過的靜態資源。 ### Why Vite? 現今常用的 webpack、Rollup 和 Parcel 等工具,當構建越來越大型的應用時,需要處理的 JavaScript Code數量也呈指數級增長,包含數千個模塊的大型項目相當普遍。 然而這時開發工具就會開始遇到效能瓶頸,通常需要很長時間,才能啟動開發服務器,即使使用模塊熱替換(HMR),文件修改後的效果也需要幾秒鐘才能在瀏覽器中反映出來。 <svg viewBox="0 0 1896 1071" fill="none" xmlns="http://www.w3.org/2000/svg"> <text fill="#FFAA3E" xml:space="preserve" style="white-space: pre" font-size="80" letter-spacing="0em"><tspan x="46" y="132.344">Bundle based dev server</tspan></text> <rect x="48" y="239" width="1086" height="767" rx="98" stroke="#FFC36B" stroke-width="4"></rect> <rect x="108" y="577" width="212" height="83" rx="10" fill="#C3E88C"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="170" y="631.488">entry</tspan></text> <rect x="476" y="712" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0.33em"><tspan x="552.5" y="768.988">···</tspan></text> <rect x="476" y="438" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="537" y="494.988">route</tspan></text> <rect x="473" y="576" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="534" y="632.988">route</tspan></text> <path d="M472.614 481.699L438.815 489.291L462.289 514.766L472.614 481.699ZM324.582 622.18L454.791 502.201L450.726 497.789L320.516 617.768L324.582 622.18Z" fill="#E06666"></path> <path d="M469 620L439 602.679V637.321L469 620ZM323 623H442V617H323V623Z" fill="#E06666"></path> <path d="M472.614 756.105L462.032 723.12L438.757 748.777L472.614 756.105ZM320.533 622.196L450.601 740.186L454.632 735.742L324.565 617.752L320.533 622.196Z" fill="#E06666"></path> <path d="M822.052 905.098L815.036 871.175L789.166 894.213L822.052 905.098ZM689.041 760.243L801.856 886.929L806.337 882.939L693.521 756.253L689.041 760.243Z" fill="#FFC36B"></path> <path d="M819.908 756.105L811.894 722.403L786.715 746.195L819.908 756.105ZM689.1 622.034L799.185 738.54L803.546 734.419L693.462 617.914L689.1 622.034Z" fill="#FFC36B"></path> <path d="M817.765 623.19L788.215 605.112L787.334 639.742L817.765 623.19ZM691.205 622.973L790.697 625.502L790.85 619.504L691.357 616.975L691.205 622.973Z" fill="#FFC36B"></path> <path d="M818.837 481.699L789.286 463.622L788.406 498.252L818.837 481.699ZM692.277 481.483L791.769 484.012L791.922 478.014L692.429 475.485L692.277 481.483Z" fill="#FFC36B"></path> <path d="M819.909 340.209L786.924 350.795L812.584 374.067L819.909 340.209ZM696.719 480.499L803.992 362.224L799.547 358.193L692.275 476.468L696.719 480.499Z" fill="#FFC36B"></path> <path d="M817.765 614.614L810.467 580.751L784.789 604.002L817.765 614.614ZM692.273 480.497L797.418 596.614L801.866 592.587L696.721 476.47L692.273 480.497Z" fill="#FFC36B"></path> <rect x="822" y="288" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="864" y="344.988">module</tspan></text> <rect x="822" y="435" width="212" height="87" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="864" y="491.488">module</tspan></text> <rect x="820" y="571" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="862" y="627.988">module</tspan></text> <rect x="822" y="718" width="212" height="87" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="864" y="774.488">module</tspan></text> <rect x="822" y="864" width="212" height="88" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0.33em"><tspan x="898.5" y="920.988">···</tspan></text> <path d="M1239 627L1209 609.679V644.321L1239 627ZM1136 630H1212V624H1136V630Z" fill="#FFC36B"></path> <path d="M1596 627L1566 609.679V644.321L1596 627ZM1493 630H1569V624H1493V630Z" fill="#FFC36B"></path> <rect x="1239" y="545" width="254" height="144" rx="10" fill="#C692EA"></rect> <text fill="white" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1306.5" y="629.988">Bundle</tspan></text> <rect x="1596" y="543" width="254" height="143" rx="10" fill="#009688"></rect> <text fill="white" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1667.71" y="604.988">Server </tspan><tspan x="1675.76" y="649.988">ready</tspan></text> </svg> 圖片來源:https://vitejs.dev/guide/why.html Vite與以往的傳統打包方式不同,透過利用瀏覽器支援的Native ESM 進行運作,來改上述的問題,Vite 根據 Http的request 來載入模組進行處理,實現真正的依需求加載。 <svg viewBox="0 0 1896 1071" fill="none" xmlns="http://www.w3.org/2000/svg"> <text fill="#FFAA3E" xml:space="preserve" style="white-space: pre" font-size="80" letter-spacing="0em"><tspan x="45" y="129.344">Native ESM based dev server</tspan></text> <rect x="632" y="526" width="273" height="106" rx="10" fill="#C3E88C"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="724.5" y="591.988">entry</tspan></text> <rect x="1106" y="699" width="274" height="114" rx="10" fill="#666665"></rect> <g filter="url(#filter0_d_5_61)"> <text fill="#CCCCCB" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0.33em"><tspan x="1213.5" y="768.988">···</tspan></text> </g> <rect x="1106" y="346" width="274" height="113" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1198" y="415.488">route</tspan></text> <rect x="1102" y="524" width="273" height="114" rx="10" fill="#666665"></rect> <text fill="#CCCCCB" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1193.5" y="593.988">route</tspan></text> <path d="M1101.79 402.463L1067.99 410.054L1091.46 435.529L1101.79 402.463ZM910.168 583.106L1083.96 422.965L1079.9 418.553L906.102 578.693L910.168 583.106Z" fill="#C892E9"></path> <path d="M1097 581L1067 563.679V598.321L1097 581ZM908 584H1070V578H908V584Z" fill="#999899"></path> <path d="M1101.79 756.57L1091.2 723.584L1067.93 749.242L1101.79 756.57ZM906.119 583.121L1079.77 740.651L1083.8 736.207L910.151 578.677L906.119 583.121Z" fill="#999899"></path> <path d="M1552.72 948.839L1545.7 914.916L1519.83 937.953L1552.72 948.839ZM1381.73 761.331L1532.52 930.67L1537 926.68L1386.21 757.341L1381.73 761.331Z" fill="#999899"></path> <path d="M1549.95 756.569L1541.94 722.868L1516.76 746.659L1549.95 756.569ZM1381.79 582.96L1529.23 739.005L1533.59 734.884L1386.15 578.839L1381.79 582.96Z" fill="#999899"></path> <path d="M1547.19 585.049L1517.64 566.972L1516.76 601.602L1547.19 585.049ZM1383.89 583.898L1520.12 587.362L1520.27 581.364L1384.04 577.9L1383.89 583.898Z" fill="#999899"></path> <path d="M1548.57 402.463L1519.02 384.386L1518.14 419.015L1548.57 402.463ZM1385.27 401.312L1521.5 404.776L1521.66 398.778L1385.43 395.314L1385.27 401.312Z" fill="#C892E9"></path> <path d="M631.489 585.049L601.583 567.567L601.396 602.207L631.489 585.049ZM375.576 586.666L604.473 587.903L604.506 581.903L375.608 580.666L375.576 586.666Z" fill="#C892E9"></path> <path d="M1549.95 219.877L1516.97 230.462L1542.63 253.735L1549.95 219.877ZM1390.34 400.329L1534.04 241.892L1529.59 237.861L1385.89 396.298L1390.34 400.329Z" fill="#C892E9"></path> <path d="M1547.19 573.983L1539.89 540.12L1514.21 563.372L1547.19 573.983ZM1385.89 400.327L1526.84 555.983L1531.29 551.956L1390.34 396.3L1385.89 400.327Z" fill="#C892E9"></path> <rect x="1553" y="152" width="274" height="113" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1626" y="221.488">module</tspan></text> <rect x="1553" y="341" width="274" height="114" rx="10" fill="#4FC08D"></rect> <text fill="#15505C" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1621.5" y="411.818">module</tspan></text> <rect x="1550" y="517" width="274" height="114" rx="10" fill="#666665"></rect> <text fill="#CCCCCB" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1623" y="586.988">module</tspan></text> <rect x="1553" y="707" width="274" height="113" rx="10" fill="#666665"></rect> <text fill="#CCCCCB" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="1626" y="776.488">module</tspan></text> <rect x="1553" y="896" width="274" height="113" rx="10" fill="#666665"></rect> <text fill="#CCCCCB" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0.33em"><tspan x="1660.5" y="965.488">···</tspan></text> <rect x="45" y="491" width="330" height="179" rx="10" fill="#029788"></rect> <text fill="white" xml:space="preserve" style="white-space: pre" font-size="38" font-weight="600" letter-spacing="0em"><tspan x="154.707" y="570.988">Server </tspan><tspan x="162.76" y="615.988">ready</tspan></text> <line x1="507.615" y1="459.201" x2="506.232" y2="569.859" stroke="#C892E9" stroke-width="4" stroke-dasharray="8 8"></line> <line x1="1038.78" y1="733.073" x2="1037.37" y2="883.845" stroke="#E06666" stroke-width="4" stroke-dasharray="8 8"></line> <text fill="#E06666" xml:space="preserve" style="white-space: pre" font-size="38" letter-spacing="0em"><tspan x="918" y="938.988">Dynamic import </tspan><tspan x="918" y="983.988">(code split point)</tspan></text> <text fill="#C892E9" xml:space="preserve" style="white-space: pre" font-size="38" letter-spacing="0em"><tspan x="399" y="431.488">HTTP request</tspan></text> <defs> <filter id="filter0_d_5_61" x="1212.15" y="752.766" width="60.9863" height="13.2324" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood> <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix> <feOffset dy="4"></feOffset> <feGaussianBlur stdDeviation="2"></feGaussianBlur> <feComposite in2="hardAlpha" operator="out"></feComposite> <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"></feColorMatrix> <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_61"></feBlend> <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_61" result="shape"></feBlend> </filter> </defs> </svg> 圖片來源:https://vitejs.dev/guide/why.html ## 環境建置及專案建立 #### Step 1.安裝 Node.js及開發環境 [Download NodeJs](https://nodejs.org/en/download/) 安裝完成後,執行以下指令,確認目前執行的版本: :::info node -v ::: 這邊我選擇 VS Code當開發環境,可依個人習慣及喜好選擇<br> [Download Visual Studio Code](https://code.visualstudio.com/download) #### Step 2.建置Vite專案 :::info //npm <br> $ npm init vite@latest ::: :::info //yarn <br> $ yarn create vite ::: #### Step 3.設定專案名稱 :::success ? Project name: » <font style='color:red'>專案名稱</font> ::: #### Step 3.選擇framework 從這裡可以看出vite連React都有支援,不過因為本次目的為Vue3+vite,因此這邊選擇vue :::success ? Select a framework: » - Use arrow-keys. Return to submit. <ul> <li>Vanilla</li> <li style='color:red'>Vue</li> <li>React</li> <li>Preact</li> <li>Lit</li> <li>Svelte</li> <li>Others</li> </ul> ::: #### Step 5.選擇variant 這邊可以看需求來選擇,不過這次我們只是要簡單測試,所以這邊選擇最單純的JavaScript :::success ? Select a variant: » - Use arrow-keys. Return to submit. <ul> <li style='color:red'>JavaScript</li> <li>TypeScript</li> <li>Customize with create-vue ↗</li> <li>Nuxt ↗</li> </ul> ::: #### Step 6.建置完成 Done. Now run: <br> <blockquote>cd vite_helloword</blockquote> <blockquote>npm install</blockquote> <blockquote>npm run dev</blockquote> ## 專案設定 #### Step 1.開啟專案 ![](https://i.imgur.com/vrEMeAF.png) #### Step 2.安裝相關套件 從Step 1.的圖片中,我們可以發現其中並沒有node_modules的資料夾,所以首先必需先安裝相關的套件。 :::info npm install ::: ![](https://i.imgur.com/9IeTcyL.png) ![](https://i.imgur.com/38BbseE.png) #### Step 3.執行專案 :::info npm run dev ::: ![](https://i.imgur.com/DnmPVok.png) ## 參考資料 * https://vitejs.dev/guide/why.html * https://ithelp.ithome.com.tw/articles/10287222 * https://hackmd.io/@Yan06/S1ENNtiUc * https://ithelp.ithome.com.tw/articles/10266460 * https://shubo.io/vite/