UniApp跨平台状态管理深度实践:构建高性能多端同步架构 | 前端开发教程

2026-03-07 0 866
免费资源下载

探索UniApp在多端开发中的状态管理最佳实践,实现数据的高效同步与性能优化

引言:UniApp状态管理的挑战与机遇

在UniApp跨平台开发中,状态管理面临着多端同步、性能优化、数据一致性等独特挑战。本文将深入探讨如何构建一个高性能、可维护的跨平台状态管理架构,解决实际开发中的痛点问题。

一、UniApp状态管理基础架构设计

传统Vuex在UniApp中的局限性及改进方案:

// store/index.js - 基础架构
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from './plugins/persisted-state'
import createPlatformAdapter from './plugins/platform-adapter'

Vue.use(Vuex)

// 模块化状态设计
const modules = {
  user: {
    state: () => ({
      token: '',
      userInfo: null,
      platform: 'h5' // 当前运行平台
    }),
    mutations: {
      SET_TOKEN(state, token) {
        state.token = token
        // 跨平台存储同步
        uni.setStorageSync('token', token)
      },
      SET_USER_INFO(state, info) {
        state.userInfo = info
      },
      SET_PLATFORM(state, platform) {
        state.platform = platform
      }
    },
    actions: {
      async login({ commit, dispatch }, credentials) {
        try {
          const res = await uni.request({
            url: '/api/login',
            method: 'POST',
            data: credentials
          })
          
          commit('SET_TOKEN', res.data.token)
          commit('SET_USER_INFO', res.data.userInfo)
          
          // 触发跨平台同步
          await dispatch('syncToAllPlatforms')
          
          return res.data
        } catch (error) {
          throw new Error('登录失败')
        }
      }
    }
  }
}

export default new Vuex.Store({
  modules,
  plugins: [
    createPersistedState(),
    createPlatformAdapter()
  ]
})

二、跨平台数据同步核心实现

构建智能数据同步层,解决多端数据一致性问题:

// utils/sync-manager.js
class SyncManager {
  constructor() {
    this.syncQueue = []
    this.isSyncing = false
    this.syncHandlers = new Map()
    this.initPlatformDetection()
  }

  // 平台检测与适配
  initPlatformDetection() {
    this.currentPlatform = this.detectPlatform()
    this.registerPlatformHandlers()
  }

  detectPlatform() {
    // 检测当前运行平台
    const systemInfo = uni.getSystemInfoSync()
    if (systemInfo.platform === 'ios' || systemInfo.platform === 'android') {
      return 'app'
    } else if (systemInfo.platform === 'devtools') {
      return 'mp-weixin'
    } else {
      return 'h5'
    }
  }

  // 注册平台特定的同步处理器
  registerPlatformHandlers() {
    // App端使用本地存储 + SQLite
    if (this.currentPlatform === 'app') {
      this.syncHandlers.set('app', {
        save: async (key, data) => {
          const db = uni.getStorageSync('local_db')
          if (db) {
            await db.executeSql(`REPLACE INTO sync_data VALUES (?, ?)`, [key, JSON.stringify(data)])
          }
          uni.setStorageSync(key, data)
        },
        load: async (key) => {
          const db = uni.getStorageSync('local_db')
          if (db) {
            const result = await db.executeSql(`SELECT value FROM sync_data WHERE key = ?`, [key])
            if (result.rows.length > 0) {
              return JSON.parse(result.rows.item(0).value)
            }
          }
          return uni.getStorageSync(key)
        }
      })
    }

    // 小程序端使用云开发数据库
    if (this.currentPlatform === 'mp-weixin') {
      this.syncHandlers.set('mp', {
        save: async (key, data) => {
          const db = wx.cloud.database()
          await db.collection('sync_cache').doc(key).set({
            data: data,
            updateTime: db.serverDate()
          })
        },
        load: async (key) => {
          const db = wx.cloud.database()
          const res = await db.collection('sync_cache').doc(key).get()
          return res.data.data
        }
      })
    }
  }

  // 智能同步策略
  async smartSync(dataKey, data, options = {}) {
    const syncJob = {
      key: dataKey,
      data: data,
      priority: options.priority || 'normal',
      timestamp: Date.now(),
      retryCount: 0
    }

    this.syncQueue.push(syncJob)
    this.syncQueue.sort((a, b) => {
      // 按优先级和时效性排序
      const priorityMap = { high: 3, normal: 2, low: 1 }
      return (priorityMap[b.priority] - priorityMap[a.priority]) || 
             (b.timestamp - a.timestamp)
    })

    if (!this.isSyncing) {
      this.processSyncQueue()
    }
  }

