# Vite+Vue3+ts 打包全攻略 ###### tags: `Vue-cli`、`Vue3` 先看一下 vite.config.ts 的基本架構 ```typescript= export default defineConfig((init) => { return{ define: {}, plugins: [], base:'', resolve: {}, css: {}, server:{}, build: {} } }) ``` * ### define define 這一塊最主要是要定義全域參數的值,定義後即可在程式內直接使用,方法如下: ```typescript= define:{ NODE_ENV: JSON.stringify(process.env.NODE_ENV) } ``` 這邊需要注意的是,**一定要有值** 且 **一定要轉成字串** 註:若這邊不是以vite原生打包方式,而是使用webpack,在全域參數這部分需要使用 vite-plugin-environment 套件來做轉換才可使用 * ### plugins 此為擴充套件引入的地方,以下列出幾個比較常用的套件 1. #### @vitejs/plugin-vue vite 中使用 Vue3 所需套件 2. #### vite-plugin-restart 本地開發時,雖然 config 內自帶有 hmr 的模式,但是若遇到需要預處理 (Ex:Pug) 後才能看到異動的語言,單純透過 hmr 就無法即時看到變化,此套件可設定監聽異動檔案的範圍,儲存後即可立即重啟專案並重新編譯。 3. #### @vitejs/plugin-legacy 用以兼容低版本的套件,此套件引用了 @babel/preset-env 的功能,並將程式最後編譯為 SystemJs ,套件可設定預支持的最低版本以及透過 polyfill 可以額外引入需要擴展與轉編譯的 modules 。 4. #### vite-plugin-html 此套件可將預在 index.html 使用的參數傳入,並在打包時自動替換上對應資料。 * ### base 此為打包時入口檔基本路徑,若不設定預設為/,設定之後會自動於打包時寫入 index.html 的入口檔路徑 * ### resolve 此設定為編譯方式的設定,較常用的參數為alias與extensions 1. #### alias 專責設定別名短路徑,可供 import 時不用寫整條路徑,並使用相對路徑讓在不同機器均可使用,設定方法如下: ```typescript= alias: { "@": path.resolve(__dirname, "src") } ``` 2. #### extensions 設定後,import 時可省略輸入副檔名,但自定義檔案不建議使用,不一定會支持,設定方法如下: ```typescript= extensions: [".js", ".ts", ".jsx", ".tsx", ".json"] ``` * ### css 此為針對全css的配置,可設定css全域參數或是兼容版本,常用參數有 postcss、preprocessorOptions,介紹如下: 1. #### postcss 此處可以針對css使用一些外掛套件,比如瀏覽器兼容、布局配置等來做不同裝置的兼容,以瀏覽器兼容來說有 postcss-preset-env 與 autoprefixer,但 postcss-preset-env 本身就包含了 autoprefixer 的功能,此套件功能為:將最新的 CSS 語法轉換為大多瀏覽器可閱讀的寫法,並自動獲取 "Can I use" 內的瀏覽器版本支援度,並自動補上前綴 (Ex:--webkit)。 布局配置的話,可使用 postcss-px-to-viewport ,此套件可以自動將 px 轉換為 vw 或是 vh ,設定上可以依據你所參照的視窗大小來設定轉換比率。 2. #### preprocessorOptions 這是 css 的預處理器,可根據使用的 css 框架設定不同的預處理,最常使用的為設定全域參數,設定方式如下: ```typescript= preprocessorOptions: { scss: { additionalData: `key:"value"; } } ``` 註:除了可設定單一參數以外,還能直接讀取整包文件 * ### server 此為架構本地 server 設定,共可做到設定 port 號、hmr 熱更新、http/https 設定、轉 proxy、跨域設定等,設定方式如下: ```typescript= server: { port: 8080, //port 號 strictPort: true, //是否單一port號,若為false可自動開啟別的port open: false, //啟動後是否自動開啟頁面 hmr: true, // 是否開啟熱更新 https: false, //是否是https cors: true, // 允许跨域 proxy: { "api路徑": { target: 後端domain + "/api", changeOrigin: true, //是否自動轉換 ws: false, //是否開啟webSocket rewrite: (path) => path.replace(預取代的api路徑, "") } } } ``` * ### build 設定打包規則與壓縮方式,打包方式的切檔規則會影響到網頁讀取速度,寫法如下: ```typescript= build: { target: "es2015", //打包檔案的瀏覽器兼容目標 minify: "terser", // 是否進行壓縮,boolean | 'terser' | 'esbuild',默认使用terser manifest: false, // 是否產出maifest.json sourcemap: false, // 是否產出soucemap.json outDir: "dist", // 資料夾名稱 assetsDir: "static", //js css資料夾名稱 terserOptions: { ie8: true //是否支援ie8 }, rollupOptions: { input: { //index頁 index: resolve(__dirname, "index.html") }, output: { manualChunks: (id) => { //此處將 node_modules 內的套件與主程式切開打包 if (id.includes("node_modules")) { return id.toString().split("node_modules/")[1].split("/")[0].toString(); } }, chunkFileNames: (chunkInfo) => { let modules = [ //套件名稱 ]; if (modules.some((m) => m === chunkInfo.name)) { //將對應到的套件轉名稱 return "static/js/vendor-[hash].js"; } else { return "static/js/[name]-[hash].js"; } }, //js 入口檔案 entryFileNames: `static/js/[name]-${indexRandom}.js`, //js、css 編譯檔名規則 assetFileNames: "static/[ext]/[name]-[hash].[ext]" } } } ``` 打包設定檔撰寫並不難,但卻影響深遠,寫的好可避免許多額外的麻煩,並可以讓開發上快速許多。