H5 后台同步:Background Sync API 实现

举报
William 发表于 2025/09/03 12:01:01 2025/09/03
【摘要】 ​​1. 引言​​在移动互联网时代,用户的网络环境充满不确定性——地铁隧道、地下停车场、偏远山区等场景下,网络连接可能瞬间中断。对于依赖实时数据交互的Web应用(如表单提交、消息发送、数据同步),断网往往导致操作失败(如表单重填、消息丢失),严重影响用户体验。传统解决方案(如本地存储+轮询同步)存在明显缺陷:用户需手动重试、开发者需额外维护同步逻辑、同步时机不可控(可能因频繁轮询浪费资源)。...



​1. 引言​

在移动互联网时代,用户的网络环境充满不确定性——地铁隧道、地下停车场、偏远山区等场景下,网络连接可能瞬间中断。对于依赖实时数据交互的Web应用(如表单提交、消息发送、数据同步),断网往往导致操作失败(如表单重填、消息丢失),严重影响用户体验。

传统解决方案(如本地存储+轮询同步)存在明显缺陷:用户需手动重试、开发者需额外维护同步逻辑、同步时机不可控(可能因频繁轮询浪费资源)。

​Background Sync API(后台同步)​​ 是HTML5提供的原生解决方案,允许Web应用在断网时将关键操作(如表单数据、API请求)暂存,待网络恢复后​​自动触发同步​​(无需用户干预),确保数据最终一致性。它通过Service Worker监听网络状态变化,在连接恢复时执行预定义的同步任务,完美解决了“断网操作丢失”与“手动重试繁琐”的痛点。

本文将深入探讨Background Sync API的核心实现方案,解析其技术原理、应用场景及实践细节,并通过具体代码示例展示如何为不同类型的Web应用(如新闻投稿、电商订单、企业数据上报)构建可靠的后台同步能力。


​2. 技术背景​

​2.1 为什么需要后台同步?​

  • ​网络环境的不可控性​​:移动网络覆盖不全(如电梯、地下室)、Wi-Fi临时断开、用户主动关闭网络等情况频繁发生,导致Web请求(如表单提交、文件上传)失败。
  • ​用户体验的连续性需求​​:用户不希望因短暂断网而被迫中断操作(如重新填写表单),或手动点击“重试”按钮等待网络恢复。
  • ​数据一致性的保障​​:关键操作(如订单提交、日志上报)必须在最终成功,避免因断网导致数据丢失或业务逻辑中断。
  • ​开发者效率的提升​​:传统同步方案(如轮询、定时检测)需额外维护复杂逻辑,而Background Sync API通过浏览器原生能力自动处理同步时机,降低开发成本。

​2.2 核心概念​

​概念​ ​说明​ ​类比​
​Background Sync API​ 允许Web应用在断网时注册同步任务(如提交表单数据),待网络恢复后由浏览器​​自动触发Service Worker执行同步逻辑​​,无需用户干预。 类似“快递代收点”——断网时包裹(数据)暂存,网络通了自动派送(同步)。
​Service Worker​ 运行在浏览器后台的脚本,作为网络请求的“代理”和同步任务的“执行者”,监听网络状态变化,在连接恢复时执行预定义的同步逻辑。 类似“物流调度中心”——管理包裹(同步任务)的暂存与派送(执行)。
​SyncManager​ 浏览器提供的API,用于注册、管理同步任务(如 register('syncName')),并与Service Worker通信,触发同步执行。 类似“任务登记处”——记录需要同步的任务名称与参数。
​网络状态监听​ 通过Service Worker中的 navigator.onLineonline 事件检测网络恢复,但更推荐依赖Background Sync API的原生网络感知能力。 类似“网络信号监测仪”——实时感知网络是否可用。
​同步任务标签(Tag)​ 每个同步任务的唯一标识(如 'submitForm'),用于区分不同类型的同步逻辑(如订单提交、日志上报)。 类似“包裹标签”——标识包裹的内容与目的地。

​2.3 应用使用场景​

