【问题标题】:Dynamically loading assets with require() that might not exist in webpack + VueJS使用 webpack + VueJS 中可能不存在的 require() 动态加载资产
【发布时间】:2018-04-04 19:33:07
【问题描述】:

我正在尝试动态加载可能存在或不存在的图像。

在这种情况下,加密货币图标使用它们的 3 个字母符号。我的静态库中有几百个 .svg 格式,当我从价格服务器中提取数据时,我尝试将我拥有的图标与来自服务器的符号进行匹配,并在没有的情况下提供备用图像资产。

在我的 index.vue 中,我可以摆脱这段代码并且一切正常:

<img :src="'statics/icons/svg/' + coin.symbol + '.svg'" v-img-fallback="'statics/icons/svg/fallback.svg'"/>

但是,在用户点击硬币时打开的子组件中,相同的代码将无法加载主图像和备用图像。我尝试了很多方法,但是从我的子组件中加载图像的唯一方法是像这样硬编码:

<img src="statics/icons/svg/btc.svg"/>

这对我来说是不可能的,因为我需要为任何可能的硬币动态生成模态......

或者像这样使用 require():

<img :src="imageSrc" v-img-fallback="require('../statics/icons/svg/fallback.svg')"/>
// Computed:
imageSrc () {
  if (this.coinData.symbol) {
     return require('../statics/icons/svg/' + this.coinData.symbol + '.svg')
  }
}

但是,如果 require() 查找不存在的资产,这会使我的应用程序崩溃。我需要一个优雅失败的方法,以便v-img-fallback 可以检测到它并提供回退。

我尝试过类似return require(image1) || require(fallback) 的操作,但它不起作用。

【问题讨论】:

    标签: javascript cordova webpack vue.js quasar-framework


    【解决方案1】:

    这是一个常见的请求,最新的 WebPack,AFAIK(我刚刚再次搜索),没有公开用于特别测试模块是否存在的 API。

    换句话说,您必须自己处理加载的不确定性。示例:

      computed: {
        imageSrc () {
          if (this.coinData.symbol) {
            try {
              return require('../statics/icons/svg/' + this.coinData.symbol + '.svg')
            } catch (e) {
              if (e.name !== "ModuleNotFoundError") throw e; // handle false-positives
              // in cordova, use the line below instead of the above
              // if (!e.message.startsWith('Cannot find module')) throw e;
              return require('../statics/icons/svg/fallback.svg');
            }
          }
          return require('../statics/icons/svg/fallback.svg');
        }
      }
    

    这样我认为你甚至不需要模板中的后备src。您可以在计算属性本身中返回它。

    【讨论】:

    • 哇,非常感谢。我确实在这个错误上花了几天时间......不知道尝试和捕捉。我不得不稍微修改您的代码以使其正常工作,我没有得到一个 e.name,所以您的 throw e 永远不会被捕获。也许与科尔多瓦有关?我只是把它完全拿出来,因为我还没有看到任何误报发生,甚至不确定这意味着什么。但是你可以用这个替换那行,它保持了你的代码精神并解决了我的问题if (e.name !== "ModuleNotFoundError") throw e;
    • 是的,当然。 “误报”是指不是预期的“未找到模块”的任何其他错误。例如,webpack 的任何其他疯狂错误,您可能会误以为“未找到模块”而将其吞下,而实际上它是别的东西。但是,是的,这是一个罕见的场合。而且,是的,科尔多瓦也可能与此有关。
    • 我错过了我的最后一条评论,它不会让我编辑它,对于任何期待未来的人来说,它是if (!e.message.startsWith('Cannot find module')) throw e
    • 太好了,谢谢。我已将答案添加为评论!
    猜你喜欢
    • 2018-09-13
    • 2018-05-11
    • 2018-02-11
    • 2021-06-01
    • 2017-03-30
    • 2022-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多