  async processSyncQueue() {
    this.isSyncing = true
    
    while (this.syncQueue.length > 0) {
      const job = this.syncQueue.shift()
      
      try {
        await this.executeSync(job)
        console.log(`同步成功: ${job.key}`)
      } catch (error) {
        console.error(`同步失败: ${job.key}`, error)
        
        // 重试逻辑
        if (job.retryCount  setTimeout(resolve, ms))
  }

  handleSyncFailure(job, error) {
    // 失败处理:记录日志、通知用户等
    uni.showToast({
      title: '数据同步失败',
      icon: 'none',
      duration: 2000
    })
    
    // 保存到失败队列,等待网络恢复后重试
    const failedJobs = uni.getStorageSync('failed_sync_jobs') || []
    failedJobs.push(job)
    uni.setStorageSync('failed_sync_jobs', failedJobs)
  }
}

export default new SyncManager()

三、高性能状态缓存策略

实现智能缓存机制,提升应用响应速度:

// utils/cache-manager.js
class CacheManager {
  constructor() {
    this.cache = new Map()
    this.maxSize = 100 // 最大缓存条目数
    this.ttl = 5 * 60 * 1000 // 默认5分钟过期
    this.initCacheCleanup()
  }

  // 设置缓存
  set(key, value, options = {}) {
    const cacheItem = {
      value: value,
      timestamp: Date.now(),
      ttl: options.ttl || this.ttl,
      accessCount: 0,
      lastAccessed: Date.now()
    }

    // LRU缓存淘汰策略
    if (this.cache.size >= this.maxSize) {
      this.evictLRU()
    }

    this.cache.set(key, cacheItem)
    
    // 跨平台存储
    this.persistToStorage(key, cacheItem)
    
    return value
  }

  // 获取缓存
  get(key) {
    if (!this.cache.has(key)) {
      // 尝试从持久化存储加载
      const stored = this.loadFromStorage(key)
      if (stored) {
        this.cache.set(key, stored)
      } else {
        return null
      }
    }

    const item = this.cache.get(key)
    
    // 检查是否过期
    if (Date.now() - item.timestamp > item.ttl) {
      this.cache.delete(key)
      uni.removeStorageSync(`cache_${key}`)
      return null
    }

    // 更新访问统计
    item.accessCount++
    item.lastAccessed = Date.now()
    
    // 调整缓存位置(LRU)
    this.cache.delete(key)
    this.cache.set(key, item)

    return item.value
  }

  // 智能获取:先查缓存,没有再请求
  async smartGet(key, fetchFn, options = {}) {
    // 1. 检查缓存
    const cached = this.get(key)
    if (cached && !options.forceRefresh) {
      return cached
    }

    // 2. 执行请求
    try {
      const data = await fetchFn()
      
      // 3. 缓存结果
      this.set(key, data, options)
      
      // 4. 预加载相关数据
      if (options.prefetch) {
        this.prefetchRelatedData(data, key)
      }
      
      return data
    } catch (error) {
      // 5. 降级策略:返回过期的缓存数据
      if (cached && options.fallbackToStale) {
        console.warn('使用过期缓存数据作为降级方案')
        return cached
      }
      throw error
    }
  }

  // LRU淘汰算法
  evictLRU() {
    let lruKey = null
    let lruTime = Infinity

    for (const [key, item] of this.cache.entries()) {
      if (item.lastAccessed  {
          try {
            const relatedData = await this.fetchRelatedData(relatedKey)
            this.set(relatedKey, relatedData, { ttl: this.ttl * 2 })
          } catch (error) {
            console.warn(`预加载 ${relatedKey} 失败:`, error)
          }
        }, 0)
      }
    }
  }

  // 持久化存储
  persistToStorage(key, item) {
    try {
      uni.setStorageSync(`cache_${key}`, {
        value: item.value,
        timestamp: item.timestamp,
        ttl: item.ttl
      })
    } catch (error) {
      console.warn('缓存持久化失败:', error)
    }
  }

  loadFromStorage(key) {
    try {
      const stored = uni.getStorageSync(`cache_${key}`)
      if (stored) {
        return {
          ...stored,
          accessCount: 0,
          lastAccessed: Date.now()
        }
      }
    } catch (error) {
      console.warn('缓存加载失败:', error)
    }
    return null
  }

  // 定期清理过期缓存
  initCacheCleanup() {
    setInterval(() => {
      this.cleanupExpired()
    }, 60 * 1000) // 每分钟清理一次
  }

  cleanupExpired() {
    const now = Date.now()
    for (const [key, item] of this.cache.entries()) {
      if (now - item.timestamp > item.ttl) {
        this.cache.delete(key)
        uni.removeStorageSync(`cache_${key}`)
      }
    }
  }
}

export default new CacheManager()

四、实战案例:电商购物车多端同步

实现一个完整的跨平台购物车系统:

// store/modules/cart.js
export default {
  namespaced: true,
  
  state: () => ({
    items: [],
    selectedItems: [],
    lastSyncTime: null,
    syncStatus: 'idle', // idle, syncing, error
    platformSpecificData: {
      h5: { discount: 0 },
      app: { points: 0 },
      mp: { coupon: null }
    }
  }),

  getters: {
    totalPrice(state) {
      return state.items.reduce((sum, item) => {
        return sum + (item.price * item.quantity)
      }, 0)
    },

    selectedTotal(state) {
      return state.selectedItems.reduce((sum, item) => {
        return sum + (item.price * item.quantity)
      }, 0)
    },

    // 平台特定的计算属性
    platformPrice(state, getters, rootState) {
      const platform = rootState.user.platform
      const basePrice = getters.totalPrice
      
      switch(platform) {
        case 'app':
          return basePrice - state.platformSpecificData.app.points
        case 'mp':
          return state.platformSpecificData.mp.coupon 
            ? basePrice * 0.9 
            : basePrice
        default:
          return basePrice - state.platformSpecificData.h5.discount
      }
    }
  },

  mutations: {
    ADD_ITEM(state, product) {
      const existingItem = state.items.find(item => item.id === product.id)
      
      if (existingItem) {
        existingItem.quantity += product.quantity || 1
      } else {
        state.items.push({
          ...product,
          quantity: product.quantity || 1,
          addedTime: Date.now(),
          platform: state.platform
        })
      }
      
      // 标记需要同步
      state.syncStatus = 'pending'
    },

    REMOVE_ITEM(state, itemId) {
      state.items = state.items.filter(item => item.id !== itemId)
      state.syncStatus = 'pending'
    },

    UPDATE_QUANTITY(state, { itemId, quantity }) {
      const item = state.items.find(item => item.id === itemId)
      if (item) {
        item.quantity = quantity
        state.syncStatus = 'pending'
      }
    },

    SET_SYNC_STATUS(state, status) {
      state.syncStatus = status
      if (status === 'synced') {
        state.lastSyncTime = Date.now()
      }
    },

    MERGE_CART(state, remoteCart) {
      // 智能合并本地和远程购物车数据
      const mergedItems = [...state.items]
      
      remoteCart.items.forEach(remoteItem => {
        const localIndex = mergedItems.findIndex(localItem => 
          localItem.id === remoteItem.id
        )
        
        if (localIndex === -1) {
          // 远程有本地没有,添加
          mergedItems.push(remoteItem)
        } else {
          // 合并策略:取最新修改
          const localItem = mergedItems[localIndex]
          if (remoteItem.updatedAt > localItem.updatedAt) {
            mergedItems[localIndex] = remoteItem
          }
        }
      })
      
      state.items = mergedItems
    }
  },

  actions: {
    async addToCart({ commit, dispatch, rootState }, product) {
      // 1. 更新本地状态
      commit('ADD_ITEM', product)
      
      // 2. 立即反馈给用户
      uni.showToast({
        title: '已加入购物车',
        icon: 'success'
      })
      
      // 3. 异步同步到服务器和其他平台
      dispatch('syncCart')
      
      // 4. 平台特定处理
      const platform = rootState.user.platform
      if (platform === 'app') {
        // App端:触发震动反馈
        uni.vibrateShort()
      } else if (platform === 'mp') {
        // 小程序:更新徽标
        const cartCount = this.getters['cart/itemCount']
        uni.setTabBarBadge({
          index: 2,
          text: cartCount.toString()
        })
      }
    },

    async syncCart({ state, commit, rootState }) {
      commit('SET_SYNC_STATUS', 'syncing')
      
      try {
        // 获取当前平台
        const platform = rootState.user.platform
        
        // 构建同步数据
        const syncData = {
          items: state.items,
          platform: platform,
          timestamp: Date.now(),
          userId: rootState.user.userInfo?.id
        }
        
        // 使用同步管理器
        await syncManager.smartSync('cart_data', syncData, {
          priority: 'high',
          retry: 3
        })
        
        // 同步成功
        commit('SET_SYNC_STATUS', 'synced')
        
        // 触发跨平台更新事件
        uni.$emit('cart-updated', syncData)
        
      } catch (error) {
        commit('SET_SYNC_STATUS', 'error')
        console.error('购物车同步失败:', error)
        
        // 失败重试机制
        setTimeout(() => {
          this.dispatch('cart/syncCart')
        }, 5000)
      }
    },

    async loadCart({ commit, rootState }) {
      // 智能加载:先本地,后远程
      const platform = rootState.user.platform
      
      // 1. 尝试从缓存加载
      const cachedCart = cacheManager.get(`cart_${platform}`)
      if (cachedCart) {
        commit('MERGE_CART', cachedCart)
      }
      
      // 2. 从服务器加载最新数据
      try {
        const response = await uni.request({
          url: '/api/cart',
          header: {
            'Authorization': `Bearer ${rootState.user.token}`
          }
        })
        
        if (response.data) {
          commit('MERGE_CART', response.data)
          
          // 3. 缓存结果
          cacheManager.set(`cart_${platform}`, response.data, {
            ttl: 10 * 60 * 1000 // 10分钟
          })
        }
      } catch (error) {
        console.warn('加载购物车失败,使用缓存数据:', error)
      }
      
      // 3. 触发同步
      this.dispatch('cart/syncCart')
    },

    // 批量操作优化
    async batchUpdate({ commit, dispatch }, updates) {
      // 使用防抖优化频繁更新
      clearTimeout(this.batchTimer)
      
      this.batchTimer = setTimeout(async () => {
        // 执行批量更新
        updates.forEach(update => {
          if (update.type === 'add') {
            commit('ADD_ITEM', update.data)
          } else if (update.type === 'update') {
            commit('UPDATE_QUANTITY', update.data)
          } else if (update.type === 'remove') {
            commit('REMOVE_ITEM', update.data)
          }
        })
        
        // 批量同步
        await dispatch('syncCart')
      }, 300) // 300ms防抖
    }
  }
}

// 页面组件中使用
export default {
  computed: {
    ...mapState('cart', ['items', 'syncStatus']),
    ...mapGetters('cart', ['totalPrice', 'platformPrice'])
  },
  
  methods: {
    ...mapActions('cart', ['addToCart', 'batchUpdate']),
    
    async handleAddProduct(product) {
      // 添加平台特定信息
      const platformProduct = {
        ...product,
        platform: this.platform,
        addedFrom: this.$route.path
      }
      
      await this.addToCart(platformProduct)
    },
    
    // 监听跨平台同步事件
    initSyncListener() {
      uni.$on('cart-updated', (data) => {
        if (data.platform !== this.platform) {
          // 其他平台更新了购物车,合并数据
          this.$store.commit('cart/MERGE_CART', data)
        }
      })
    }
  },
  
  onLoad() {
    // 加载购物车数据
    this.$store.dispatch('cart/loadCart')
    this.initSyncListener()
  },
  
  onUnload() {
    uni.$off('cart-updated')
  }
}

五、性能监控与优化

实现状态管理的性能监控系统:

// utils/performance-monitor.js
class PerformanceMonitor {
  constructor() {
    this.metrics = {
      stateUpdates: 0,
      syncOperations: 0,
      cacheHits: 0,
      cacheMisses: 0,
      syncLatency: [],
      renderTime: []
    }
    
    this.thresholds = {
      slowSync: 1000, // 1秒
      slowRender: 100, // 100毫秒
      highMemory: 50 * 1024 * 1024 // 50MB
    }
    
    this.initMonitoring()
  }

