我被vite-plugin-style-import硬控了两个小时

vite-plugin-style-import导致Vite 构建失败,我被硬控了两个小时

💥 事故现场

本地开发好好的,一到 Docker 就翻车:

bash 复制代码
ERROR  failed to load config from /src/vite.
config.ts
ERROR  error during build:
Error: Cannot find module 'consola'
Require stack:
- /src/node_modules/vite-plugin-style-import/dist/index.cjs

症状:本地能跑,Docker 崩溃 🤔

🔍 排查过程(踩坑实录)

第一步:看错误信息(废话文学)

错误堆栈指向 vite-plugin-style-import,第一反应是:

"这插件怎么了?我又没改过它!" 😤

第二步:检查依赖(开始怀疑人生)

bash 复制代码
grep -r "consola" package-lock.json

发现一堆 consola 相关的依赖,但版本乱七八糟:

  • consola@3.4.2 标记为 optional: true
  • vite-plugin-html 嵌套了一个 consola@2.15.3
  • vite-plugin-style-import 声明需要 console@0.7.2

这时候想:"为什么有这么多版本?npm 你是不是有病?" 🤬

第三步:深入源码(真相大白)

打开 vite-plugin-style-import 的源码一看:

javascript 复制代码
// dist/index.cjs 第10行
const consola = require("consola"); // 👀 用的是 consola

再看 package.json:

json 复制代码
"dependencies": {
  "console": "^0.7.2"  // 👀 声明的是 console
}

卧槽!包名都写错了! 这就是传说中的"复制粘贴都能出错"系列 🤡

第四步:对比环境(恍然大悟)

本地为什么能跑?

bash 复制代码
ls node_modules/ | grep consola
# 结果:consola  <-- 居然有!

Docker 为什么崩?

bash 复制代码
# Docker 环境严格按 package-lock.json 安装
# optional 依赖装不上直接跳过
# 顶级 node_modules 里没有 consola

这时候终于明白了:本地有"幽灵依赖"救了命,Docker 环境太干净反而翻车了 💀

第五步:分析包查找过程(技术深度)

Node.js 查找模块的规则很简单,但魔鬼在细节里:

🟢 vite-plugin-html 为什么能找到 consola?

bash 复制代码
查找路径:
1. node_modules/vite-plugin-html/node_modules/consola ✅ 找到了!
   ↳ 因为它自己的 package.json 里正确声明了 consola 依赖

🔴 vite-plugin-style-import 为什么找不到?

bash 复制代码
查找路径:
1. node_modules/vite-plugin-style-import/node_modules/consola ❌ 没有
   ↳ 因为它声明的是 console,不是 consola
2. node_modules/consola ❌ 顶级也没有
   ↳ 因为 Docker 环境跳过了 optional 依赖
3. ../node_modules/consola ❌ 向上查找也没有
   ↳ 最终 GG

关键差别:一个有自己的嵌套依赖,一个依赖声明写错了!

第六步:理解 optional: true 的坑

optional: true 听起来很温柔,其实是个狠角色:

json 复制代码
"consola": {
  "version": "3.4.2",
  "optional": true  // 🎯 这是个狠活
}

含义解释

  • 本地环境:"optional 装不上?算了算了,不影响开发" 😎
  • Docker 环境:"optional 装不上?那就不装了,严格执行" 🤖
  • 网络不好时:"optional 下载超时?跳过跳过,不影响主流程" ⏰
  • 内部仓库缺包时:"optional 包找不到?无所谓,继续安装其他的" 🚫

结果就是

  • 关键依赖被标记为 optional
  • 本地能凑合(有幽灵依赖兜底)
  • Docker 环境直接跳过
  • 生产环境翻车 💥

💡 吃一堑长一智

使用任何第三方库时都要检查一下维护状态和更新频率,否则你就可能是下一个🤡🤡🤡(扑克牌的最大数 麦当劳的吉祥物 蝙蝠侠的大客户 哥谭市的大头目)。

相关推荐
Z兽兽1 小时前
React@18+Vite项目配置env文件
前端·react.js·前端框架
SuniaWang1 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
A_nanda2 小时前
根据AI提示排查vue前端项目
前端·javascript·vue.js
happymaker06262 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
~无忧花开~2 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
LegendNoTitle2 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php
@大迁世界3 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
BJ-Giser3 小时前
Cesium 基于EZ-Tree的植被效果
前端·可视化·cesium
王码码20354 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos
发现一只大呆瓜4 小时前
深入浅出 AST:解密 Vite、Babel编译的底层“黑盒”
前端·面试·vite