style-dry: - 新增 src/styles/components.css: .info-item*/.panel/.panel-header/.tech-tag/.card-tags 全局 - main.ts 注册 import - 删重复: ProjectDetail/TaskDetail/TaskOutputCard/ProjectCard/Projects(scoped删重复, 全局对子组件生效) - 未使用清理: Projects .card-progress dead(1处保守核对) tsjs-dry: - aiShared.ts: resolveAiLang(合并useAiSend.resolveLang + useAiContext.resolveLanguage) - stores/knowledge.ts: kindText/kindLabel/kindIcon/knowledgeStatusLabel/knowledgeConfidenceLabel(5公共) - 删重复: useAiSend/useAiContext(resolveLang) + Knowledge/KnowledgeDetail(4+5 helper) + ActiveProjectsPanel(formatLastActivity→formatRelativeZh复用) strategy: DRY收口, 公共沉淀(utils/store/shared); relativeTime非纯重复保留; .btn/.empty-hint局部override WATCH未动
19 lines
677 B
TypeScript
19 lines
677 B
TypeScript
import { createApp } from "vue";
|
|
import App from "./App.vue";
|
|
import router from "./router";
|
|
import i18n from "./i18n";
|
|
import "./styles/global.css";
|
|
import "./styles/ai-md.css";
|
|
import "./styles/components.css";
|
|
|
|
const app = createApp(App);
|
|
|
|
// 全局错误兜底:捕获 Vue runtime 未处理错误(组件渲染/生命周期/事件回调抛错),
|
|
// 仅记录不中断,防止整页白屏。组件级降级 UI 由 ErrorBoundary.vue 负责。
|
|
app.config.errorHandler = (err, instance, info) => {
|
|
const tag = instance?.$options?.name || instance?.$options?.__name || "unknown";
|
|
console.error(`[Vue error] <${tag}> ${info}:`, err);
|
|
};
|
|
|
|
app.use(router).use(i18n).mount("#app");
|