  initMonitoring() {
    // 监听Vuex mutations
    this.interceptVuex()
    
    // 监听同步操作
    this.monitorSyncOperations()
    
    // 内存监控
    this.monitorMemory()
    
    // 渲染性能监控
    this.monitorRenderPerformance()
  }

  interceptVuex() {
    const originalCommit = this.$store.commit
    this.$store.commit = function(type, payload) {
      const startTime = performance.now()
      
      // 记录状态更新
      this.metrics.stateUpdates++
      
      // 执行原始commit
      const result = originalCommit.call(this, type, payload)
      
      const duration = performance.now() - startTime
      
      // 记录慢操作
      if (duration > this.thresholds.slowRender) {
        this.logSlowOperation('mutation', type, duration)
      }
      
      return result
    }.bind(this)
  }

  monitorSyncOperations() {
    const originalSync = syncManager.smartSync
    syncManager.smartSync = async function(key, data, options) {
      const startTime = performance.now()
      
      this.metrics.syncOperations++
      
      try {
        const result = await originalSync.call(this, key, data, options)
        
        const duration = performance.now() - startTime
        this.metrics.syncLatency.push(duration)
        
        if (duration > this.thresholds.slowSync) {
          this.logSlowOperation('sync', key, duration)
        }
        
        return result
      } catch (error) {
        this.logError('sync', key, error)
        throw error
      }
    }.bind(this)
  }

