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

使用vite項(xiàng)目打包資源分配目錄

 更新時(shí)間:2024年07月01日 14:55:12   作者:前端-阿元  
這篇文章主要介紹了使用vite項(xiàng)目打包資源分配目錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vite項(xiàng)目打包資源分配目錄

vite項(xiàng)目打包后所有資源都放在了assets文件夾中,像傳統(tǒng)工程一樣分為不同的文件夾,js放js文件夾,css放css文件夾,圖片放img文件夾

vite無(wú)論是當(dāng)做是腳手架還是構(gòu)建工具,內(nèi)部實(shí)現(xiàn)原理就是Rollup和esbuild

Rollup會(huì)深度影響打包結(jié)果,如何在vite里面配置Rollup,Rollup相關(guān)配置

  • vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
 
 
export default defineConfig({
  plugins: [
    vue(),
  ],
  build: {
    rollupOptions:{
      output: {
        entryFileNames: 'js/[name].js',//入口文件
        // entryFileNames: 'js/[name]-[hash].js',//入口文件
        chunkFileNames: 'js/[name].js',//分包引入文件
        // chunkFileNames: 'js/[name]-[hash].js',//分包引入文件
        // assetFileNames: '[ext]/[name]-[hash].[ext]',//靜態(tài)文件
        assetFileNames(assetInfo){
          console.log(assetInfo)
          //文件名稱
          if (assetInfo.name.endsWith('.css')) {
            return 'css/[name].css'
            // return 'css/[name]-[hash].css'
          }
          //圖片名稱
          //定義圖片后綴
          const imgExts = ['.png', '.jpg', '.jpeg', '.webp', '.gif', '.svg','.ico']
          if(imgExts.some(ext => assetInfo.name.endsWith(ext))){
            return 'imgs/[name].[ext]'
            // return 'imgs/[name]-[hash].[ext]'
          }
          //剩余資源文件
          return 'assets/[name].[ext]'
          // return 'assets/[name]-[hash].[ext]'
        }
      },
    },
  },
 
});

vite打包流程和原理

打包原理

vite利用了ES module這個(gè)特性,使用vite運(yùn)行項(xiàng)目時(shí),首先會(huì)用esbuild進(jìn)行預(yù)構(gòu)建,將所有模塊轉(zhuǎn)換為es module,不需要對(duì)我們整個(gè)項(xiàng)目進(jìn)行編譯打包,而是在瀏覽器import某個(gè)模塊時(shí),發(fā)送一個(gè)HTTP請(qǐng)求去加載文件,vite啟動(dòng)一個(gè) koa 服務(wù)器攔截這些請(qǐng)求,攔截瀏覽器發(fā)出的請(qǐng)求,根據(jù)請(qǐng)求進(jìn)行按需編譯,然后返回給瀏覽器。

Vite有如下特點(diǎn):

  • 快速的冷啟動(dòng): No Bundle + esbuild 預(yù)構(gòu)建
  • 即時(shí)的模塊熱更新: 基于ESM的HMR,同時(shí)利用瀏覽器緩存策略提升速度
  • 真正的按需加載: 利用瀏覽器ESM支持,實(shí)現(xiàn)真正的按需加載

Vite比Webpack快?

主要體現(xiàn)在啟動(dòng)很快!

所有模塊都是在請(qǐng)求時(shí)才被打包和渲染的,因此自然是無(wú)法解決的。

你會(huì)發(fā)現(xiàn)第一次請(qǐng)求之后就會(huì)快很多。

在生產(chǎn)環(huán)境下的表現(xiàn)

vite生產(chǎn)環(huán)境下,為什么使用rollup打包呢?

  • Rollup 是一款 ES Module 打包器, 從作用上來(lái)看,Rollup 與 Webpack 非常類似。不過(guò)相比于 Webpack,Rollup要小巧的多,打包生成的文件更小。 因?yàn)樾∏桑匀辉谶@種特定的打包環(huán)境下,Rollup的打包速度也要比 Webpack 快很多。
  • vite正是基于es module的特性實(shí)現(xiàn)的,所以使用rollup要更合適一些。

vite生產(chǎn)環(huán)境下,為什么不用esbuild打包呢?

  • 盡管esbuild的打包速度比rollup更快,但 Vite 目前的插件 API 與使用 esbuild 作為打包器并不兼容,rollup插件api與基礎(chǔ)建設(shè)更加完善,所以在生產(chǎn)環(huán)境vite使用rollup打包會(huì)更穩(wěn)定一些。
  • 如果后面esbuild基礎(chǔ)建設(shè)與生態(tài)更加完善后,esbuild還是更有優(yōu)勢(shì)的。

