国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決項目遷移vite引入圖片資源報require is not defined的問題

這篇具有很好參考價值的文章主要介紹了解決項目遷移vite引入圖片資源報require is not defined的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

Vite是一種輕量快速的前端構(gòu)建工具,能夠顯著提升前端開發(fā)體驗,而且官方已經(jīng)發(fā)布v4版本,相對比較穩(wěn)定。在把VueCli搭建的項目遷移到Vite的過程中遇到了個問題,下面分享一下問題及解決辦法。

一、遇到的問題

script標簽里面引入的圖片資源沒生效,然后一看控制臺,報錯顯示 require is not defined …

vite require is not defined hobtdto,Vite,前端,vue.js

二、解決辦法

1. 明確方向

經(jīng)過查找Vite相關(guān)文檔,看到官方文檔靜態(tài)資源處理目錄,發(fā)現(xiàn)需要使用new URL()這個方法才能處理動態(tài)引入的URL,才能保證圖片資源在經(jīng)過打包和資源哈希后仍指向正確的地址。

vite require is not defined hobtdto,Vite,前端,vue.js

2. 解決方法

① 方案一

既然如此,那么直接改為new URL() 的寫法。
原本寫法是:

url: require("../assets/images/banner@2x.png"),
  • 那么使用 new URL() 的寫法:
url: new URL(`../assets/images/banner@2x.png`, import.meta.url).href;
  • 或者是 import 的寫法 :
import banner from "../assets/images/banner@2x.png";

url: banner,

② 方案二

由于上面的方法都要一個個修改過于麻煩了,而且項目圖片都位于src/assets/images/下,那么直接封裝成一個函數(shù),像hooks那樣調(diào)用應(yīng)該方便很多。

  1. 在utils文件下下新建useImgUrl.js文件,簡簡單單,只需要傳入圖片文件名及類型即可
const getImgUrl = file => {
  return new URL(`../assets/images/${file}`, import.meta.url).href;
};
export default getImgUrl;
  1. 在文件中引入并使用,文件內(nèi)修改只需使用全局替換功能即可
import getImgUrl from "../utils/useImgUrl";

url: getImgUrl("banner@2x.png"),

③ 方案三

上面的方案雖然不用一個個改了,但是Vue3沒有mixins這樣可以全局引入的方法,還是需要在不同的文件去引入hook,這個時候我想能不能像webpackloader那樣去全局處理.vue文件,這樣全局替換的操作交給構(gòu)建工具去自動執(zhí)行得了,然后發(fā)現(xiàn)Vite里面并沒有loader配置,不過好在這時候一個Vite插件給了我靈感,可以用Vite插件API去實現(xiàn)類似的功能,于是轉(zhuǎn)換下思路,寫了這么一個插件

  1. 代碼:
// requireToUrlPlugin.js
export default function requirePlugin() {
  return {
    // 插件名稱
    name: "vite-plugin-vue-requireToUrlPlugin",

    // 默認值post:在 Vite 核心插件之后調(diào)用該插件,pre:在 Vite 核心插件之前調(diào)用該插件
    // enforce: "post",

    // 代碼轉(zhuǎn)譯,這個函數(shù)的功能類似于 "webpack" 的 "loader"
    transform(code, id, opt) {
      const vueRE = /\.vue$/;
      const require = /require/g;
      
      // 過濾掉非目標文件
      if (!vueRE.test(id) || !require.test(code)) return code;

      // 匹配 require() 內(nèi)的內(nèi)容
      const requireRegex = /require\((.*?)\)/g;

      // 將 require() 內(nèi)的內(nèi)容替換為 new URL 的寫法
      const finalCode = code.replace(requireRegex, "new URL($1,import.meta.url).href");
		
	  // 將轉(zhuǎn)換后的代碼返回
      return finalCode;
    },
  };
}
  1. 在Vite配置中引入此插件:
// vite.config.js
import requireToUrlPlugin from './src/requireToUrlPlugin';
export default defineConfig(({ command, mode }) => {
    plugins: [
      vue(),
      requireToUrlPlugin(),
    ]
});

引入后項目中的require方法都會被插件自動轉(zhuǎn)換為new URL() 的語法,真的是終極大招[doge],這樣就不用再一個個文件去改了,非常省事,而且自己寫的插件也完全可以自由定制,寫法僅供參考。

vite require is not defined hobtdto,Vite,前端,vue.js

通過查看控制臺能看到通過Vite的打包運行“preview”后,圖片是正常顯示的。

