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

項(xiàng)目遷移vite引入圖片資源報(bào)require?is?not?defined問題的解決辦法

 更新時(shí)間:2024年01月23日 10:17:54   作者:前端咸魚翻身  
這篇文章主要給大家介紹了關(guān)于項(xiàng)目遷移vite引入圖片資源報(bào)require?is?not?defined問題的解決辦法,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vite具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

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

一、遇到的問題

script標(biāo)簽里面引入的圖片資源沒生效,然后一看控制臺,報(bào)錯(cuò)顯示 require is not defined …

二、解決辦法

1. 明確方向

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

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,

② 方案二

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

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

③ 方案三

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

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

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

    // 代碼轉(zhuǎn)譯,這個(gè)函數(shù)的功能類似于 "webpack" 的 "loader"
    transform(code, id, opt) {
      const vueRE = /\.vue$/;
      const require = /require/g;
      
      // 過濾掉非目標(biāo)文件
      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;
    },
  };
}
  • 在Vite配置中引入此插件:
// vite.config.js
import requireToUrlPlugin from './src/requireToUrlPlugin';
export default defineConfig(({ command, mode }) => {
    plugins: [
      vue(),
      requireToUrlPlugin(),
    ]
});

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

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

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

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

1. 為什么需要require方法

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

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

2. 為什么require方法失效了

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

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

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

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

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

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

4. Vite插件介紹

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

擴(kuò)展閱讀

總結(jié)

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

到此這篇關(guān)于項(xiàng)目遷移vite引入圖片資源報(bào)require is not defined問題的解決辦法的文章就介紹到這了,更多相關(guān)vite報(bào)錯(cuò)require is not defined內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue Element前端應(yīng)用開發(fā)之動(dòng)態(tài)菜單和路由的關(guān)聯(lián)處理

    Vue Element前端應(yīng)用開發(fā)之動(dòng)態(tài)菜單和路由的關(guān)聯(lián)處理

    這篇文章主要介紹了Vue Element前端應(yīng)用開發(fā)之動(dòng)態(tài)菜單和路由的關(guān)聯(lián)處理,對vue感興趣的同學(xué),可以參考下
    2021-05-05
  • vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例

    vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例

    今天小編就為大家分享一篇vue動(dòng)態(tài)設(shè)置img的src路徑實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue2.x background:url()的踩坑記錄

    vue2.x background:url()的踩坑記錄

    這篇文章主要介紹了vue2.x background:url()的踩坑記錄,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Nuxt3重點(diǎn)特性使用舉例問題記錄

    Nuxt3重點(diǎn)特性使用舉例問題記錄

    Nuxt3?使用?Vue.js?作為視圖引擎,Nuxt3?中提供了所有?Vue?3?功能,所以我們創(chuàng)建的Nuxt項(xiàng)目其實(shí)也是vue3項(xiàng)目,這篇文章主要介紹了Nuxt3重點(diǎn)特性使用舉例記錄,需要的朋友可以參考下
    2022-12-12
  • vue 倒計(jì)時(shí)結(jié)束跳轉(zhuǎn)頁面實(shí)現(xiàn)代碼

    vue 倒計(jì)時(shí)結(jié)束跳轉(zhuǎn)頁面實(shí)現(xiàn)代碼

    在商場大家經(jīng)??吹酵\囀召M(fèi)倒計(jì)時(shí)支付頁面,今天小編通過本文給大家分享vue 倒計(jì)時(shí)結(jié)束跳轉(zhuǎn)頁面功能,感興趣的朋友一起看看吧
    2023-10-10
  • 詳解如何使用vue實(shí)現(xiàn)頁面訪問攔截

    詳解如何使用vue實(shí)現(xiàn)頁面訪問攔截

    這篇文章主要為大家詳細(xì)介紹了如何使用vue實(shí)現(xiàn)頁面訪問攔截功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下
    2023-08-08
  • vue.js指令v-model使用方法

    vue.js指令v-model使用方法

    這篇文章主要為大家詳細(xì)介紹了vue.js指令v-model的使用方法 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Vue中router-view無法顯示的解決辦法

    Vue中router-view無法顯示的解決辦法

    這篇文章主要給大家介紹了關(guān)于Vue中router-view無法顯示的解決辦法,router-view組件作為vue最核心的路由管理組件,在項(xiàng)目中作為路由管理經(jīng)常被使用到,需要的朋友可以參考下
    2023-07-07
  • Vue設(shè)計(jì)器form-create-designer配置表單默認(rèn)值示例詳解

    Vue設(shè)計(jì)器form-create-designer配置表單默認(rèn)值示例詳解

    這篇文章主要介紹了如何使用開源項(xiàng)目form-create-designer來靈活調(diào)整表單的默認(rèn)值,通過config.formOptions,您可以自定義表單的全局布局,文章提供了一個(gè)詳細(xì)的例子,展示了如何使用form-create-designer的配置選項(xiàng)來調(diào)整表單的布局和外觀,感興趣的朋友一起看看吧
    2024-11-11
  • Vue.js中的高級面試題及答案

    Vue.js中的高級面試題及答案

    Vue-loader 是 Webpack 的加載模塊,它使我們可以用 Vue 文件格式編寫單文件組件。這篇文章主要介紹了Vue.js的高級面試題以及答案,需要的朋友可以參考下
    2020-01-01

最新評論

卢氏县| 丹凤县| 新乐市| 依安县| 英吉沙县| 肇庆市| 大新县| 华宁县| 长寿区| 汕尾市| 灵宝市| 鸡泽县| 辰溪县| 乌兰县| 阜平县| 余庆县| 星子县| 墨竹工卡县| 石阡县| 准格尔旗| 揭西县| 铜梁县| 嘉鱼县| 集贤县| 新密市| 青州市| 梅州市| 加查县| 宜川县| 庐江县| 安达市| 泰来县| 淳化县| 德钦县| 敖汉旗| 炎陵县| 云梦县| 夏津县| 舟山市| 鹤壁市| 北宁市|