最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用?vite?external?減小產(chǎn)物體積的方法實現(xiàn)

 更新時間:2026年05月20日 15:28:11   作者:前端畢業(yè)班  
本文主要介紹了使用?vite?external?減小產(chǎn)物體積,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

寫在前面

前幾個月工作過程中遇到了 Javascript heap out of memory 問題,當時想著減小前端的產(chǎn)物大小,通過 vite.external解決這問題,查了很多文章,不過都以失敗告終,經(jīng)過不懈努力和大佬的指點,終于成功了,故此分享。

前置工作

首先創(chuàng)建一個vue的項目,本地運行 pnpm dev 啟動項目

$ pnpm dev
> test-external@0.0.0 dev /Users/.../test-external
> vite
VITE v5.4.2  ready in 138 ms
?  Local:   http://localhost:5173/
?  Network: use --host to expose

項目可以正常運行,執(zhí)行 pnpm build 開始構(gòu)建

$ pnpm build
vite v5.4.2 building for production...
? 67 modules transformed.
dist/index.html                       0.51 kB │ gzip: 0.32 kB
dist/assets/index-B5GNdBo.css         0.32 kB │ gzip: 0.24 kB
dist/assets/index-Dwy3Kika.js        62.20 kB │ gzip: 25.16 kB

可以看到j(luò)s文件的大小為 62.20KB

設(shè)置你想要排除的依賴

比如你想你的代碼打包出來的code不包括 vue

// vite.config.ts
export default defineConfig({
  build: {
    rollupOptions: {
      external: ['vue']
    }
  }
})

我們再執(zhí)行下 build 命令,看看產(chǎn)物大小

$ pnpm build
vite v5.4.2 building for production...
? 62 modules transformed.
dist/index.html                       0.51 kB │ gzip: 0.32 kB
dist/assets/index-DY_q8tlo.js         8.33 kB │ gzip: 3.28 kB

可以看到j(luò)s文件大小為 8.33KB,相較于 62.20KB 小了不少,我們把代碼推送到github,部署到 github pages 看看效果

核心報錯: Failed to resolve module specifier "vue"

瀏覽器找不到名為 vue 的 ESM 模塊,因為打包產(chǎn)物里保留了 from "vue",但線上環(huán)境沒有提供這個模塊。

發(fā)現(xiàn)頁面上什么內(nèi)容都沒有,控制臺報錯,說沒有找到vue這個module,我們來看下產(chǎn)物

import {
  createElementBlock as e,
  createElementVNode as n,
  toDisplayString as f,
  ref as s,
  createApp as y
} from "vue";

這里引入了vue,但是我們打包的時候,vue是排除了的,所以找不到vue,就報錯了,我之前也在這里卡住過,去網(wǎng)上查解決方法,有人說,你要通過 cdn 引入 vue,我們第二步通過cdn引入。

cdn 引入相關(guān)依賴

<!-- index.html -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

這一步我其實剛剛在做第一步的時候就做了,還是有問題。我們來看下 vue 的 cdn 內(nèi)容

// https://unpkg.com/vue@3/dist/vue.global.js
var Vue = (function (exports) {
  'use strict';
  // ...
  return exports;
})({});

通過var聲明了一個叫 Vue 的變量,后面是一個自執(zhí)行函數(shù),但是我們的語法正常都是像上面產(chǎn)物那樣

import { ref, reactive } from 'vue';

import vue from 'vue';

這樣一想,報錯也就不奇怪了,我們要是能把 vue引入的內(nèi)容通過 Vue.xxx 替換掉,不就解決了這個問題,畢竟var聲明的變量是全局的

設(shè)置 globals

這里我之前嘗試的時候,看到網(wǎng)上很多教程讓我設(shè)置 output.globals,后來發(fā)現(xiàn)根本不生效,就去翻了rollup的文檔

output.globals

只對 umd / iife 產(chǎn)物生效,用于告訴 Rollup:某個 external 依賴在運行時對應(yīng)哪個全局變量。

文檔寫的很清楚,你要是打包成 umd 或者 iife 格式,可以設(shè)置這個參數(shù),但是我是要打包成 esm 格式(這就很尷尬了)

output.format 默認值是 es。

  • es:保留為 ES module
  • iife:自執(zhí)行函數(shù),適合直接通過 <script> 引入
  • umd:兼容 AMD / CommonJS / IIFE 的通用格式

所以這里的關(guān)鍵問題是:我的目標產(chǎn)物是 ESM,不是 umd 或 iife,因此單獨配置 output.globals 并不能解決問題。

然后我就找到了一個rollup插件 rollup-plugin-external-globals,解決了我的問題

// vite.config.ts
import { defineConfig } from 'vite';
import externalGlobals from 'rollup-plugin-external-globals';

export default defineConfig({
  plugins: [
    externalGlobals({
      vue: 'Vue'
    })
  ],
  build: {
    rollupOptions: {
      external: ['vue']
    }
  }
});
$ pnpm build
vite v5.4.2 building for production...
? 62 modules transformed.
dist/assets/index-*.js   9.59 kB

我們看到包的大小相較于 8.33KB 大了一點,為什么呢?我引入了一個插件就變大了,直接來看下產(chǎn)物

const {
  createElementVNode,
  openBlock,
  createElementBlock,
  ref,
  createApp
} = Vue;

