不该。第三方CSS不应手动放入src/css目录,而应通过构建工具直接解析node_modules路径引入,或用link引入CDN资源;vendor目录仅存导入胶水文件,不存实际CSS内容。
src/css 目录?不该。把 node_modules/xxx/dist/xxx.css 手动拷进 src/css 或子目录(比如 src/css/vendor/)是典型反模式:它绕过包管理、破坏版本可追溯性、导致更新时样式残留或缺失,且构建工具无法对其做哈希、压缩、tree-shaking 等处理。
正确做法是让构建工具直接解析 node_modules 中的路径:
import 'element-plus/dist/index.css'(无 ./ 开头),Vite 会自动从 node_modules 查找css-loader + style-loader 已启用,并在 resolve.modules 中包含 node_modules
目录结构只管“组织方式”,不改变加载行为。你可以用逻辑分层来提升可读性,但所有引入仍走模块系统:
src/assets/styles/ 下建 vendor/ 目录,只放入口文件,比如 vendor/bootstrap.ts,内容为 import 'bootstrap/dist/css/bootstrap.min.css'; export {};
vendor/highlight.ts、vendor/element-plus.ts,每个文件只负责一个库的样式导入main.ts 统一导入这些 vendor/*.ts 文件,避免散落vendor/bootstrap.css 这类空壳文件再 @import —— 构建工具不处理外部 @import url(),纯属无效操作@import 和 link 在 vendor 场景下谁更可控?link 更可控,尤其对 CDN 场景;@import 在现代工程中基本应禁用。
立即学习“前端免费学习笔记(深入)”;
常见错误现象:
index.html 里用 <link> 引入 CDN,又在 JS 里 import 同一库的本地 CSS → 规则重复、权重混乱、闪屏<style> 块顶部写 @import url("https://...") → 渲染阻塞,白屏时间延长@import 加载多个第三方 CSS → 浏览器串行请求,无法并行,首屏性能恶化实操建议:
highlight.js 主题)→ 用 <link rel="stylesheet">,加 crossorigin 避免 CORS 报错node_modules 且需参与构建流程(如主题定制、PostCSS 处理)→ 必须用 import 语句,由构建工具接管@import url(...) 引第三方 CSS —— PostCSS 默认忽略,Webpack/Vite 不打包,上线就 404因为开发者常把它当成“样式垃圾桶”,把所有第三方相关都往里塞,结果失去控制点。
容易被忽略的关键点:
vendor/ 下混入自定义 patch(如 patch-bootstrap.css),却没和对应版本绑定 → 升级 Bootstrap 后 patch 失效或冲突vendor.css → 无法按需剔除,Tree-shaking 彻底失效@layer 尝试管理第三方样式层叠顺序,但大多数第三方库输出的是普通规则,不声明 @layer → 实际无效.btn 冲突照旧发生,隔离靠的是作用域方案(CSS Modules / Shadow DOM),不是目录名真正干净的做法:vendor 目录只存“导入胶水文件”,不存任何实际 CSS 内容;所有样式来源清晰可溯,所有加载路径由构建系统统一调度。