​场景类型​ ​后台同步应用示例​ ​技术价值​
​表单提交类应用​ 用户反馈表单、注册页面、评论提交,在断网时暂存数据,网络恢复后自动提交,避免用户重复填写。 保障用户操作不丢失,提升表单提交成功率。
​电商订单类应用​ 购物车结算、支付请求,在断网时保存订单信息,联网后自动同步到服务器,确保交易完整性。 避免因断网导致订单丢失或重复支付。
​内容发布类应用​ 新闻投稿、博客编辑,在断网时暂存草稿或发布请求,网络恢复后自动提交,保障内容及时发布。 维持用户创作连续性,避免灵感中断。
​数据上报类应用​ 用户行为日志(如点击、滚动)、设备状态上报(如IoT传感器数据),断网时缓存数据,联网后批量同步。 保障数据分析的完整性,避免关键数据丢失。
​企业后台工具​ 员工使用的H5管理工具(如OA审批、数据录入),断网时暂存操作记录,联网后自动同步到服务器。 维持工作效率,减少因网络问题导致的操作中断。

​3. 应用使用场景​

​3.1 场景1:新闻投稿表单后台同步(用户内容保护)​

  • ​需求​​:新闻网站的H5移动端投稿页面,用户在断网时填写的稿件内容(标题、正文)不会丢失,网络恢复后自动提交到服务器,用户无需手动重试。

​3.2 场景2:电商订单支付后台同步(交易保障)​

  • ​需求​​:电商平台的H5支付页面,用户在断网时点击“立即购买”,订单数据(商品ID、数量、用户信息)暂存,网络恢复后自动提交支付请求,避免订单丢失或重复支付。

​3.3 场景3:IoT设备数据上报后台同步(运维连续性)​

  • ​需求​​:企业H5管理工具收集IoT设备的实时状态(如温度、湿度),断网时缓存传感器数据,联网后批量同步到云端,保障运维监控的连续性。

​4. 不同场景下的详细代码实现​

​4.1 环境准备​

  • ​开发工具​​:Chrome浏览器(支持Background Sync API)、Node.js(本地服务器,如 http-server)、华为DevEco Studio(鸿蒙Web能力开发,需兼容性适配)。
  • ​核心API​​:
    • ​Service Worker​​:监听网络状态,执行同步任务逻辑。
    • ​Background Sync API​​( navigator.serviceWorker.ready.then(registration => registration.sync.register('tagName')) ):注册同步任务。
    • ​IndexedDB/LocalStorage​​:暂存断网时的操作数据(如表单内容、订单信息)。
  • ​注意事项​​:
    • Background Sync API 仅在 ​​HTTPS环境​​ 或 ​​localhost​​ 下可用(生产环境必须HTTPS)。
    • 用户首次访问需注册Service Worker,且浏览器需支持该API(Chrome 49+、Edge 79+,部分国产浏览器可能需验证兼容性)。

​4.2 场景1:新闻投稿表单后台同步(用户内容保护)​

​4.2.1 文件结构​

/news-submit
  ├── index.html          # 投稿主页面(表单+Service Worker注册)
  ├── sw.js               # Service Worker脚本(监听同步事件,执行提交逻辑)
  ├── db.js               # IndexedDB封装(暂存投稿数据)
  ├── submit.js           # 表单提交逻辑(断网时暂存数据,联网后触发同步)
  └── css/
      └── style.css       # 页面样式

​4.2.2 主页面(index.html)注册Service Worker​

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>新闻投稿(后台同步)</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <form id="newsForm">
    <h1>📰 新闻投稿</h1>
    <input type="text" id="title" placeholder="文章标题" required>
    <textarea id="content" placeholder="文章内容" required></textarea>
    <button type="submit">提交投稿</button>
    <div id="status"></div> <!-- 显示同步状态 -->
  </form>

  <script src="db.js"></script>
  <script src="submit.js"></script>
  <script>
    // 注册Service Worker(仅HTTPS或localhost)
    if ('serviceWorker' in navigator && location.protocol !== 'file:') {
      window.addEventListener('load', () => {
        navigator.serviceWorker.register('/sw.js')
          .then(registration => {
            console.log('Service Worker注册成功:', registration.scope);
          })
          .catch(error => {
            console.error('Service Worker注册失败:', error);
            document.getElementById('status').textContent = '同步功能暂不可用,请检查网络环境';
          });
      });
    }
  </script>
