React Hooks项目 require()使用动态(变量)路径引入文件

博客讲述了在webpack+react项目中,因动态加载图片导致的路径问题。当使用变量拼接require路径时,webpack无法预知真实路径,从而引发错误。解决方案是通过Node.js读取并处理图片资源,生成JSON文件以供引用。作者分享了利用fs模块批量处理图片路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求描述:

根据后台返回的图片名称,加载静态资源中所对应名称的图标

为了方便,项目期初并没有将静态资源放到类似于 OSS 这样的静态服务器上面,而是放到了项目中
在这里插入图片描述

问题描述:

组件渲染过程中需要动态渲染img元素,于是使用了node的require模块,再使用es6模板字符串动态拼接src路径:

<img className="w-16" src={require(`assets/images/weatherIcons/${weatherInfo?.icon}.png`)} alt="" />

保存编译后控制台会报如下错误:
在这里插入图片描述
如果路径写死不使用变量的话:

<img className="w-16" src={require(`assets/images/weatherIcons/100.png`)} alt="" />

就不会报错,于是分析了一波:

项目是用webpack5 + react17 来构建的,webpack编译过程中会将一定大小以内的图片转换为base64格式的,如果写死路径就没问题,关键是使用了变量后,webpack 首先会编译ts、tsx等,此时带变量的路径会编译成‘assets/images/weatherIcons/100.png’,但是本地的图标资源已经编译成了base64格式的,所以会找不到匹配的图标,就会报找不到模块的错误(可能描述不够准确,欢迎补充)。

于是想了个s操作,将所有的图标资源放到一个数组中,名称为键,路径为值:
在这里插入图片描述
但是几十上百个图标这么去写有点儿费时间,于是有了s操作二:

const getImages = (path, toPath) => {
  fs.readdir(path, function (error, files) {
    if (!error) {
      const newFiles = files.map(item => {
        let name = item.split('.')[0]
        return {
          [name]: `require(${toPath + item})`
        }
      })
      fs.writeFile('./images.json', JSON.stringify(newFiles), function (err) {
        if (err) {
          res.status(500).send('Server is error...')
        }
      })
    } else {
      console.log(error);
    }
  })
}
getImages("./public/images/", "assets/images/weatherIcons/")

使用node的内置模块fs,readdir读出,writeFile写入,最后生成json文件:
在这里插入图片描述
最后根据需要将值替换掉多余的引号就行了。
如果有更好的方法,欢迎留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值