  monitorMemory() {
    if (uni.getStorageInfoSync) {
      setInterval(() => {
        const storageInfo = uni.getStorageInfoSync()
        const usedSize = storageInfo.currentSize
        
        if (usedSize > this.thresholds.highMemory) {
          this.logMemoryWarning(usedSize)
          
          // 自动清理旧缓存
          cacheManager.cleanupExpired()
        }
      }, 30000) // 每30秒检查一次
    }
  }

  monitorRenderPerformance() {
    let renderStartTime = 0
    
    // 监听页面渲染
    const originalSetData = this.$scope?.setData || function() {}
    this.$scope.setData = function(data, callback) {
      renderStartTime = performance.now()
      
      originalSetData.call(this, data, () => {
        const renderTime = performance.now() - renderStartTime
        this.metrics.renderTime.push(renderTime)
        
        if (renderTime > this.thresholds.slowRender) {
          this.logSlowOperation('render', 'setData', renderTime)
        }
        
        callback && callback()
      })
    }.bind(this)
  }

  logSlowOperation(type, key, duration) {
    const logEntry = {
      type,
      key,
      duration,
      timestamp: new Date().toISOString(),
      platform: this.currentPlatform
    }
    
    console.warn('慢操作警告:', logEntry)
    
    // 发送到监控服务器
    this.reportToServer('slow_operation', logEntry)
  }

