Vite 動態導入靜態資源與自動依賴發現實戰解析

一、Vite 動態導入靜態資源的實現方案

在 Vite 中,動態加載圖片、JSON 等靜態資源是高頻需求,但動態路徑拼接可能導致構建失敗或資源未識別。以下結合示例代碼,分析三種實現方案:


1. 方案一:new URL 動態路徑轉換

通過 new URL 拼接路徑,Vite 自動處理資源引用:

const pathKey = `../assets/${val}.jpg`;
const src = new URL(pathKey, import.meta.url);
imgSrc.value = src.href;

原理與限制

  • Vite 會將路徑轉換為構建后的哈希 URL(如 _assets/1-abc123.jpg)。
  • 限制:路徑必須為靜態字符串模板(如 `../assets/${val}.jpg`),不可使用完全動態變量(如 pathKey = '../assets/' + val + '.jpg'),否則構建時無法解析。

2. 方案二:import() 動態導入

使用 import() 語法按需加載資源:

import(`../assets/${val}.jpg`).then((res) => {imgSrc.value = res.default;
});

特性

  • 構建時,Vite 會分析 ../assets/ 下的所有 .jpg 文件,生成對應 chunk。
  • 問題:若 val 的取值在構建時無法確定(如用戶輸入),可能導致資源缺失。

3. 方案三:import.meta.glob 批量預加載

通過 Glob 模式預加載所有匹配資源,運行時按需獲取:

// 預加載所有 jpg 文件(構建時生成映射表)
const srcs = import.meta.glob("../assets/*.jpg", { as: "url" });// 運行時動態獲取
const pathKey = `../assets/${val}.jpg`;
const url = await srcs[pathKey]();
imgSrc.value = url;

優勢

  • 構建時生成所有資源的 URL 映射表,避免運行時路徑不確定性。
  • { as: 'url' } 表示直接返回資源 URL,無需手動處理 default 屬性。

二、代碼示例的問題與優化
1. 路徑嚴格匹配問題

示例代碼中,pathKey 必須與 Glob 生成的鍵完全一致(如 ../assets/2.jpg)。若文件名含動態前綴(如時間戳),需調整 Glob 模式:

// 松散匹配文件名中的數字
const srcs = import.meta.glob("../assets/[0-9].jpg", { as: "url" });
2. 資源未找到的兜底處理

通過 try/catch 或條件判斷增強健壯性:

try {const url = await srcs[pathKey]();imgSrc.value = url;
} catch {imgSrc.value = fallbackImage; // 加載默認圖
}

三、Vite 自動依賴發現的條件

Vite 的依賴預構建(Pre-Bundling)是性能優化的核心,其觸發條件如下:


1. 依賴類型識別
  • CommonJS 模塊:若 node_modules 中的依賴未提供 ESM 格式,Vite 自動預構建。
  • 嵌套依賴:若依賴內部引用了其他 CJS 模塊(如 lodash 的子包),觸發預構建。
  • 非優化入口:依賴的 package.json 未指定 moduleexports 字段。

2. 代碼中的導入方式
  • 靜態導入import axios from 'axios' 會被自動分析。
  • 動態導入import('lodash') 若路徑為字符串字面量,觸發預構建。
  • 完全動態路徑import(someVar) 不會觸發預構建,可能導致運行時加載問題。

3. 配置干預

vite.config.js 中手動控制依賴:

export default {optimizeDeps: {include: ['lodash/debounce'], // 強制預構建特定子模塊exclude: ['jquery'],          // 排除無需預構建的庫},
}

四、實戰:動態資源與依賴預構建的聯動問題
場景:動態加載第三方圖標庫

假設項目中按需加載 @ant-design/icons 的圖標:

const loadIcon = async (name) => {const icon = await import(`@ant-design/icons/${name}.js`);return icon;
};

問題:Vite 默認不會預構建 @ant-design/icons 的子模塊,導致運行時加載延遲。

解決方案
在配置中顯式聲明需要預構建的子模塊:

// vite.config.js
export default {optimizeDeps: {include: ['@ant-design/icons/HomeOutlined'],},
}

五、總結與最佳實踐
1. 動態資源加載
  • 優先使用 import.meta.glob:提前聲明資源范圍,避免路徑不確定性。
  • 統一資源目錄:如將所有動態圖片放在 src/assets/dynamic/ 下,通過 Glob 簡化匹配。
  • 處理未找到資源:添加日志與兜底邏輯,提升用戶體驗。
2. 依賴預構建優化
  • 監控控制臺輸出:運行 vite build 時,檢查哪些依賴被自動預構建。
  • 按需手動包含:對大型庫的子模塊(如 lodashantd),通過 include 減少構建體積。
  • 慎用 exclude:除非明確知曉依賴的模塊格式,否則避免盲目排除。
3. 調試工具推薦
  • 構建分析:使用 rollup-plugin-visualizer 查看產物結構。
  • 依賴檢查:運行 npx vite deps 查看預構建的依賴列表。

通過上述實踐,開發者可以高效管理 Vite 中的動態資源,同時精準控制依賴預構建策略,實現性能與可維護性的最佳平衡。

<template><div><el-switchv-model="value":active-value="2":inactive-value="1"active-color="#13ce66"inactive-color="#ff4949"@change="handleChange"></el-switch><img :src="imgSrc" alt="" /></div>
</template>
<script setup lang="ts">
import { ref } from "vue";
// import a   from "../assets/1.jpg";
// console.log("a", a);const value = ref(1);
const imgSrc = ref("");
const handleChange = async (val: any) => {console.log(val);// const src = new URL(`../assets/${val}.jpg`, import.meta.url);// console.log("src", src);// imgSrc.value = src.href;// import("../assets/" + val + ".jpg").then((res) => {//   console.log("res", res);//   imgSrc.value = res.default;// });const srcs = import.meta.glob("../assets/*.jpg", { as: "url" });console.log("srcs", srcs);// 構建對應的路徑 key(注意文件名匹配要完全一致)const pathKey = `../assets/${val}.jpg`;try {const url = await srcs[pathKey]();imgSrc.value = url;} catch {imgSrc.value = ""; // 加載默認圖}
};
</script>
<style lang="scss" scoped>
img {width: 1200px;height: 600px;
}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在matlab中使用UAV123官方toolkits測試自己的數據集

一、前言 最近需要將自己的跟蹤代碼在自己拍攝的數據集上進行測試&#xff0c;這里我選擇使用 UAV123 官方 toolkits 進行配置。首先需要搞清楚這部分代碼是如何運行的&#xff0c;精度圖和成功率圖是如何繪制出來的&#xff0c;然后再將自己的數據集加進去進行測試。 二、UA…

9.idea中創建springboot項目_jdk1.8

9. idea中創建springboot項目_jdk1.8 步驟 1&#xff1a;打開 IntelliJ IDEA 并創建新項目 啟動 IntelliJ IDEA。在歡迎界面&#xff0c;點擊 New Project&#xff08;或通過菜單欄 File > New > Project&#xff09;。 步驟 2&#xff1a;選擇 Maven 項目類型 在左側…

SpringAI實現AI應用-搭建知識庫

SpringAI實戰鏈接 1.SpringAl實現AI應用-快速搭建-CSDN博客 2.SpringAI實現AI應用-搭建知識庫-CSDN博客 概述 想要使用SpringAI搭建知識庫&#xff0c;就要使用SpringAI中的TikaDocumentReader&#xff0c;它屬于ETL&#xff08;提取、轉換、加載&#xff09;框架中的提取&…

內網服務器映射到公網上怎么做?網絡將內網服務轉換到公網上

如何將內網映射到公網&#xff1f;本地局域網的網絡下部署的內網服務地址轉換到公網上連接訪問是大家比較關注的問題&#xff0c;特別是在無公網IP使用的情況下&#xff0c;很多人不知道怎么做。 在沒有公網 IP 的情況下&#xff0c;要將內網映射到公網&#xff0c;以便外網能…

intellij idea最新版git開啟Local Changes

習慣了在idea的git插件里&#xff0c;查看項目已修改的文件&#xff0c;但是新版idea默認不展示了&#xff0c;用起來很難受。 參考網上教程開啟方法如下&#xff1a; 1. 確保安裝Git Modal Commit Interface插件并開啟該插件 2. 在Advanced Settings開啟Use Modal Commit In…

??智能制造中的預測性維護:基于深度學習的設備故障預測??

智能制造中的預測性維護:基于深度學習的設備故障預測 引言 在智能制造領域,設備突發故障可能導致巨大的經濟損失。傳統維護方式(如定期檢修或事后維修)往往效率低下且成本高昂。預測性維護(Predictive Maintenance, PdM)通過實時監測設備狀態并預測潛在故障,能夠顯著減…

DeepSeek+即夢:AI視頻創作從0到1全突破

目錄 一、開啟 AI 視頻創作大門&#xff1a;前期準備1.1 注冊與登錄1.2 熟悉工具界面1.3 硬件與網絡要求 二、用 DeepSeek 構思視頻腳本2.1 明確創作主題與目標2.2 編寫優質提示詞2.3 生成并優化腳本 三、即夢 AI 實現畫面生成3.1 文生圖基礎操作3.2 調整參數提升畫質3.3 保持人…

初始化列表詳解

1.類中包含以下成員&#xff0c;必須放在初始化列表位置進行初始化&#xff1a; 1. 引用成員變量 2.const成員變量 3. 自定義類型成員(且該類沒有默認構造函數時 ) 2. 成員變量在類中聲明次序就是其在初始化列表中的初始化順序&#xff0c;與其在初始化列表中的先后次序無關…

基于建造者模式的信號量與理解建造者模式

信號量是什么&#xff1f; AI解釋&#xff1a;信號量&#xff08;Semaphore&#xff09;是操作系統中用于 進程同步與互斥 的經典工具&#xff0c;由荷蘭計算機科學家 Edsger Dijkstra 在 1965 年提出。它本質上是一個 非負整數變量&#xff0c;通過原子操作&#xff08;P 操作…

開閉原則(OCP)

非常棒的問題&#xff01;&#x1f50d; 開閉原則&#xff08;OCP, Open/Closed Principle&#xff09;是軟件設計的核心原則之一&#xff0c;下面我將從定義、意義、優劣分析、Python示例和結構圖五個方面完整解析給你。 &#x1f9e0; 什么是開閉原則&#xff1f; 開閉原則&a…

python數據分析(七):Pandas 數據變形與重塑

Pandas 數據變形與重塑全面指南 1. 引言 在數據分析過程中&#xff0c;我們經常需要將數據從一種結構轉換為另一種結構&#xff0c;以適應不同的分析需求。Pandas 提供了豐富的數據變形與重塑功能&#xff0c;包括旋轉(pivot)、堆疊(stack)、融合(melt)等多種操作。本文將詳細…

Android學習總結之jetpack組件間的聯系

在傳統安卓開發中&#xff0c;UI 組件&#xff08;Activity/Fragment&#xff09;常面臨三個核心問題&#xff1a; 生命周期混亂&#xff1a;手動管理 UI 與數據的綁定 / 解綁&#xff0c;易導致內存泄漏&#xff08;如 Activity 銷毀后回調仍在觸發&#xff09;。數據斷層&am…

C++初階:類和對象(二)

大家好&#xff0c;我是小卡皮巴拉 文章目錄 目錄 一.運算符重載 1.1 基本概念 定義 參數規則 特性 選擇原則 重載要點 二.類的默認成員函數 2.1 構造函數 構造函數的特點 2.2 析構函數 析構函數的特點 2.3 拷貝構造函數 拷貝構造的特點 2.4 拷貝賦值運算符重…

【c++】【STL】priority_queue詳解

目錄 priority_queue的作用priority_queue的接口構造函數emptysizetoppushpopswap priority_queue的實現仿函數&#xff08;函數對象&#xff09;是什么&#xff1f;向上調整算法&#xff08;adjustup&#xff09;向下調整算法&#xff08;adjustdown&#xff09;迭代器構造pus…

測試——用例篇

目錄 1. 測試用例 1.1 概念 2. 設計測試用例的萬能公式 2.1 常規思考逆向思維發散性思維 2.2 萬能公式 3. 設計測試用例例的方法 3.1 基于需求的設計方法 ?編輯 3.2 具體的設計方法 3.2.1 等價類 3.2.2 邊界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 場景法 3.2.6…

銷售總監求職簡歷模板

模板信息 簡歷范文名稱&#xff1a;銷售總監求職簡歷模板&#xff0c;所屬行業&#xff1a;其他 | 職位&#xff0c;模板編號&#xff1a;KREUNY 專業的個人簡歷模板&#xff0c;邏輯清晰&#xff0c;排版簡潔美觀&#xff0c;讓你的個人簡歷顯得更專業&#xff0c;找到好工作…

AE腳本 關鍵幀緩入緩出曲線調節工具 Flow v1.5.0 Win/Mac

Flow是一個非常好用的After Effects腳本,它可以讓你更加輕松自如地調整關鍵幀的速度曲線,無需觸碰老舊復雜的圖形編輯器。 AE腳本介紹 Flow為After Effects帶來了一個簡潔的界面,使自定義動畫曲線變得十分容易,無需深入研究速度和影響力這些讓人困惑的概念 - 只需繪制一個曲線…

ACGRIME:用于全局優化和特征選擇的自適應混沌高斯RIME優化器,附完整版免費代碼

自然現象中&#xff0c;軟冰的形成過程由 Set al. [42] 提出&#xff0c;軟冰是空氣中的過冷水滴在接觸固體物體并凍結時形成的。這種現象發生在特定的氣候條件下&#xff0c;當水蒸氣尚未凝結時&#xff0c;導致冰覆蓋的表面呈現出獨特的樹枝狀和葉子狀景觀。它在軟冰的生長和…

大模型開發學習筆記

文章目錄 大模型基礎大模型的使用大模型訓練的階段大模型的特點及分類大模型的工作流程分詞化(tokenization)與詞表映射 大模型的應用 進階agent的組成和概念planning規劃子任務分解ReAct框架 memory記憶Tools工具\工具集的使用langchain認知框架ReAct框架plan-and-Execute計劃…

4.27-5.4學習周報

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract一、方法介紹2.Rainbow Memory(RM)2.1多樣性感知內存更新2.2通過數據增強增強樣本多樣性(DA) 二、使用步驟1.實驗概況2.RM核心代碼 總結 摘要 本博客概…