vite require is not defined hobtdto,Vite,前端,vue.js

查看源代碼能看到原本寫的 require 方法已經(jīng)變成了 new URL()的方法。

三、原因及相關(guān)原理

1. 為什么需要require方法

靜態(tài)資源就是直接存放在項目中的資源,這些資源不需要我們發(fā)送專門的請求進行獲取。比如assets目錄下面的圖片,視頻,音頻,字體文件,css樣式表等。
動態(tài)資源就是需要發(fā)送請求獲取到的資源

答:因為項目引入的動態(tài)資源被當做靜態(tài)資源處理了。被打包過后,被打包在新的文件夾下的圖片資源會生成新的文件名,在原來的文件名后會加入一串數(shù)字,此即為資源哈希化,是為了做服務(wù)器緩存用的。那么靜態(tài)的路徑并不能匹配到新的文件名,導(dǎo)致無法正確的引入資源,所以需要加上require。require 是一個node方法,webpack會將圖片當成一個模塊,并根據(jù)配置文件中的規(guī)則進行打包,通過require方法拿到的文件地址,就是資源文件編譯過后的文件地址。

2. 為什么require方法失效了

答:因為原來的項目是VueCli搭建的,其是構(gòu)建于 webpack 和 webpack-dev-server 之上的,所以require方法會經(jīng)過webpack處理,而Vite開發(fā)環(huán)境是基于原生ES Module的,生產(chǎn)環(huán)境則是通過Rollup進行打包的,Rollup默認也是不支持CommonJS模塊的,所以無法識別 require 方法。

3. new URL() 為什么就可以

const imgUrl = new URL('./img.png', import.meta.url).href
  • new URL(url,base)
    用來創(chuàng)建一個新 URL 對象:

    • url —— 完整的 URL,或者僅路徑(如果設(shè)置了 base)
    • base —— 可選的 base URL:如果設(shè)置了此參數(shù),且參數(shù) url 只有路徑,則會根據(jù)這個 base 生成 URL

    其中有一個屬性是href,正好是函數(shù)的返回值!

  • import.meta
    import.meta 對象包含關(guān)于當前模塊的信息。
    它的內(nèi)容取決于其所在的環(huán)境。在瀏覽器環(huán)境中,它包含當前腳本的 URL,或者如果它是在 HTML 中的話,則包含當前頁面的 URL。

4. Vite插件介紹

Vite 插件擴展了設(shè)計出色的 Rollup 接口,帶有一些 Vite 獨有的配置項。因此,只需要編寫一個 Vite 插件,就可以同時為開發(fā)環(huán)境和生產(chǎn)環(huán)境工作。


總結(jié)

以上就是全部內(nèi)容,本文簡單介紹了Vite在生產(chǎn)構(gòu)建時JavaScript模塊對圖片資源的引入方法,并且介紹了Vite插件的基本用法。

如果此篇文章對您有幫助歡迎您【點贊】,也歡迎您【評論】+【收藏】!文章來源地址http://www.zghlxwxcb.cn/news/detail-776987.html


擴展閱讀

  1. Vite 官方中文文檔 | 靜態(tài)資源處理
  2. Vite 官方中文文檔 | 插件 API
  3. Vue CLI | 處理靜態(tài)資源