  logError(type, key, error) {
    const errorEntry = {
      type,
      key,
      error: error.message,
      stack: error.stack,
      timestamp: new Date().toISOString()
    }
    
    console.error('操作错误:', errorEntry)
    
    // 错误上报
    this.reportToServer('error', errorEntry)
  }

  logMemoryWarning(usedSize) {
    console.warn(`内存使用过高: ${(usedSize / 1024 / 1024).toFixed(2)}MB`)
    
    // 触发内存清理
    uni.$emit('memory-warning', { usedSize })
  }

  async reportToServer(event, data) {
    try {
      await uni.request({
        url: '/api/monitor/report',
        method: 'POST',
        data: {
          event,
          data,
          appVersion: this.getAppVersion(),
          platform: this.currentPlatform
        }
      })
    } catch (error) {
      console.warn('监控数据上报失败:', error)
    }
  }

  getAppVersion() {
    // 获取应用版本信息
    const manifest = require('@/manifest.json')
    return manifest.versionName || '1.0.0'
  }

  // 生成性能报告
  generateReport() {
    const avgSyncLatency = this.metrics.syncLatency.length > 0
      ? this.metrics.syncLatency.reduce((a, b) => a + b, 0) / this.metrics.syncLatency.length
      : 0
    
    const avgRenderTime = this.metrics.renderTime.length > 0
      ? this.metrics.renderTime.reduce((a, b) => a + b, 0) / this.metrics.renderTime.length
      : 0
    
    const cacheHitRate = this.metrics.cacheHits / (this.metrics.cacheHits + this.metrics.cacheMisses) || 0
    
    return {
      summary: {
        stateUpdates: this.metrics.stateUpdates,
        syncOperations: this.metrics.syncOperations,
        avgSyncLatency: avgSyncLatency.toFixed(2),
        avgRenderTime: avgRenderTime.toFixed(2),
        cacheHitRate: (cacheHitRate * 100).toFixed(1) + '%',
        timestamp: new Date().toISOString()
      },
      recommendations: this.generateRecommendations()
    }
  }

  generateRecommendations() {
    const recommendations = []
    
    if (this.metrics.syncLatency.some(latency => latency > 1000)) {
      recommendations.push('检测到慢同步操作,建议优化网络请求或减少同步数据量')
    }
    
    if (this.metrics.cacheMisses > this.metrics.cacheHits * 2) {
      recommendations.push('缓存命中率较低,建议调整缓存策略或增加缓存容量')
    }
    
    return recommendations
  }
}

export default new PerformanceMonitor()

六、最佳实践总结