沒有 import { xxx } from 'vue';,這個Vue在代碼運行的時候會沿著作用域鏈一直找到 Window,剛好我們引入的 vue cdn通過var聲明了一個Vue,這樣就對上了。至于為什么打包產(chǎn)物大小變大了,是因為字符數(shù)變多了。我們推下代碼,驗證下想法

控制臺不再出現(xiàn) Failed to resolve module specifier "vue" 的報錯。

大功告成!??!

QA

為什么要設(shè)置 external ?我直接設(shè)置cdn,代碼里面不用import,也能行啊 ??? ?

這么做確實沒啥問題,代碼也能正常運行,部署到生產(chǎn)也不會有啥問題,不用import,就失去了類型提示,引入提示等依賴帶來的好處,內(nèi)容都是有上下文的,不會覺得奇怪

為什么這套配置開發(fā)環(huán)境下有問題

由于vite的開發(fā)環(huán)境用的是esbuild,打包用的是rollup,而rollup-plugin-external-globals插件是rollup插件,不建議在開發(fā)環(huán)境使用,以避免引起不必要的麻煩

/// vite.config.ts
import { defineConfig } from 'vite';
import externalGlobals from "rollup-plugin-external-globals";

const isProduction = process.env.NODE_ENV === 'production'

export default defineConfig(() => {
  return {
    plugins: [
      ...,
      isProduction && externalGlobals({
        vue: "Vue"
      })
   ],
  }
})

寫在最后

到此這篇關(guān)于使用 vite external 減小產(chǎn)物體積的文章就介紹到這了,更多相關(guān)vite external 減小體積內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中splice()方法對數(shù)組進行增刪改等操作的實現(xiàn)

    Vue中splice()方法對數(shù)組進行增刪改等操作的實現(xiàn)

    vue中對數(shù)組的元素進行刪除,以前一直以為這個方法是vue中特有的,后來百度之后才知道原來是js的一個寫法,下面這篇文章主要給大家介紹了關(guān)于Vue中splice()方法對數(shù)組進行增刪改等操作的實現(xiàn)方法,需要的朋友可以參考下
    2023-05-05
  • vue3中ref獲取子組件的值代碼示例

    vue3中ref獲取子組件的值代碼示例

    這篇文章主要給大家介紹了關(guān)于vue3中ref獲取子組件值的相關(guān)資料,在Vue3中父組件獲取子組件的值可以通過使用'ref'和'$refs'來實現(xiàn),文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • vue filters的使用詳解

    vue filters的使用詳解

    使用 filters 實現(xiàn)英文字母轉(zhuǎn)大寫,實現(xiàn)代碼超簡單,本文重點給大家介紹vue filters的使用,感興趣的朋友一起看看吧
    2018-06-06
  • vue項目打包開啟gzip壓縮具體使用方法

    vue項目打包開啟gzip壓縮具體使用方法

    這篇文章主要為大家介紹了vue項目打包開啟gzip壓縮具體使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • vite+vue3搭建的工程熱更新失效問題及解決

    vite+vue3搭建的工程熱更新失效問題及解決

    這篇文章主要介紹了vite+vue3搭建的工程熱更新失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 如何用vue封裝axios請求

    如何用vue封裝axios請求

    對axios進行封裝以及將API接口按業(yè)務(wù)模塊統(tǒng)一管理,有助于我們簡化代碼,方便后期維護。本文介紹了如何用vue封裝axios請求,感興趣的同學,可以參考下。
    2021-06-06
  • Vue+Echarts實現(xiàn)繪制動態(tài)折線圖

    Vue+Echarts實現(xiàn)繪制動態(tài)折線圖

    這篇文章主要為大家詳細介紹了如何利用Vue和Echarts實現(xiàn)繪制動態(tài)折線圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • Vue?keepAlive實現(xiàn)不同的路由共用一個組件component的緩存問題(推薦)

    Vue?keepAlive實現(xiàn)不同的路由共用一個組件component的緩存問題(推薦)

    這篇文章主要介紹了Vue?keepAlive實現(xiàn)不同的路由共用一個組件component的緩存問題,實現(xiàn)方式使用Vue?keepAlive實現(xiàn)頁面緩存,需要的朋友可以參考下
    2022-08-08
  • Vue如何使用cdn加載資源加快打包速度

    Vue如何使用cdn加載資源加快打包速度

    外部的庫文件,可以使用CDN資源,或者別的服務(wù)器資源等,下面這篇文章主要給大家介紹了關(guān)于Vue如何使用cdn加載資源加快打包速度的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • VueJs 將接口用webpack代理到本地的方法

    VueJs 將接口用webpack代理到本地的方法

    本篇文章主要介紹了VueJs 將接口用webpack代理到本地的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

项城市| 霍山县| 黄大仙区| 阜南县| 江都市| 沁水县| 施秉县| 连江县| 仲巴县| 长葛市| 柯坪县| 龙游县| 罗定市| 恭城| 三明市| 泸水县| 安溪县| 东莞市| 噶尔县| 荃湾区| 泰来县| 建德市| 聊城市| 宜阳县| 桂阳县| 息烽县| 建水县| 榕江县| 外汇| 五原县| 河间市| 淮南市| 如东县| 灌南县| 阿拉善左旗| 南郑县| 宜川县| 清新县| 上犹县| 无为县| 新平|