解决项目迁移vite引入图片资源报require is not defined的问题

这篇具有很好参考价值的文章主要介绍了解决项目迁移vite引入图片资源报require is not defined的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Vite是一种轻量快速的前端构建工具,能够显著提升前端开发体验,而且官方已经发布v4版本,相对比较稳定。在把VueCli搭建的项目迁移到Vite的过程中遇到了个问题,下面分享一下问题及解决办法。

一、遇到的问题

script标签里面引入的图片资源没生效,然后一看控制台,报错显示 require is not defined …

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

二、解决办法

1. 明确方向

经过查找Vite相关文档,看到官方文档静态资源处理目录,发现需要使用new URL()这个方法才能处理动态引入的URL,才能保证图片资源在经过打包和资源哈希后仍指向正确的地址。

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/下,那么直接封装成一个函数,像hooks那样调用应该方便很多。

  1. 在utils文件下下新建useImgUrl.js文件,简简单单,只需要传入图片文件名及类型即可
const getImgUrl = file => {
  return new URL(`../assets/images/${file}`, import.meta.url).href;
};
export default getImgUrl;
  1. 在文件中引入并使用,文件内修改只需使用全局替换功能即可
import getImgUrl from "../utils/useImgUrl";

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

③ 方案三

上面的方案虽然不用一个个改了,但是Vue3没有mixins这样可以全局引入的方法,还是需要在不同的文件去引入hook,这个时候我想能不能像webpackloader那样去全局处理.vue文件,这样全局替换的操作交给构建工具去自动执行得了,然后发现Vite里面并没有loader配置,不过好在这时候一个Vite插件给了我灵感,可以用Vite插件API去实现类似的功能,于是转换下思路,写了这么一个插件

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

    // 默认值post:在 Vite 核心插件之后调用该插件,pre:在 Vite 核心插件之前调用该插件
    // enforce: "post",

    // 代码转译,这个函数的功能类似于 "webpack" 的 "loader"
    transform(code, id, opt) {
      const vueRE = /\.vue$/;
      const require = /require/g;
      
      // 过滤掉非目标文件
      if (!vueRE.test(id) || !require.test(code)) return code;

      // 匹配 require() 内的内容
      const requireRegex = /require\((.*?)\)/g;

      // 将 require() 内的内容替换为 new URL 的写法
      const finalCode = code.replace(requireRegex, "new URL($1,import.meta.url).href");
		
	  // 将转换后的代码返回
      return finalCode;
    },
  };
}
  1. 在Vite配置中引入此插件:
// vite.config.js
import requireToUrlPlugin from './src/requireToUrlPlugin';
export default defineConfig(({ command, mode }) => {
    plugins: [
      vue(),
      requireToUrlPlugin(),
    ]
});

引入后项目中的require方法都会被插件自动转换为new URL() 的语法,真的是终极大招[doge],这样就不用再一个个文件去改了,非常省事,而且自己写的插件也完全可以自由定制,写法仅供参考。

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

通过查看控制台能看到通过Vite的打包运行“preview”后,图片是正常显示的。

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

查看源代码能看到原本写的 require 方法已经变成了 new URL()的方法。

三、原因及相关原理

1. 为什么需要require方法

静态资源就是直接存放在项目中的资源,这些资源不需要我们发送专门的请求进行获取。比如assets目录下面的图片,视频,音频,字体文件,css样式表等。
动态资源就是需要发送请求获取到的资源

答:因为项目引入的动态资源被当做静态资源处理了。被打包过后,被打包在新的文件夹下的图片资源会生成新的文件名,在原来的文件名后会加入一串数字,此即为资源哈希化,是为了做服务器缓存用的。那么静态的路径并不能匹配到新的文件名,导致无法正确的引入资源,所以需要加上require。require 是一个node方法,webpack会将图片当成一个模块,并根据配置文件中的规则进行打包,通过require方法拿到的文件地址,就是资源文件编译过后的文件地址。

2. 为什么require方法失效了

答:因为原来的项目是VueCli搭建的,其是构建于 webpack 和 webpack-dev-server 之上的,所以require方法会经过webpack处理,而Vite开发环境是基于原生ES Module的,生产环境则是通过Rollup进行打包的,Rollup默认也是不支持CommonJS模块的,所以无法识别 require 方法。

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

const imgUrl = new URL('./img.png', import.meta.url).href
  • new URL(url,base)
    用来创建一个新 URL 对象:

    • url —— 完整的 URL,或者仅路径(如果设置了 base)
    • base —— 可选的 base URL:如果设置了此参数,且参数 url 只有路径,则会根据这个 base 生成 URL

    其中有一个属性是href,正好是函数的返回值!

  • import.meta
    import.meta 对象包含关于当前模块的信息。
    它的内容取决于其所在的环境。在浏览器环境中,它包含当前脚本的 URL,或者如果它是在 HTML 中的话,则包含当前页面的 URL。

