DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →
雨云;给项目一台云服务器

webpack 更新后图片值变成对象:先查 default 导入互操作

图片 default 导入原本是 URL 字符串,更新构建器后却变成无原型命名空间,setAttribute 首次渲染失败。检查拼接与 Babel 互操作路径。

升级 webpack 后,import avatar from './avatar.png' 得到的不是字符串,而是只有 default 字段的无原型对象;Vue 首次渲染在 setAttribute 处报 Cannot convert object to primitive value。若项目采用 Vue CLI、Babel 与旧资源 loader 的组合,应检查资源值经过模块拼接后的互操作路径。

明确的失败组合包含 webpack 5.110.2、Vue 2.6.14、Vue CLI 5 和 Babel default 导入互操作。不是所有 asset/inline 或图片导入都会失败;仅看到产物里有 __webpack_require__.cw 也不足以确认,因为正常包装也会使用它。

找到第一个形状错误的值

先在受控环境检查传入 img 的 src 到底是字符串,还是形如 { default: 'data:...' } 的对象,以及它经过了哪个 loader、Babel helper 和拼接边界。不要把完整业务图片数据或私有 URL 写进日志,记录类型与必要结构即可。

无原型对象缺少普通的转换方法,传给 DOM 字符串属性会直接失败。第一次 patch 中止后,后续还可能出现 _transitionClasses 或缺失节点的异常;这些后续错误不一定是另一项 Vue 生命周期缺陷。

5.110 的 CommonJS 包装与 ESM 命名空间处理改变了部分 require 消费路径。Babel 的 _interopRequireDefault 又会根据 __esModule 判断是否包一层;边界判断错误时,业务最终可能拿到命名空间对象,而非原来的默认资源值。

让构建器修正边界,别到模板里逐处拆 default

webpack 5.110.3 的正式变更已经包含“require 指向拼接组外模块时跳过 ESM interop”的修正。当前 5.112.2 同样包含该改动;项目应选择与 loader、插件兼容的正式版本,保留原锁文件并重新完整构建。

这并不表示应固定在 5.110.3:该版本还有另一条相邻 require 的分号回归,选版时要覆盖项目实际用到的构建路径。这项转换发生在构建阶段,升级 Vue 运行时不会自动改写旧 bundle 的导入值。

不要给所有图片一律写 avatar.default。正常路径本来返回字符串,机械拆一层会在另一些页面得到 undefined;这也会把构建器的互操作差异泄露进业务模板。String(avatar) 对无原型命名空间也可能继续报错,并不是可靠的降级。

验收从原组件或页面读取资源值,确认是预期 URL 或 data URI 字符串,图片能实际加载,首次与后续渲染都正常。保留生产模式、外部 Vue、Babel 和原资源 loader 条件;只拿一个不经过相同消费边界的独立 asset 示例通过,不能证明原应用恢复。若值形状已正确而图片仍加载失败,再沿实际 URL、publicPath 和网络响应继续查。