npm run dev
、npm run build
、npm run preview
的用處murmur: 臨時發現 Day3 字數大爆炸(๑´ㅂ`๑),所以決定把認識 vite 指令和打包獨立成一篇
使用 npm init vue@latest
| npm init vue@3
指令建立 Vue 專案資料夾後,會自動生成一份 package.json
檔,裡面已經寫好 3 個可以運行 Vite 指令的 script,今天就要來認識這三個 script。
npm run dev
| npx vite
npm run build
| npx vite build
npm run preview
| npx vite preview --port 4173
npm run build
& 打包後的專案簡單認識「打包」"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview --port 4173"
},
npm run dev
npx vite
npm run build
npx vite build
git
版控裡,在最初專案建立時,create-vue
已經很貼心的把 📂 dist 放到 .gitignore
裡面了npm run preview
npx vite preview --port 4173
透過寫好的腳本執行 Vite 打包的指令
npm run build
完成後會產生一個 📂 dist 資料夾,原始專案中的程式碼,(包含你自己寫的程式碼,和 import
使用的套件程式碼),經過編譯、壓縮或優化後,都被打包進下面的檔案中。
├── assets
│ ├── AboutView.4d995ba2.css
│ ├── AboutView.d4a42a23.js
│ ├── index.4dd4af7a.css
│ ├── index.6ecebeb9.js
│ └── logo.da9b9095.svg
├── favicon.ico
└── index.html
favicon.ico
,名稱後面沒有加上 hash 值,因為沒有經過打包.js
和 .css
檔案,並透過 <script>
和 <link>
掛到 index.html
上。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
<script type="module" crossorigin src="/assets/index.6ecebeb9.js"></script>
<link rel="stylesheet" href="/assets/index.4dd4af7a.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
透過寫好的腳本執行 Vite 指令,開啟本地伺服器,運行打包後的 📂 dist 專案內容,可以在正式佈署前檢查專案打包是否有問題。
npm run preview
這個腳本背後執行的指令是 vite preview --port 4173
,所以會產生 port 號為 4173 的網址:http://localhost:4173/
。
與其說「為什麼要打包?」,應該說在執行打包指令 npm run build
後,打包工具幫開發者做了什麼?對我們有什麼好處?
必要的編譯語法
.vue
檔,需要編譯成瀏覽器能讀懂的 .js
檔和 .css
檔壓縮成一個或較少份檔案,可以減少 HTTP Requests 的次數
「將程式碼變短」(Minify),節省瀏覽器解析的時間
index.4dd4af7a.css
或 index.6ecebeb9.js
就可以發現被 minified 過的程式碼:「將程式碼變醜」(Uglify),讓赤裸的前端不要那麼赤裸,比較不方便被外人研究
處理第三方套件模組的引入跟編譯
開發團隊會透過 npm 或 yarn 安裝專案所需的第三方套件。
套件模組都放在 node_modules 內,卻可以透過 import from "xxx"
直接使用,不需要寫出該模組的完整路徑,這是打包工具的功勞。
import axios from "axios";
import router from "@/router/router";
而且部份模組需要經過編譯,有的套件支援原生 ESM 模組,可以直接 import 使用,有的套件只支援 cjs,需要經過必要的編譯,瀏覽器才可以讀取。
*2022/10/17 補充:新增第五點(沒想到竟然漏掉最重要的部份><)
除此之外,能在 javascript 程式碼內 import
圖片或 CSS,其實也是打包工具幫忙處理的,在原生 javascript 內是無法直接引入其他檔案的。
以上內容不僅限於 Vite,不同的打包工具會有不同的預設打包規則,開發者可以透過 config
去調整。
像 Vite 在預設情況下只處理語法編譯,不包含 polyfill,可以透過 config
調整,最低支持到 es2015
,(兼容性範圍為能夠支援原生 ESModule 的瀏覽器),要支援更舊的瀏覽器,需要自己再設定,但這會是學習路徑比較後面的事情了。
最後,建議看看下面的參考資料:
前端也需要編譯?Transpile、Compile、Minify、Uglify 基本介紹
package.json
內的 script
npm run dev
:開啟本地伺服器,並提供 HMR,可以在更動程式碼後即時更新npm run build
:將專案打包到 📂 distnpm run preview
:開啟本地伺服器,預覽打包後的 📂 dist 專案內容,可以在正式佈署前檢查專案打包是否有問題。.vue
編譯成瀏覽器能讀懂的語言