4. Vite插件介绍

Vite 插件扩展了设计出色的 Rollup 接口,带有一些 Vite 独有的配置项。因此,只需要编写一个 Vite 插件,就可以同时为开发环境和生产环境工作。


总结

以上就是全部内容,本文简单介绍了Vite在生产构建时JavaScript模块对图片资源的引入方法,并且介绍了Vite插件的基本用法。

如果此篇文章对您有帮助欢迎您【点赞】,也欢迎您【评论】+【收藏】!文章来源地址https://www.toymoban.com/news/detail-776987.html


扩展阅读

  1. Vite 官方中文文档 | 静态资源处理
  2. Vite 官方中文文档 | 插件 API
  3. Vue CLI | 处理静态资源

到了这里,关于解决项目迁移vite引入图片资源报require is not defined的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Selenium 图片资源自动搜索保存 项目实践

    启动后会自动打开一个页面 页面分析 第一页 第二页 由此可得出变化的只有这里,根据pagi= 展示不同页面 红色箭头定位到页数,绿色的不要使用 是反爬虫的限制,不断变化的 可以适当的进行优化,使用selnium的页面加载策略

    2024年01月16日
    浏览(52)
  • SpringBoot项目打成jar包后,上传的静态资源(图片等)如何存储和访问

    使用springboot开发一个项目,开发文件上传的时候,通常会将上传的文件存储到资源目录下的static里面,然后在本地测试上传文件功能没有问题,但是将项目打成jar包放到服务器上运行的时候就会报错,找不到对应目录。或者可以将上传文件存储到和jar包同级的目录下,但是无

    2024年02月12日
    浏览(58)
  • Unity队列加载图片,解决大量同时加载资源卡顿问题与思路

    1、思路:加载图片的请求都加到队列中,然后一个加载完一个再去加载下一个,直到加载完。 2、问题:         问题是相对也存在的。当加载的数据还在队列中,但是已经跳转到其它的场景,则会出现报错的问题。         每次跳转场景的时候,需要把队列中的数据情况

    2024年02月16日
    浏览(48)
  • 用Eclipse创建一个JavaWeb项目,把资源添加到Tomcat服务器,并运行jsp文件详细过程(附图片)

    目录 前言 一、Eclipse下载安装 二、创建 1.创建web项目 2.创建jsp文件  三.设置Tomcat 四.解决问题  五、添加资源到tomcat服务器   六.运行 总结 使用Eclipse创建web项目时,务必先下载安装好JDK和Tomcat。 1、Eclipse J2EE: https://www.eclipse.org/downloads/  2、选择Eclipse IDE for Enterprise Java an

    2024年02月13日
    浏览(47)
  • vite搭建的项目动态引入本地图片

    由于vite里面没有require(), 所以需要封装个工具。

    2024年02月11日
    浏览(49)
  • Unity 图片资源的适配

    最近小编做Unity项目时,发现在资源处理这方面和Android有所不同;例如:Android的资源文件夹res下会有着mipmap-mdpi,mipmap-hdpi,mipmap-xhdpi,mipmap-xxhdpi,mipmap-xxxhdpi这五个文件夹,这是因为我们一般在蓝湖UI设计图上下载的图片资源都是对应这五种分辨率的图片,而在Unity中,图片

    2024年02月11日
    浏览(38)
  • python打包,图片资源打包

    1,安装pyinstaller pip install pyinstaller *,新配置的python环境,出现了两个报错 第一个通过修改配置文件解决 Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。 所在位置 C:Usersxxxminiconda3shellcondabinCond_invoke-expression : 所在位置 行:1 字符: 254 + ... engana

    2024年02月13日
    浏览(46)
  • Webpack5 处理图片资源

    过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 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日
    浏览(41)
  • 05_Unity动态加载图片资源

    本文归纳了Unity中加载图片资源的常用方法,包括url和本地路径的加载。 在工具类中封装如下方法: 一般是放在单例中,如:GameManager 创建一个Image物体 在本地存放一张图片,Guide1.png 放置在: Resources/Image/Guide1.png 路径下 在物体上挂接一个测试脚本 执行前: 执行后: 还是刚

    2024年02月05日
    浏览(114)
  • vue如何动态加载显示本地图片资源

    在实际开发中,根据某一个变量动态展示图片的情况有很多。实现方法分打包构建工具的差异而不同。 1、webpack的项目 require引入图片资源 2、vite的项目 new URL(url,base).href 疑问解答:为什么vite项目不可以用require? 原因在于,vite的模块化规范是ES Modules,所以vite项目在打包构建

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包