- API 路由统一: 移除 /api/h5/,统一 /api/pms/ 入口 - 二进制改名: api-server -> pms-api(与服务名一致) - nginx: 合并 /api/ + /pms/api/ 为 /api/pms/ - 新增 docs/API.md 接口文档 - 后端: CabinetDetail 增加 rssi/pow_fail/address/soc 等字段 - Redis 管道批量读取仓体实时数据(SOC/电压/电流/功率) - DB: 所有 TIMESTAMP 列改为 DATETIME(修复类型不匹配) - 用户管理: 新增创建时间/修改时间列,状态改用 Switch - 角色管理/用户管理: 操作按钮改为图标 - PC 设备详情: 基本信息补全 RSSI/ICCID/电源/地址 - PC 卡片: 通道统计改用 Lucide 图标,颜色统一 - PC 二维码: canvas 渲染,含编号文字,支持右键下载 - H5: 按 uni-app 规范修正导航(navigateTo 替代 reLaunch) - H5: 详情页加返回导航条 - H5: 扫码支持摄像头(jsQR)+ ?id= 参数 - H5: 底部 tabBar 在所有页面常显 - H5: 首页统计改为 6 项(设备/通道/空闲/充电/充满/故障) - H5: 下拉刷新 / 上拉加载 - 产品首页: 添加业务联系 - 文档: 清理过时文件,补充缺失规范章节
4.1 KiB
4.1 KiB
title, impact, impactDescription, type, tags
| title | impact | impactDescription | type | tags | |||||
|---|---|---|---|---|---|---|---|---|---|
| Prefer Local Component Registration Over Global | MEDIUM | Global registration prevents tree-shaking and creates implicit dependencies | best-practice |
|
Prefer Local Component Registration Over Global
Impact: MEDIUM - Global registration prevents build tools from removing unused components (tree-shaking), increasing bundle size. It also creates implicit dependencies similar to global variables, making it difficult to trace where components are used and locate their implementations in large applications.
Use local registration for better maintainability, smaller bundles, and explicit dependency relationships.
Task Checklist
- Use local registration (import in each component) by default
- Reserve global registration only for truly ubiquitous components (icons, buttons, layouts)
- When using
<script setup>, simply import components - no explicit registration needed - Review existing global components and migrate to local registration where possible
Incorrect:
// main.js - registering many components globally
import { createApp } from 'vue'
import App from './App.vue'
import Card from './components/Card.vue'
import Modal from './components/Modal.vue'
import Table from './components/Table.vue'
import Pagination from './components/Pagination.vue'
import UserAvatar from './components/UserAvatar.vue'
import SearchBar from './components/SearchBar.vue'
const app = createApp(App)
// WRONG: All these components are now in the bundle even if unused
app.component('Card', Card)
app.component('Modal', Modal)
app.component('Table', Table)
app.component('Pagination', Pagination)
app.component('UserAvatar', UserAvatar)
app.component('SearchBar', SearchBar)
app.mount('#app')
<!-- SomePage.vue - uses only Card, but all components are bundled -->
<template>
<Card>
<p>Content</p>
</Card>
</template>
<script setup>
// No imports - relying on global registration
// This makes dependencies invisible and hurts tree-shaking
</script>
Correct:
// main.js - only register truly universal components globally
import { createApp } from 'vue'
import App from './App.vue'
import BaseIcon from './components/BaseIcon.vue'
import BaseButton from './components/BaseButton.vue'
const app = createApp(App)
// Only truly ubiquitous base components
app.component('BaseIcon', BaseIcon)
app.component('BaseButton', BaseButton)
app.mount('#app')
<!-- SomePage.vue - explicit local imports -->
<script setup>
// CORRECT: Explicit imports enable tree-shaking
// Only Card is included in the bundle for this component
import Card from '@/components/Card.vue'
import UserAvatar from '@/components/UserAvatar.vue'
</script>
<template>
<Card>
<UserAvatar :user="currentUser" />
<p>Content</p>
</Card>
</template>
<!-- Options API local registration -->
<script>
import Card from '@/components/Card.vue'
import UserAvatar from '@/components/UserAvatar.vue'
export default {
components: {
Card,
UserAvatar
}
}
</script>
When Global Registration IS Appropriate
// Truly universal base components used across the entire app
import BaseIcon from './components/BaseIcon.vue'
import BaseButton from './components/BaseButton.vue'
import BaseInput from './components/BaseInput.vue'
// Third-party component libraries with controlled scope
import { Button, Input } from 'some-ui-library'
app.component('BaseIcon', BaseIcon)
app.component('BaseButton', BaseButton)
app.component('BaseInput', BaseInput)
Benefits of Local Registration
| Aspect | Global | Local |
|---|---|---|
| Tree-shaking | Not possible | Full support |
| Dependency tracking | Implicit/hidden | Explicit imports |
| Component location | Hard to find | Follow import path |
| Bundle size | All registered components | Only used components |
| Refactoring | Risk of breaking unknown usages | Clear dependency graph |