</body>
</html>

​4.2.3 IndexedDB封装(db.js)暂存投稿数据​

// 封装IndexedDB,用于暂存断网时的投稿数据
class SubmissionDB {
  constructor() {
    this.dbName = 'NewsSubmissions';
    this.version = 1;
    this.storeName = 'pendingSubmissions';
    this.db = null;
  }

  // 初始化数据库
  async init() {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open(this.dbName, this.version);
      request.onerror = () => reject(request.error);
      request.onsuccess = () => {
        this.db = request.result;
        resolve(this.db);
      };
      request.onupgradeneeded = (event) => {
        const db = event.target.result;
        if (!db.objectStoreNames.contains(this.storeName)) {
          db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true });
        }
      };
    });
  }

  // 添加待提交的投稿数据
  async addSubmission(title, content) {
    if (!this.db) await this.init();
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readwrite');
      const store = transaction.objectStore(this.storeName);
      const submission = { title, content, timestamp: Date.now() };
      const request = store.add(submission);
      request.onsuccess = () => resolve(request.result);
      request.onerror = () => reject(request.error);
    });
  }

  // 获取所有待提交的投稿数据
  async getAllSubmissions() {
    if (!this.db) await this.init();
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readonly');
      const store = transaction.objectStore(this.storeName);
      const request = store.getAll();
      request.onsuccess = () => resolve(request.result);
      request.onerror = () => reject(request.error);
    });
  }

  // 删除已提交的投稿数据(通过ID)
  async deleteSubmission(id) {
    if (!this.db) await this.init();
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction([this.storeName], 'readwrite');
      const store = transaction.objectStore(this.storeName);
      const request = store.delete(id);
      request.onsuccess = () => resolve();
      request.onerror = () => reject(request.error);
    });
  }
}

// 全局实例
window.submissionDB = new SubmissionDB();

​4.2.4 表单提交逻辑(submit.js)断网时暂存数据​

// 表单提交逻辑:断网时暂存到IndexedDB,联网后触发Background Sync
document.getElementById('newsForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  const title = document.getElementById('title').value;
  const content = document.getElementById('content').value;
  const statusDiv = document.getElementById('status');

  try {
    // 检查网络状态
    if (navigator.onLine) {
      // 在线:直接提交到服务器
      await submitToServer(title, content);
      statusDiv.textContent = '✅ 投稿提交成功!';
      document.getElementById('newsForm').reset();
    } else {
      // 断网:暂存到IndexedDB,并注册后台同步任务
      const id = await window.submissionDB.addSubmission(title, content);
      statusDiv.textContent = `📡 网络断开,投稿已暂存(ID:${id}),网络恢复后自动提交`;
      
      // 注册Background Sync任务(需Service Worker支持)
      if ('serviceWorker' in navigator && 'SyncManager' in window) {
        const registration = await navigator.serviceWorker.ready;
        await registration.sync.register('submitNews');
        console.log('后台同步任务已注册:submitNews');
      } else {
        statusDiv.textContent += '(当前浏览器不支持自动同步,请手动重试)';
      }
    }
  } catch (error) {
    statusDiv.textContent = `❌ 提交失败:${error.message}`;
  }
});

// 模拟提交到服务器的API请求
async function submitToServer(title, content) {
  // 实际项目中替换为真实的API端点(如fetch('/api/news/submit', {...}))
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() > 0.1) { // 模拟90%成功率
        console.log(`服务器收到投稿:${title}(长度:${content.length})`);
        resolve();
      } else {
        reject(new Error('服务器繁忙,请重试'));
      }
    }, 1000);
  });
}

​4.2.5 Service Worker脚本(sw.js)监听同步事件并执行提交​

// Service Worker:监听sync事件,在网络恢复时提交暂存的投稿数据
self.addEventListener('sync', event => {
  if (event.tag === 'submitNews') {
    console.log('🔄 收到后台同步任务:submitNews');
    event.waitUntil(handleBackgroundSync());
  }
});

