最稳方式是直接写<link>和<script>标签,但必须严格卡死顺序与完整性:Bootstrap 5需引入bootstrap.bundle.min.js(含Popper),Element UI须先引Vue 2.7再引UMD版组件库,CSS加载顺序影响样式优先级,多库共存时theme-chalk须在Bootstrap之后。
直接写 <link> 和 <script> 标签是最稳的,但顺序和完整性必须卡死。Bootstrap 5 的 bootstrap.bundle.min.js 必须加载,只引 bootstrap.min.js 会导致 data-bs-toggle 类失效——因为 Popper 没进来。
https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css,别写 ./css/bootstrap.css;服务端渲染时相对路径会拼错路由<link rel="stylesheet">,Bootstrap 自带图标已移除,漏掉就显示方块<el-button> 却没反应,先确认是否同时引入了 Vue 2.7 和 Element UI 的 UMD 版本:https://unpkg.com/[email protected]/dist/vue.min.js + https://unpkg.com/element-ui/lib/index.js
theme-chalk 样式表必须在 Bootstrap 之后加载,否则按钮圆角、边框会被覆盖HTMLHint 是唯一能静态扫描组件使用合规性的工具,它能发现 <el-table> 缺少 v-loading 属性、<el-form> 没配 model 等低级但高频的错误。
package.json 中加脚本:"lint:html": "htmlhint src/**/*.html --config .htmlhintrc",配置项里必须启用 attr-lowercase 和 attr-no-unknown,否则自定义组件标签(如 el-card)会被当非法属性报错vite.config.js 的 build.beforeWriteBundle 钩子中调用 execSync('npx htmlhint'),失败直接中断构建src/pages/**/*.{html,htm},否则 templates/ 下的 Thymeleaf 模板不会被扫到没有 Shadow DOM 或框架作用域时,.btn 这种泛化名等于主动邀请样式冲突。哪怕只集成一个组件库,也得强制加命名空间,比如 .c-button 或 .el-button。
el-button),但如果你手写 <button class="btn">,就会和 Bootstrap 的 .btn 打架,最终渲染结果取决于 CSS 加载顺序<div class="c-card">...</div> 到任意页面要能直接跑,不能依赖外部 <section> 或全局 reset!important 和 px 单位:组件内所有间距用 var(--c-space-md),否则换主题或适配高 DPR 屏幕时会失真col-md-6 和 c-grid-col-6,栅格系统会错位——语义规则一旦断裂,响应式就不可控Spring Boot 的 src/main/resources/templates 目录下放 Thymeleaf 模板,组件 JS 不能直接写在 <script> 里,得走 th:inline="javascript" 或后端变量透出。
立即学习“前端免费学习笔记(深入)”;
[[${'...'}]] 中,否则 Thymeleaf 会把 {{ }} 当作模板语法解析并删掉el-table 数据源不能硬编码,要从后端 Model 注入:th:attr="data-list=${userList}",前端再用 JSON.parse(this.dataset.list) 读取/static/js/vue.min.js),Thymeleaf 不处理相对路径中的 ../
window.postMessage,且子页需显式监听 message 事件class="btn" 写单元测试,但它恰恰是 CI 失败最常卡住的位置。