- 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: 下拉刷新 / 上拉加载 - 产品首页: 添加业务联系 - 文档: 清理过时文件,补充缺失规范章节
3.1 KiB
Install Plugins Before Mounting the App
Rule
All plugins must be installed using app.use() BEFORE calling app.mount(). Installing plugins after the app is mounted can lead to reactivity issues, missing dependencies, and unexpected behavior.
Why This Matters
-
Hidden dependencies: Components may render before plugins they depend on are available, causing runtime errors.
-
Reactivity issues: Late plugin installation can cause subtle reactivity problems where provided values aren't properly reactive.
-
Initialization order: Many plugins (like vue-router, pinia) need to set up state before any component renders.
-
Ecosystem complexity: Adding plugins after mount can cause issues with Vue's internal ecosystem and hydration in SSR scenarios.
Bad Practice
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import i18nPlugin from './plugins/i18n'
const app = createApp(App)
// Mounting first - plugins not yet available!
app.mount('#app')
// Installing after mount - TOO LATE!
app.use(router)
app.use(i18nPlugin, { locale: 'en' })
Good Practice
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'
import i18nPlugin from './plugins/i18n'
const app = createApp(App)
// Install all plugins BEFORE mounting
app.use(createPinia())
app.use(router)
app.use(i18nPlugin, { locale: 'en' })
// Mount LAST
app.mount('#app')
Plugin Installation Order
The order of app.use() calls can matter when plugins depend on each other:
const app = createApp(App)
// 1. State management first (other plugins might need it)
app.use(createPinia())
// 2. Router (may depend on state)
app.use(router)
// 3. Other plugins (may depend on router or state)
app.use(authPlugin)
app.use(i18nPlugin, { locale: 'en' })
// 4. Mount last
app.mount('#app')
Async Plugin Installation
If you need to perform async operations before mounting:
import { createApp } from 'vue'
import App from './App.vue'
import { loadPlugins } from './plugins'
async function bootstrap() {
const app = createApp(App)
// Await async plugin setup
const i18nPlugin = await loadI18nMessages()
// Install all plugins
app.use(i18nPlugin)
// Mount after everything is ready
app.mount('#app')
}
bootstrap()
Duplicate Installation Protection
Vue's app.use() automatically prevents duplicate plugin installation:
app.use(myPlugin)
app.use(myPlugin) // This second call is ignored - no double installation
// This is handled internally by Vue, providing a safety net
Common Symptoms of Late Plugin Installation
inject()returnsundefinedunexpectedly- Router navigation guards not firing
- Store state not reactive
- Template errors about undefined global properties
- Hydration mismatches in SSR