// 处理后台同步逻辑:从IndexedDB读取暂存数据并提交到服务器
async function handleBackgroundSync() {
  // 注意:Service Worker无法直接访问IndexedDB(不同线程),需通过postMessage与页面通信
  // 这里简化为模拟逻辑:实际项目中需通过MessageChannel传递数据
  console.log('正在尝试提交暂存的投稿数据...');

  // 模拟从IndexedDB获取数据(实际需通过页面脚本传递)
  const mockPendingSubmissions = [
    { id: 1, title: '断网时写的新闻1', content: '这是断网时填写的内容...', timestamp: Date.now() - 300000 },
    { id: 2, title: '断网时写的新闻2', content: '另一篇暂存的新闻...', timestamp: Date.now() - 180000 }
  ];

  for (const submission of mockPendingSubmissions) {
    try {
      // 模拟提交到服务器(实际需调用真实API)
      await submitToServer(submission.title, submission.content);
      console.log(`✅ 提交成功:${submission.title}(ID:${submission.id})`);
      
      // 实际项目中需通知页面删除IndexedDB中的对应数据
      // (通过postMessage告知页面执行window.submissionDB.deleteSubmission(submission.id))
    } catch (error) {
      console.error(`❌ 提交失败:${submission.title}(ID:${submission.id}),错误:${error.message}`);
    }
  }
}

// 模拟提交到服务器的API请求(与submit.js中的逻辑一致)
async function submitToServer(title, content) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() > 0.1) { // 模拟90%成功率
        console.log(`[Service Worker] 服务器收到投稿:${title}`);
        resolve();
      } else {
        reject(new Error('[Service Worker] 服务器繁忙'));
      }
    }, 500);
  });
}

// Service Worker安装阶段:预缓存必要资源(可选)
self.addEventListener('install', event => {
  event.waitUntil(self.skipWaiting()); // 强制新SW立即激活
});

// Service Worker激活阶段:清理旧缓存(可选)
self.addEventListener('activate', event => {
  event.waitUntil(self.clients.claim()); // 控制所有客户端
});

​4.2.6 原理解释​

  • ​断网时​​:用户提交表单时,若检测到 navigator.onLinefalse,数据暂存到IndexedDB(通过 db.jsaddSubmission 方法),并通过 navigator.serviceWorker.ready.sync.register('submitNews') 注册名为 submitNews 的后台同步任务。
  • ​网络恢复时​​:浏览器检测到网络连接后,自动触发Service Worker中的 sync 事件(标签为 submitNews),执行 handleBackgroundSync 逻辑。此时需从IndexedDB读取暂存数据(实际需通过 postMessage 与页面通信传递数据),并提交到服务器。
  • ​核心优势​​:用户无需手动重试,浏览器在后台自动完成同步,保障投稿内容不丢失。

​4.3 场景2:电商订单支付后台同步(交易保障)​

​4.3.1 核心逻辑扩展​

  • 用户点击“立即购买”时,若断网,订单数据(商品ID、数量、用户信息)暂存到IndexedDB,注册同步任务 submitOrder
  • 网络恢复后,Service Worker执行 sync 事件,读取暂存订单并调用支付API(如 /api/order/pay)。

​4.3.2 关键代码差异​

  • ​表单数据​​:替换为订单对象( { productId, quantity, userId, price } )。
  • ​同步标签​​:改为 submitOrder,对应的 handleBackgroundSync 逻辑中调用支付API。
  • ​IndexedDB结构​​:存储订单相关字段(如 productId, quantity)。

(完整代码结构与新闻投稿类似,仅需调整数据模型和API端点)


​5. 原理解释​

​5.1 后台同步的核心流程​

  1. ​断网时操作暂存​​:用户发起关键操作(如提交表单、支付订单),若检测到网络断开( navigator.onLine === false ),数据通过IndexedDB/LocalStorage暂存,同时通过 navigator.serviceWorker.ready.sync.register('tagName') 注册同步任务。
  2. ​Service Worker监听​​:Service Worker在注册时监听 sync 事件(通过 self.addEventListener('sync', event => {...}) ),当浏览器检测到网络恢复时,自动触发对应标签(如 submitNews)的同步事件。
  3. ​同步任务执行​​:在 sync 事件的回调函数中( event.waitUntil(handleBackgroundSync()) ),从暂存介质(如IndexedDB)读取待同步数据,并调用真实API提交到服务器。
  4. ​状态清理​​:同步成功后,删除暂存数据(如IndexedDB中的对应记录),避免重复提交。