  1. 分层架构设计:将状态管理分为本地状态、同步层、持久化层
  2. 智能同步策略:根据网络状况和平台特性选择最优同步方式
  3. 缓存优化:实现多级缓存,平衡内存使用和访问速度
  4. 错误恢复机制:设计完善的错误处理和重试逻辑
  5. 性能监控:实时监控状态管理性能,及时发现问题
  6. 平台适配:针对不同平台特性进行优化

七、扩展与优化方向

  • 离线优先架构:设计完整的离线工作模式
  • 增量同步:实现数据变化的增量更新
  • 冲突解决策略:完善多端数据冲突的自动解决机制
  • 预测性加载:基于用户行为预测并预加载数据
  • A/B测试集成:支持状态管理的A/B测试

结语

UniApp跨平台状态管理是一个系统工程,需要综合考虑数据一致性、性能优化、用户体验等多方面因素。本文提出的架构方案通过分层设计、智能同步、性能监控等策略,为构建高性能的跨平台应用提供了完整解决方案。

在实际项目中,应根据具体业务需求调整和优化这些方案,持续监控和迭代,才能构建出真正优秀的跨平台应用。

// 页面交互功能
document.addEventListener(‘DOMContentLoaded’, function() {
// 代码块交互增强
const codeBlocks = document.querySelectorAll(‘pre code’);

codeBlocks.forEach((block, index) => {
// 添加行号
const lines = block.textContent.split(‘n’);
const numbered = lines.map((line, i) =>
`
${i + 1}
${escapeHtml(line)}
`
).join(”);

block.innerHTML = numbered;

// 点击复制功能
block.addEventListener(‘click’, async function() {
const text = lines.join(‘n’);
try {
await navigator.clipboard.writeText(text);
const original = block.innerHTML;
block.innerHTML = ‘✓ 代码已复制到剪贴板‘;
setTimeout(() => block.innerHTML = original, 1500);
} catch (err) {
console.log(‘复制失败:’, err);
}
});

block.title = “点击复制代码”;
block.style.cursor = “pointer”;
block.style.backgroundColor = “#f6f8fa”;
block.style.padding = “12px”;
block.style.borderRadius = “6px”;
block.style.display = “block”;
block.style.overflow = “auto”;
});

function escapeHtml(text) {
const div = document.createElement(‘div’);
div.textContent = text;
return div.innerHTML;
}

// 语法高亮
const vueKeywords = [‘export default’, ‘state’, ‘mutations’, ‘actions’, ‘getters’, ‘commit’, ‘dispatch’, ‘mapState’, ‘mapGetters’, ‘mapActions’];
const jsKeywords = [‘const’, ‘let’, ‘async’, ‘await’, ‘class’, ‘function’, ‘return’, ‘new’, ‘try’, ‘catch’, ‘throw’, ‘import’, ‘from’];

codeBlocks.forEach(block => {
let html = block.innerHTML;

// Vuex相关关键词
vueKeywords.forEach(keyword => {
const regex = new RegExp(`\b${keyword}\b`, ‘g’);
html = html.replace(regex, `${keyword}`);
});

// JavaScript关键词
jsKeywords.forEach(keyword => {
const regex = new RegExp(`\b${keyword}\b`, ‘g’);
html = html.replace(regex, `${keyword}`);
});

// 字符串高亮
html = html.replace(/(‘.*?’|”.*?”)/g, ‘$1‘);

// 注释高亮
html = html.replace(///.*$/gm, ‘$&‘);

// 数字高亮
html = html.replace(/b(d+)b/g, ‘$1‘);

block.innerHTML = html;
});

// 章节导航
const sections = document.querySelectorAll(‘section h2’);
if (sections.length > 0) {
const nav = document.createElement(‘div’);
nav.innerHTML = ‘

文章目录

‘;

const firstSection = document.querySelector(‘section’);
firstSection.parentNode.insertBefore(nav, firstSection);

// 添加ID到章节
sections.forEach((h2, i) => {
h2.id = `section-${i}`;
});
}
});

UniApp跨平台状态管理深度实践:构建高性能多端同步架构 | 前端开发教程
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

淘吗网 uniapp UniApp跨平台状态管理深度实践:构建高性能多端同步架构 | 前端开发教程 https://www.taomawang.com/web/uniapp/1657.html

常见问题

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务