vue.js - 在计算属性中连接多个 vue-loader 要求以定义 srcset 属性 Vue.js (Nuxt)
问题描述
我需要一个建议,请
在尝试了很多方法来创建一个支持本机延迟加载的可重用图片元素组件并回退到 Lazysizes.js 库并接受可变数量的图像源类型和尺寸(in<source>
和他的srcset
属性)之后,我仍然陷入困境。
为了实现这一点,我希望require
在计算方法中使用多个,并且在从方法返回之前需要将它们连接起来(因为我需要require
为每个可用的图像尺寸)但我再次伤害了我认为的require
限制。
没有找到 img 依赖项,因为我认为require
没有像我假设的那样解决。这是我的代码以帮助您理解:
// parent component
<picture-elem
:name="`${img}`"
:img-alt="`${alt}`"
:formats="['webp','jpg']"
:sizes="[['512x768', '2x'], ['256x384', '1x']]"
:img-class="'product-img'"
:lazy="lazyloadImg" //true of false depending the context
/>
//in PictureElem component <template>
<picture>
<source
v-if="formats.indexOf('webp') != -1"
:srcset="(!lazy) ? srcsetWebp : false"
:data-srcset="(lazy && !loadingAttrSupport) ? srcsetWebp : false"
type="image/webp"
>
... // other sources element for every accepted image types
<img ... //fallback img
</picture>
//in script > computed methods, an example of the problematic part with webp
computed: {
getSizesLength () {
return this.sizes.length
},
srcsetWebp () {
let srcset = ""
//loop through the array of availaible images srcset sizes
for (let i = 0; i < this.getSizesLength; i++) {
// require ( [path] + [base name] + [dimension] + [targeted resolution or screen width]
srcset += `${require(`@/assets/img/${this.name}-${this.sizes[i][0]}.webp`)} ${this.sizes[i][1]}`
// if there is following sizes, add a comma (,)
if (i < (this.getSizesLength - 1)) {
srcset += ", "
}
}
return srcset
}
我总是接受它:
Failed to compile with 1 errors
This dependency was not found:
* @/assets/img/img-name.webp in ./node_modules/babel-loader/lib??ref--2-0!./node_modules/vue-loader/lib??vue-loader-options!./components/PictureElem.vue?vue&type=script&lang=js&
我也尝试使用“~/assets/img/..”我来宾问题在于连接require
,因为我的调试检查确认了我。
我也知道一个普通的
return `${require(`@/assets/img/${this.baseName}_480.jpg`)} 480w, ${require(`@/assets/img/${this.baseName}_800.jpg`)} 800w`
应该按照 Alexander Lichter 的解释工作: https ://blog.lichter.io/posts/dynamic-images-vue-nuxt/#bonus---using-srcset
这不是我的第一种方式,我在许多文章中的发现启发下尝试了不同的路径。这是我为这个组件计划的所有灵活性和足够干燥度的最后希望......
我将尝试使用 a在组件父<slot>
级中定义确切require
的 s 但我真的很想了解是否有办法以我尝试或确认required
不能以这种方式使用的方式实现我想要的(连接)。
提前感谢您的时间
解决方案
我终于发现我的问题出在其他地方,问题中没有显示以简化理解的部分,但我发现您不能require
在路径的开头使用字符串变量。我是这样打电话的:
${require(`${this.imagePath}${this.name}-${this.sizes[i][0]}.webp`)}
但它似乎require
无法解决这样的路径。添加路径解决了问题:
${require(`~/assets/img/${this.name}-${this.sizes[i][0]}.webp`)}
// @/assets also works but as it is deprecated in the Nuxt docs I replaced the pointer with "~" everywhere.
并注意您是否忘记编写完整路径(例如缺少/img/
部分),因为require
将尝试获取资产中的所有文件,并且会为每个资产(如字体文件或任何其他不适合 vue-loader 的资产)输出错误又名 webpack 加载器(我认为是这样)。
推荐阅读
- nginx - 强制 Heroku 上的应用程序使用 https
- git - 重新规范化 git 历史
- python - 扫描文件以建立索引不会停止并且 PyCharm 冻结
- html - (Bootstrap 4+) - 具有多个元素的列:在同一行上对齐元素
- javascript - 根据数值反应渲染组件的数量
- c++ - 拥有一个具有写入功能的类,如何将其传递给接受 std::ostream& 的函数
- python - keras 模型总是预测类别而不是概率
- batch-file - Endlocal rtnLocal 宏和 ! 在文件路径中
- twig - 有条件的长度
- reactjs - Material UI TableSortLabel - 仅在悬停时显示自定义 IconComponent