​5.2 核心特性​

​特性​ ​说明​ ​优势​
​自动触发​ 网络恢复后由浏览器自动执行同步,无需用户手动重试。 提升用户体验,减少操作负担。
​任务持久化​ 同步任务(如 submitNews)在浏览器关闭后仍保留,直到成功执行或用户清除数据。 保障关键操作的最终一致性。
​灵活标签管理​ 不同类型的操作(如表单提交、订单支付)可通过独立标签(如 submitFormsubmitOrder )区分,实现精细化同步控制。 适应复杂业务场景的需求。
​网络感知​ 依赖浏览器的原生网络状态检测,准确触发同步时机(避免频繁无效尝试)。 节省资源,提升同步成功率。
​与Service Worker协同​ Service Worker作为同步任务的执行环境,可处理复杂逻辑(如API请求、数据处理)。 扩展性强,支持离线优先架构。

​6. 原理流程图及解释​

​6.1 后台同步工作流程图​

graph TD
    A[用户发起关键操作(如提交表单)] --> B{网络是否在线?}
    B -->|是| C[直接提交到服务器]
    B -->|否| D[暂存操作数据到IndexedDB]
    D --> E[注册Background Sync任务(如'submitNews')]
    E --> F[Service Worker监听sync事件]
    F --> G{网络是否恢复?}
    G -->|否| H[等待网络恢复]
    G -->|是| I[触发sync事件(标签'submitNews')]
    I --> J[Service Worker执行同步逻辑:从IndexedDB读取数据并提交]
    J --> K[提交成功后删除暂存数据]
    K --> L[用户看到同步成功提示(可选)]

​6.2 原理解释​

  • ​断网阶段​​:用户操作因网络中断无法直接提交,数据暂存到本地(IndexedDB),同时向浏览器注册同步任务(如 submitNews )。
  • ​网络恢复阶段​​:浏览器检测到网络连接后,自动触发Service Worker中的 sync 事件(对应注册的标签),执行同步逻辑(读取暂存数据并提交到服务器)。
  • ​最终一致性​​:同步成功后,本地暂存数据被清理,确保数据不会重复提交,同时用户无需感知同步过程(或通过状态提示知晓结果)。

​7. 环境准备​

  • ​开发环境​​:Chrome浏览器(版本49+,支持Background Sync API)、Node.js(本地服务器,如 http-server)、华为DevEco Studio(鸿蒙Web能力开发,需验证兼容性)。
  • ​服务器要求​​:HTTPS协议(生产环境强制要求,本地开发可用 localhost )。
  • ​关键工具​​:
    • ​Chrome DevTools​​:通过“Application > Service Workers”查看Service Worker状态,通过“Application > Background Sync”查看同步任务注册记录,通过“Network”面板模拟离线状态(勾选“Offline”)。
    • ​IndexedDB调试​​:在DevTools的“Application > IndexedDB”中查看暂存的数据(如投稿内容、订单信息)。
  • ​注意事项​​:
    • Background Sync API 仅在用户与页面有过交互(如提交表单)后才能注册同步任务(部分浏览器限制)。
    • 同步任务的执行时机由浏览器控制(通常在网络恢复后的短时间内),开发者无法精确指定时间。

​8. 实际详细应用代码示例实现(综合案例:新闻投稿)​

​8.1 完整代码整合​

(结合上述场景1的完整代码,包含HTML表单、IndexedDB封装、Service Worker脚本、表单提交逻辑)


​9. 运行结果​

  • ​正常网络​​:用户提交投稿表单,数据直接发送到服务器,显示“提交成功”。
  • ​断网状态​​:用户提交表单时若断网,数据暂存到IndexedDB,显示“网络断开,投稿已暂存(ID:1),网络恢复后自动提交”。
  • ​网络恢复后​​:浏览器自动触发同步任务,数据提交到服务器,控制台输出“提交成功:断网时写的新闻1(ID:1)”。