所以使用vite可能會(huì)帶來(lái)開發(fā)環(huán)境與生產(chǎn)環(huán)境打包結(jié)果不一致的問(wèn)題。

啟動(dòng)項(xiàng)目后,完成加載比較慢?

vite項(xiàng)目的啟動(dòng)確實(shí)比webpack快,但如果某個(gè)界面是首次進(jìn)入,且依賴比較多/比較復(fù)雜的話,那就會(huì)比較慢,因?yàn)樗粫?huì)對(duì)一小部分代碼進(jìn)行一些簡(jiǎn)單的處理,剩余的工作都交給瀏覽器,以及運(yùn)行時(shí)進(jìn)行依賴分析,動(dòng)態(tài)打包,動(dòng)態(tài)引入。

慢的主要原因就是vite需要?jiǎng)討B(tài)的解析依賴,并打包,以下是解決方案:

  • 讓vite在啟動(dòng)之初就對(duì)某些資源進(jìn)行預(yù)打包,盡量避免后續(xù)的動(dòng)態(tài)打包
  • 通過(guò)配置vite-plugin-optimize-persist插件,首次加載的時(shí)候,依然會(huì)很慢,這個(gè)是正?,F(xiàn)象,因?yàn)槭状尾寮矡o(wú)法知道,哪些依賴需要預(yù)構(gòu)建,是在vite動(dòng)態(tài)引入資源的時(shí)候,將這些資源都記錄下來(lái),自動(dòng)寫入了package.json中,當(dāng)再次啟動(dòng)項(xiàng)目的時(shí)候,插件會(huì)讀取之前他寫入在package.json中的數(shù)據(jù),并告知vite,這樣vite就能對(duì)這些資源進(jìn)行預(yù)構(gòu)建了,也就能加快進(jìn)入界面的速度了,但相應(yīng)的啟動(dòng)速度就會(huì)比原來(lái)稍微慢一點(diǎn)。有意義?因?yàn)檫@個(gè)文件可以重復(fù)利用,后續(xù)啟動(dòng)和別人使用的時(shí)候都會(huì)加快打包速度。

Esbuild & Rollup

1、開發(fā)環(huán)境:Esbuild

是一個(gè)JavaScript、 Bundler 打包和壓縮工具,它提供了與Webpack、Rollup等工具相似的資源打包能力。可以將JavaScript

預(yù)構(gòu)建:

  • 支持commonJS依賴
  • 上面提到Vite是基于瀏覽器原生支持ESM的能力實(shí)現(xiàn)的,但要求用戶的代碼模塊必須是ESM模塊,因此必須將commonJs的文件提前處理,轉(zhuǎn)化成 ESM 模塊并緩存入 node_modules/.vite
  • 減少模塊和請(qǐng)求數(shù)量(我們常用的lodash工具庫(kù),里面有很多包通過(guò)單獨(dú)的文件相互導(dǎo)入,而 lodash-es這種包會(huì)有幾百個(gè)子模塊,當(dāng)代碼中出現(xiàn) import { debounce } from ‘lodash-es’ 會(huì)發(fā)出幾百個(gè) HTTP 請(qǐng)求,這些請(qǐng)求會(huì)造成網(wǎng)絡(luò)堵塞,影響頁(yè)面的加載。
  • Vite 將有許多內(nèi)部模塊的 ESM 依賴關(guān)系轉(zhuǎn)換為單個(gè)模塊,以提高后續(xù)頁(yè)面加載性能。
  • 通過(guò)預(yù)構(gòu)建 lodash-es 成為一個(gè)模塊,也就只需要一個(gè) HTTP 請(qǐng)求了)

Esbuild優(yōu)點(diǎn):

  • 編譯運(yùn)行 VS 解釋運(yùn)行
  • 大多數(shù)前端打包工具都是基于 JavaScript 實(shí)現(xiàn)的,大家都知道JavaScript是解釋型語(yǔ)言,邊運(yùn)行邊解釋。而 Esbuild 則選擇使用 Go 語(yǔ)言編寫,該語(yǔ)言可以編譯為原生代碼,在編譯的時(shí)候都將語(yǔ)言轉(zhuǎn)為機(jī)器語(yǔ)言,在啟動(dòng)的時(shí)候直接執(zhí)行即可,在 CPU 密集場(chǎng)景下,Go 更具性能優(yōu)勢(shì)。
  • 多線程 VS 單線程
  • JavaScript 本質(zhì)上是一門單線程語(yǔ)言,直到引入 WebWorker 之后才有可能在瀏覽器、Node 中實(shí)現(xiàn)多線程操作。就我對(duì)Webpack的源碼理解,其源碼也并未使用 WebWorker 提供的多線程能力。而GO天生的多線程優(yōu)勢(shì)。
  • 對(duì)構(gòu)建流程進(jìn)行了優(yōu)化,充分利用 CPU 資源