到了這里,關(guān)于解決項目遷移vite引入圖片資源報require is not defined的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python Selenium 圖片資源自動搜索保存 項目實踐

    Python Selenium 圖片資源自動搜索保存 項目實踐

    啟動后會自動打開一個頁面 頁面分析 第一頁 第二頁 由此可得出變化的只有這里,根據(jù)pagi= 展示不同頁面 紅色箭頭定位到頁數(shù),綠色的不要使用 是反爬蟲的限制,不斷變化的 可以適當?shù)倪M行優(yōu)化,使用selnium的頁面加載策略

    2024年01月16日
    瀏覽(21)
  • SpringBoot項目打成jar包后,上傳的靜態(tài)資源(圖片等)如何存儲和訪問

    SpringBoot項目打成jar包后,上傳的靜態(tài)資源(圖片等)如何存儲和訪問

    使用springboot開發(fā)一個項目,開發(fā)文件上傳的時候,通常會將上傳的文件存儲到資源目錄下的static里面,然后在本地測試上傳文件功能沒有問題,但是將項目打成jar包放到服務(wù)器上運行的時候就會報錯,找不到對應(yīng)目錄?;蛘呖梢詫⑸蟼魑募鎯Φ胶蚸ar包同級的目錄下,但是無

    2024年02月12日
    瀏覽(25)
  • Unity隊列加載圖片,解決大量同時加載資源卡頓問題與思路

    1、思路:加載圖片的請求都加到隊列中,然后一個加載完一個再去加載下一個,直到加載完。 2、問題: ? ? ? ? 問題是相對也存在的。當加載的數(shù)據(jù)還在隊列中,但是已經(jīng)跳轉(zhuǎn)到其它的場景,則會出現(xiàn)報錯的問題。 ? ? ? ? 每次跳轉(zhuǎn)場景的時候,需要把隊列中的數(shù)據(jù)情況

    2024年02月16日
    瀏覽(26)
  • 用Eclipse創(chuàng)建一個JavaWeb項目,把資源添加到Tomcat服務(wù)器,并運行jsp文件詳細過程(附圖片)

    用Eclipse創(chuàng)建一個JavaWeb項目,把資源添加到Tomcat服務(wù)器,并運行jsp文件詳細過程(附圖片)

    目錄 前言 一、Eclipse下載安裝 二、創(chuàng)建 1.創(chuàng)建web項目 2.創(chuàng)建jsp文件 ?三.設(shè)置Tomcat 四.解決問題 ?五、添加資源到tomcat服務(wù)器 ? 六.運行 總結(jié) 使用Eclipse創(chuàng)建web項目時,務(wù)必先下載安裝好JDK和Tomcat。 1、Eclipse J2EE: https://www.eclipse.org/downloads/ ?2、選擇Eclipse IDE for Enterprise Java an

    2024年02月13日
    瀏覽(24)
  • vite搭建的項目動態(tài)引入本地圖片

    由于vite里面沒有require(), 所以需要封裝個工具。

    2024年02月11日
    瀏覽(27)
  • Unity 圖片資源的適配

    Unity 圖片資源的適配

    最近小編做Unity項目時,發(fā)現(xiàn)在資源處理這方面和Android有所不同;例如:Android的資源文件夾res下會有著mipmap-mdpi,mipmap-hdpi,mipmap-xhdpi,mipmap-xxhdpi,mipmap-xxxhdpi這五個文件夾,這是因為我們一般在藍湖UI設(shè)計圖上下載的圖片資源都是對應(yīng)這五種分辨率的圖片,而在Unity中,圖片

    2024年02月11日
    瀏覽(22)
  • python打包,圖片資源打包

    1,安裝pyinstaller pip install pyinstaller *,新配置的python環(huán)境,出現(xiàn)了兩個報錯 第一個通過修改配置文件解決 Invoke-Expression : 無法將參數(shù)綁定到參數(shù)“Command”,因為該參數(shù)為空字符串。 所在位置 C:Usersxxxminiconda3shellcondabinCond_invoke-expression : 所在位置 行:1 字符: 254 + ... engana

    2024年02月13日
    瀏覽(27)
  • Webpack5 處理圖片資源

    過去在 Webpack4 時,我們處理圖片資源通過 file-loader 和 url-loader 進行處理 現(xiàn)在 Webpack5 已經(jīng)將兩個 Loader 功能內(nèi)置到 Webpack 里了,我們只需要簡單配置即可處理圖片資源 src/images/1.jpeg src/images/2.png src/images/3.gif src/less/index.less src/sass/index.sass src/styl/index.styl 打開 index.html 頁面查看

    2024年02月13日
    瀏覽(42)
  • 05_Unity動態(tài)加載圖片資源

    05_Unity動態(tài)加載圖片資源

    本文歸納了Unity中加載圖片資源的常用方法,包括url和本地路徑的加載。 在工具類中封裝如下方法: 一般是放在單例中,如:GameManager 創(chuàng)建一個Image物體 在本地存放一張圖片,Guide1.png 放置在: Resources/Image/Guide1.png 路徑下 在物體上掛接一個測試腳本 執(zhí)行前: 執(zhí)行后: 還是剛

    2024年02月05日
    瀏覽(28)
  • vue如何動態(tài)加載顯示本地圖片資源

    vue如何動態(tài)加載顯示本地圖片資源

    在實際開發(fā)中,根據(jù)某一個變量動態(tài)展示圖片的情況有很多。實現(xiàn)方法分打包構(gòu)建工具的差異而不同。 1、webpack的項目 require引入圖片資源 2、vite的項目 new URL(url,base).href 疑問解答:為什么vite項目不可以用require? 原因在于,vite的模塊化規(guī)范是ES Modules,所以vite項目在打包構(gòu)建

    2024年02月22日
    瀏覽(99)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包