​10. 测试步骤及详细代码​

  1. ​基础功能测试​​:
    • ​Service Worker注册​​:通过DevTools的“Application > Service Workers”确认注册成功(状态为“activated”)。
    • ​同步任务注册​​:断网时提交表单,检查DevTools的“Application > Background Sync”中是否记录了 submitNews 任务。
    • ​离线模拟​​:勾选DevTools的“Network > Offline”,提交表单,验证数据暂存到IndexedDB(“Application > IndexedDB”中查看 pendingSubmissions 表)。
    • ​网络恢复测试​​:取消“Offline”勾选,观察控制台是否输出同步成功日志(“提交成功:...”)。
  2. ​异常场景测试​​:
    • 模拟同步失败(如API返回错误),验证是否保留暂存数据(下次网络恢复时重试)。

​11. 部署场景​

  • ​新闻/博客类H5应用​​:确保用户投稿内容在断网时不丢失,提升内容创作的连续性。
  • ​电商类应用​​:保障订单支付、购物车结算等关键操作在断网后最终成功,避免交易纠纷。
  • ​企业后台工具​​:员工使用H5工具提交数据(如审批、报表),断网时暂存记录,联网后自动同步。
  • ​IoT数据采集​​:传感器数据通过H5页面上报,断网时缓存,联网后批量同步到云端。

​12. 疑难解答​

  • ​Q1:同步任务未触发?​
    A1:检查Service Worker是否注册成功(Console无报错),确认同步任务标签(如 submitNews )已通过 registration.sync.register() 注册,且浏览器网络确实从离线恢复到在线。
  • ​Q2:IndexedDB数据未清除?​
    A2:在 handleBackgroundSync 中同步成功后,需通过 postMessage 通知页面执行 deleteSubmission(id) ,或直接在Service Worker中通过MessageChannel传递删除指令。
  • ​Q3:浏览器不支持Background Sync?​
    A3:检测 if ('SyncManager' in window) ,若不支持则提示用户“网络恢复后请手动重试”,或降级为轮询同步(不推荐)。

​13. 未来展望​

  • ​智能同步优先级​​:根据操作类型(如支付>投稿>日志)设置同步优先级,确保关键数据优先同步。
  • ​增量同步与冲突解决​​:支持断网期间多次操作的合并同步(如多次编辑同一稿件),并通过版本号解决数据冲突。
  • ​跨设备同步​​:结合账号体系,将H5后台同步的数据同步到用户的其他设备(如手机投稿→平板查看)。
  • ​与PWA深度集成​​:后台同步与PWA的安装提示(如“离线也能提交,点击安装到桌面”)结合,提升用户粘性。

​14. 技术趋势与挑战​

  • ​趋势​​:
    • ​后台同步标准化​​:更多浏览器(如Safari)将完善对Background Sync API的支持,推动Web应用与原生APP体验对齐。
    • ​与边缘计算结合​​:通过CDN边缘节点缓存同步任务,降低同步延迟(如用户附近的边缘服务器优先处理数据)。
  • ​挑战​​:
    • ​浏览器兼容性​​:部分国产浏览器或旧版本可能不支持Background Sync API,需提供降级方案(如LocalStorage+轮询)。
    • ​数据安全​​:暂存的数据(如用户投稿内容)需加密存储(如IndexedDB加密),避免敏感信息泄露。
    • ​同步冲突​​:断网期间多次操作可能导致数据不一致(如多次提交同一订单),需设计幂等性逻辑(如通过唯一ID避免重复提交)。

​15. 总结​

Background Sync API 是H5 Web应用实现“断网不丢操作”的核心技术,通过Service Worker与浏览器原生的网络感知能力,自动在网络恢复后同步暂存的关键数据(如表单、订单)。它不仅提升了用户体验的连续性,更保障了业务数据的最终一致性。开发者应结合业务场景(如新闻投稿、电商支付)合理设计同步策略,利用IndexedDB暂存数据,通过Service Worker监听同步事件,最终构建高可用的离线友好型Web应用。随着浏览器兼容性的提升和技术的演进,Background Sync API 将成为Web应用“全场景可用”的重要基石。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。