2、生產(chǎn)環(huán)境:Rollup

Rollup是基于ESM的JavaScript打包工具。相比于其他打包工具如Webpack,他總是能打出更小、更快的包。

因?yàn)?Rollup 基于 ESM 模塊,比 Webpack 和 Browserify 使用的 CommonJS模塊機(jī)制更高效。

Rollup的亮點(diǎn)在于同一個(gè)地方,一次性加載。

能針對(duì)源碼進(jìn)行 Tree Shaking(去除那些已被定義但沒(méi)被使用的代碼),以及 Scope Hoisting 以減小輸出文件大小提升運(yùn)行性能。

熱更新

通過(guò)WebSocket創(chuàng)建瀏覽器和服務(wù)器的通信監(jiān)聽文件的改變,當(dāng)文件被修改時(shí),服務(wù)端發(fā)送消息通知客戶端修改相應(yīng)的代碼,客戶端對(duì)應(yīng)不同的文件進(jìn)行不同的操作的更新。

熱更新過(guò)程主要分為以下幾步:

  • 創(chuàng)建一個(gè)websocket服務(wù)端和client文件,啟動(dòng)服務(wù)
  • 通過(guò)chokidar監(jiān)聽文件變更
  • 當(dāng)代碼變更后,服務(wù)端進(jìn)行判斷并推送到客戶端
  • 客戶端根據(jù)推送的信息執(zhí)行不同操作的更新

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息

    詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息

    本篇文章主要介紹了詳解VueRouter進(jìn)階之導(dǎo)航鉤子和路由元信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Vue中Axios中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法

    Vue中Axios中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法

    為了防止用戶在網(wǎng)絡(luò)不好或者其他情況下短時(shí)間內(nèi)重復(fù)進(jìn)行接口請(qǐng)求,重復(fù)發(fā)送多次請(qǐng)求,本文主要介紹了Vue中Axios中取消請(qǐng)求及阻止重復(fù)請(qǐng)求的方法,感興趣的可以了解一下
    2022-02-02
  • vue.js中$watch的用法示例

    vue.js中$watch的用法示例

    這篇文章為大家詳細(xì)介紹了vue.js中$watch的用法,文中給出了示例代碼,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們可以一起看看吧。
    2016-10-10
  • axios全局請(qǐng)求參數(shù)設(shè)置,請(qǐng)求及返回?cái)r截器的方法

    axios全局請(qǐng)求參數(shù)設(shè)置,請(qǐng)求及返回?cái)r截器的方法

    下面小編就為大家分享一篇axios全局請(qǐng)求參數(shù)設(shè)置,請(qǐng)求及返回?cái)r截器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Vue上傳組件vue Simple Uploader的用法示例

    Vue上傳組件vue Simple Uploader的用法示例

    本篇文章主要介紹了Vue上傳組件vue Simple Uploader的用法示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-08-08
  • this.$toast() 了解一下?

    this.$toast() 了解一下?

    這篇文章主要介紹了vue this.$toast()用法 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn)

    vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn)

    這篇文章主要介紹了vue項(xiàng)目部署到nginx/tomcat服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 手寫實(shí)現(xiàn)vue2下拉菜單dropdown組件實(shí)例

    手寫實(shí)現(xiàn)vue2下拉菜單dropdown組件實(shí)例

    這篇文章主要為大家介紹了手寫vue2下拉菜單dropdown組件實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue?表格單選按鈕的實(shí)現(xiàn)方式

    vue?表格單選按鈕的實(shí)現(xiàn)方式

    這篇文章主要介紹了vue?表格單選按鈕的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • antd的選擇框如何增加tab選中的方法示例

    antd的選擇框如何增加tab選中的方法示例

    這篇文章主要為大家介紹了antd的選擇框如何增加tab選中的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

思茅市| 凤台县| 贡觉县| 邯郸市| 黔江区| 青浦区| 镇江市| 嘉鱼县| 高邑县| 应城市| 富川| 登封市| 清流县| 汉中市| 乐清市| 淄博市| 吉水县| 高雄县| 桐乡市| 三江| 如东县| 清徐县| 武定县| 亳州市| 庄浪县| 广宁县| 伊春市| 芒康县| 萨嘎县| 札达县| 托克逊县| 靖远县| 海晏县| 平凉市| 阳原县| 宁津县| 南靖县| 南华县| 勐海县| 德保县| 九江市|