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

4 篇文章 0 订阅
3 篇文章 0 订阅

需求描述:

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

为了方便,项目期初并没有将静态资源放到类似于 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值