封装了一个el-menu,其中有对图片的渲染。
第一种:
menuData:[
{
name:'Image',
scr:'@/assets/xx.png'
}
]
<el-menu-item v-if="item.name === 'Image'" :key="index">
<el-image :src="require(item.src)"></el-image>
</el-menu-item>
当获取的src是动态变量时,控制台报错Error in render: "Error: Cannot find module '@/assets/xx.png'"
第二种:
menuData:[
{
name:'Image',
scr:'xx.png'
}
]
但是。使用require(@/assets/${src}
)时就可以正确渲染
ai说是require不接受动态变量,但是这两者不都是动态形式传入吗?
这个问题涉及到了 Vue 和 Webpack 中
require
的工作原理。在 Vue+Webpack 环境中,
require
和动态路径的处理有特殊规则:第一种情况(不工作)
这种方式不工作是因为 Webpack 在编译时需要确定所有可能的模块路径。当你使用
require(item.src)
时,Webpack 在编译阶段无法知道item.src
的值是什么,所以无法正确地打包相关资源。第二种情况(工作)
这种方式能工作是因为 Webpack 使用了一个叫作"上下文模块"的特性。当你使用模板字符串
require(`@/assets/${item.src}`)
时,Webpack 会在编译时创建一个包含@/assets/
目录下所有文件的上下文,然后在运行时根据变量值加载对应的文件。关键区别
require(item.src)
),Webpack 在编译时无法确定可能的文件路径。require(`@/assets/${item.src}`)
),Webpack 可以在编译时确定查找的目录范围(@/assets/
),然后在运行时只需从这个有限的文件集合中选择正确的文件。解决方案
如果你需要第一种方式工作,有几个选择:
require.context
预先定义可能的文件范围public
目录下,使用绝对路径访问