{"versions":{"9.5.3-fix.5":{"name":"@hussar/ext-SDK-ability","version":"9.5.3-fix.5","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.3-fix.5","_integrity":"sha512-jtTe3jiE4UFB9yFo8a8WuOffOiNfQ/bMLW2flJSVRlczCBqSVuVlN6l0Fzcn16XZO0aUFLYIAkMemAYY31/AuA==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.3-fix.5.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.3-fix.5.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-jtTe3jiE4UFB9yFo8a8WuOffOiNfQ/bMLW2flJSVRlczCBqSVuVlN6l0Fzcn16XZO0aUFLYIAkMemAYY31/AuA==","shasum":"d5c7a8f443d5178fdee4d2e1beffa24f9a94b7f6","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.3-fix.5.tgz"},"contributors":[]},"9.5.5-alpha.1":{"name":"@hussar/ext-SDK-ability","version":"9.5.5-alpha.1","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.5-alpha.1","_integrity":"sha512-mEZDvatCEmmVYaDPJ1i+Dq7734HoeWuh+CjA/l4ISnDlBeCJ2LAiu0fLAMWDZdfkxrTcp6lSQIP+drPU7k8D4Q==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.5-alpha.1.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.5-alpha.1.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-mEZDvatCEmmVYaDPJ1i+Dq7734HoeWuh+CjA/l4ISnDlBeCJ2LAiu0fLAMWDZdfkxrTcp6lSQIP+drPU7k8D4Q==","shasum":"a5592e7942720cb5bf93ae8359154544c5ab16f4","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.5-alpha.1.tgz"},"contributors":[]},"9.5.5":{"name":"@hussar/ext-SDK-ability","version":"9.5.5","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.5","_integrity":"sha512-4ij4uWjrLP3IDFdeQ+AT2aau7e1oEaU1THK5W61hH5twXN8Hy29X2NzuvFpCNQjTjSarGtt8nmYonmbwozmMyA==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.5.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.5.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-4ij4uWjrLP3IDFdeQ+AT2aau7e1oEaU1THK5W61hH5twXN8Hy29X2NzuvFpCNQjTjSarGtt8nmYonmbwozmMyA==","shasum":"07b04081cb4bb8c0442f351c983a7153734f67e4","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.5.tgz"},"contributors":[]},"9.5.6":{"name":"@hussar/ext-SDK-ability","version":"9.5.6","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md","package.json"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.6","_integrity":"sha512-WbI10rbfqlPZmZTFZWjXV1cU6pQW5k04b/gZ+EQe2H+Z/7ax9jSPzdEabbNmTpp/lJcUwpkhjbjq9kDKF6eI0g==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.6.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.6.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-WbI10rbfqlPZmZTFZWjXV1cU6pQW5k04b/gZ+EQe2H+Z/7ax9jSPzdEabbNmTpp/lJcUwpkhjbjq9kDKF6eI0g==","shasum":"66d115297355babdbc99578840a561176a569e71","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.6.tgz"},"contributors":[]},"9.5.7":{"name":"@hussar/ext-SDK-ability","version":"9.5.7","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md","package.json"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.7","_integrity":"sha512-OvGccRqWfrnEm9mQYTmU8tXUncHzjTeY1oJSsVhwRy+GDaxdf7L/cIoSEjepX0zdv7G66JUcr32o75gVNHrloQ==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.7.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.7.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-OvGccRqWfrnEm9mQYTmU8tXUncHzjTeY1oJSsVhwRy+GDaxdf7L/cIoSEjepX0zdv7G66JUcr32o75gVNHrloQ==","shasum":"d9c314a770b8e62a6fede24078b266353946d765","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.7.tgz"},"contributors":[]},"9.5.8":{"name":"@hussar/ext-SDK-ability","version":"9.5.8","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md","package.json"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.8","_integrity":"sha512-fjiyMTRQoim/Gt84QTEuUOTxVxlBmre+5VBb5p8pca0b4GWc+qJ3wiZ7Ys6Xi7+tf0FBE2aR02O5SbAWccbJvg==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.8.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.8.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-fjiyMTRQoim/Gt84QTEuUOTxVxlBmre+5VBb5p8pca0b4GWc+qJ3wiZ7Ys6Xi7+tf0FBE2aR02O5SbAWccbJvg==","shasum":"3d11a52bbe00bdfdfb206c6d31c8bff284ad9a62","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.8.tgz"},"contributors":[]},"9.5.9":{"name":"@hussar/ext-SDK-ability","version":"9.5.9","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md","package.json"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.5.9","_integrity":"sha512-9WdC+iRP8TGhLRjxJM1w7iylqwYS5yNpvZtxQ1pwnjWXz8tP3L2zeXbTAwHU/+3bCFqX4cCfewdtStBRvDfEUA==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.9.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.5.9.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-9WdC+iRP8TGhLRjxJM1w7iylqwYS5yNpvZtxQ1pwnjWXz8tP3L2zeXbTAwHU/+3bCFqX4cCfewdtStBRvDfEUA==","shasum":"fc2dfa105c2f208afaabad2bc0982d1df0b0d49c","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.5.9.tgz"},"contributors":[]},"9.6.0-beta.1":{"name":"@hussar/ext-SDK-ability","version":"9.6.0-beta.1","private":false,"scripts":{"build":"webpack --config webpack.config.js","serve":"vue-cli-service serve --mode development","prepublishOnly":"node scripts/switch-package-entries.js to-dist","postpublish":"node scripts/switch-package-entries.js to-src && echo 发布成功"},"dependencies":{},"peerDependencies":{"vue":"^2.6.0 || ^3.0.0"},"devDependencies":{"@babel/core":"^7.23.0","@babel/preset-env":"^7.23.0","babel-loader":"^9.1.3","clean-webpack-plugin":"^4.0.0","terser-webpack-plugin":"^5.3.9","webpack":"^5.89.0","webpack-cli":"^5.1.4"},"main":"dist/index.js","module":"dist/index.esm.js","files":["dist","README.md","package.json"],"postcss":{"plugins":{"autoprefixer":{}}},"browserslist":["> 1%","last 2 versions","not dead"],"readmeFilename":"README.md","description":"## 1. 工程概述","_id":"@hussar/ext-SDK-ability@9.6.0-beta.1","_integrity":"sha512-SLBYy3nCbBP2dFOyDwIlqYhu4Bhjyr99AaUn88ja3Q4NDTdSCAXeKKojhuvTqJllruncjn7szmHqHhK/T+kdyA==","_resolved":"/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.6.0-beta.1.tgz","_from":"file:/var/jenkins_home/workspace/fusion/common/front-npm-transfer/packages/@hussar_ext-SDK-ability@9.6.0-beta.1.tgz","_nodeVersion":"16.20.2","_npmVersion":"8.19.4","dist":{"integrity":"sha512-SLBYy3nCbBP2dFOyDwIlqYhu4Bhjyr99AaUn88ja3Q4NDTdSCAXeKKojhuvTqJllruncjn7szmHqHhK/T+kdyA==","shasum":"8053d06f6c4833f9e82e9ca1db847640bc3fad7c","tarball":"http://123.232.10.234:8212/nexus/content/groups/npm-public/@hussar/ext-SDK-ability/-/ext-SDK-ability-9.6.0-beta.1.tgz"},"contributors":[]}},"dist-tags":{"latest":"9.6.0-beta.1"},"name":"@hussar/ext-SDK-ability","time":{"modified":"2026-04-24T11:35:54.872Z","created":"2025-11-22T08:37:04.172Z","9.5.3-fix.5":"2025-11-22T08:37:04.172Z","9.5.5-alpha.1":"2025-11-25T13:41:30.926Z","9.5.5":"2025-11-28T04:48:49.745Z","9.5.6":"2025-12-23T10:17:50.391Z","9.5.7":"2026-01-17T11:34:15.743Z","9.5.8":"2026-03-19T02:19:28.417Z","9.5.9":"2026-04-03T12:04:13.943Z","9.6.0-beta.1":"2026-04-24T11:35:54.872Z"},"readme":"# HussarExtSDKAbility\n\n## 1. 工程概述\n\nHussarExtSDKAbility 是一个 Vue.js 插件，专门用于在不同环境中（钉钉、企业微信、浏览器）提供统一的 SDK 集成能力，主要功能包括环境检测、标题设置适配和第三方 SDK 动态加载。\n\n### 1.1 核心特性\n\n- 🌐 **多环境支持**：自动检测钉钉、企业微信、浏览器环境\n- 🔌 **适配器模式**：统一接口，不同平台自动适配\n- 📦 **动态加载**：按需加载第三方 SDK，减少初始加载时间\n- 🎯 **Promise API**：所有方法返回 Promise，支持 async/await\n- 🔧 **可扩展**：支持自定义环境和功能扩展\n\n### 1.2 技术栈\n\n- Vue 2.x / 3.x（作为 peer dependency）\n- Webpack 5（构建工具）\n- Babel（代码转译）\n- 输出格式：ESM\n\n---\n\n## 2. 安装与使用\n\n### 2.1 安装\n\n```bash\nnpm install @hussar/ext-SDK-ability\n# 或\nyarn add @hussar/ext-SDK-ability\n```\n\n### 2.2 基础使用\n\n```javascript\nimport Vue from 'vue';\nimport ExtSDKAbility from '@hussar/ext-SDK-ability';\n\n// 安装插件\nVue.use(ExtSDKAbility);\n\n// 在组件中使用\nexport default {\n  mounted() {\n    // 设置页面标题（自动适配当前环境）\n    this.$extAdapter.setTitle('页面标题').then(() => {\n      console.log('标题设置成功');\n    });\n\n    // 检查当前环境\n    console.log('环境名称:', this.$envName);\n    console.log('是否非Web环境:', this.$isNotWeb);\n  }\n}\n```\n\n### 2.3 环境变量配置\n\n| 变量名 | 说明 | 默认值 |\n|--------|------|--------|\n| `VUE_APP_HIDE_TITLE_ONEXT` | 在非Web环境下隐藏标题 | - |\n\n---\n\n## 3. API 文档\n\n### 3.1 Vue 原型属性\n\n安装插件后，会在 Vue 原型上添加以下属性：\n\n| 属性名 | 类型 | 说明 |\n|--------|------|------|\n| `$extAdapter` | Object | 适配器对象，包含各平台能力方法 |\n| `$envName` | String | 当前环境名称（dd/wx/web/自定义） |\n| `$isNotWeb` | Boolean | 是否为非浏览器环境 |\n| `$hideTitle` | Boolean | 是否隐藏标题 |\n\n### 3.2 适配器方法\n\n#### setTitle(title)\n\n设置页面标题，自动适配当前环境。\n\n**参数：**\n- `title` {String} - 页面标题\n\n**返回值：** Promise\n\n**示例：**\n```javascript\nthis.$extAdapter.setTitle('我的页面').then(() => {\n  console.log('标题设置成功');\n}).catch((error) => {\n  console.error('标题设置失败:', error);\n});\n```\n\n#### requestAuth(corpId)\n\n请求授权（仅钉钉环境支持）。\n\n**参数：**\n- `corpId` {String} - 企业ID\n\n**返回值：** Promise，resolve 时返回授权码\n\n**示例：**\n```javascript\n// 仅钉钉环境有效\nif (this.$envName === 'dd') {\n  this.$extAdapter.requestAuth('dingxxxxxx').then((result) => {\n    console.log('授权码:', result.code);\n  });\n}\n```\n\n### 3.3 自定义环境配置\n\n支持通过配置对象注册自定义环境：\n\n```javascript\nVue.use(ExtSDKAbility, [\n  {\n    uaMark: 'myapp',           // User-Agent 标识\n    name: 'mySDK',             // 全局对象名（挂载到 window）\n    sourceUrl: 'https://cdn.example.com/sdk.js',  // SDK 地址\n    hideTitle: true,           // 是否隐藏标题\n    ability: {                 // 可选：直接提供能力对象\n      setTitle: (title) => {\n        // 自定义实现\n        return Promise.resolve();\n      }\n    }\n  }\n]);\n```\n\n**配置项说明：**\n\n| 属性 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `uaMark` | String | 是 | User-Agent 匹配标识 |\n| `name` | String | 是 | 全局 SDK 对象名称 |\n| `sourceUrl` | String | 否 | SDK 脚本地址（与 ability 二选一） |\n| `ability` | Object | 否 | 能力对象（与 sourceUrl 二选一） |\n| `hideTitle` | Boolean | 否 | 是否隐藏标题 |\n\n---\n\n## 4. 如何扩展适配器\n\n### 4.1 扩展新的环境适配器\n\n#### 步骤 1: 在环境检测器中添加检测逻辑\n\n在 `src/utils/envDetector.js` 中添加新的环境检测：\n\n```javascript\n// 在 detectEnvironment 函数中添加\nif (ua.indexOf('your-platform') !== -1 || window.yourPlatformAPI) {\n  result = 'yourplatform';\n}\n```\n\n#### 步骤 2: 在源映射中添加 SDK 配置\n\n在 `src/source/sourceMap.js` 中添加新的源配置：\n\n```javascript\nconst sdkMap = {\n  // ... 现有配置\n  yourplatform: {\n    name: 'yp',\n    url: 'https://your-cdn.com/your-sdk.js',\n  },\n};\n```\n\n#### 步骤 3: 在环境名称映射中添加配置\n\n在 `src/utils/getEnvName.js` 中添加：\n\n```javascript\nconst adapters = {\n  // ... 现有配置\n  yourplatform: {\n    name: 'yp',\n  },\n};\n```\n\n#### 步骤 4: 创建新的适配器实现\n\n在 `src/adapter/platform/` 目录下创建新的适配器文件 `yp.js`：\n\n```javascript\nexport default {\n  setTitle: (title) => {\n    return new Promise((resolve, reject) => {\n      if (window.yp) {\n        window.yp.setTitle({\n          title: title,\n          onSuccess: resolve,\n          onFail: reject,\n        });\n      } else {\n        // 降级方案\n        document.title = title;\n        resolve();\n      }\n    });\n  },\n  // 添加更多能力方法...\n};\n```\n\n### 4.2 扩展示例：添加扫码功能\n\n以添加扫码功能为例，演示如何扩展新功能：\n\n**1. 在各平台适配器中添加实现：**\n\n```javascript\n// src/adapter/platform/dd.js\nexport default {\n  // ... 现有方法\n  \n  scanQRCode: () => {\n    return new Promise((resolve, reject) => {\n      if (window.dd) {\n        window.dd.biz.util.scan({\n          type: 'all',  // 可以指定扫二维码还是一维码，默认两者都有\n          onSuccess: resolve,\n          onFail: reject,\n        });\n      } else {\n        reject(new Error('钉钉API未就绪'));\n      }\n    });\n  }\n};\n```\n\n**2. 使用新功能：**\n\n```javascript\n// 在 Vue 组件中\nasync handleScan() {\n  try {\n    const result = await this.$extAdapter.scanQRCode();\n    console.log('扫码结果:', result.text);\n  } catch (error) {\n    this.$message.error('扫码失败: ' + error.message);\n  }\n}\n```\n\n### 4.3 扩展注意事项\n\n1. **保持接口一致性**: 所有适配器方法应返回 Promise\n2. **提供降级方案**: 确保在平台 API 不可用时能正常降级\n3. **错误处理**: 完善的错误处理和用户提示\n4. **性能考虑**: 避免不必要的 API 调用和资源加载\n5. **兼容性**: 考虑不同平台的 API 差异和限制\n\n---\n\n## 5. 开发指南\n\n### 5.1 本地开发\n\n```bash\n# 克隆项目\ngit clone <repository-url>\n\n# 安装依赖\nnpm install\n\n# 开发模式（需配合外部项目）\nnpm run serve\n```\n\n### 5.2 构建发布\n\n```bash\n# 构建生产版本（生成 UMD 和 ESM 格式）\nnpm run build\n\n# 发布（会自动切换入口文件）\nnpm run prepublishOnly\nnpm publish\nnpm run postpublish\n```\n\n### 5.3 项目结构\n\n```\nsrc/\n├── adapter/\n│   ├── platform/          # 各平台适配器实现\n│   │   ├── dd.js          # 钉钉适配器\n│   │   ├── wx.js          # 企业微信适配器\n│   │   └── web.js         # 浏览器适配器\n│   ├── index.js           # 适配器核心逻辑\n│   └── openModel.js       # 开放模型（自定义环境）\n├── source/\n│   ├── index.js           # SDK 加载器\n│   └── sourceMap.js       # SDK 源映射配置\n├── utils/\n│   ├── envDetector.js     # 环境检测器\n│   ├── getEnvName.js      # 环境名称映射\n│   └── queue.js           # 任务队列（SDK加载前缓存调用）\n└── main.js                # 插件入口\n```\n\n---\n\n## 6. 常见问题\n\n### Q1: 如何判断当前环境？\n\n```javascript\n// 方式1：通过 $envName\nif (this.$envName === 'dd') {\n  // 钉钉环境\n}\n\n// 方式2：通过 $isNotWeb\nif (this.$isNotWeb) {\n  // 非浏览器环境（钉钉或企业微信）\n}\n```\n\n### Q2: SDK 加载失败怎么办？\n\n插件内部已做处理：\n- 使用任务队列缓存 SDK 加载前的调用\n- SDK 加载完成后自动执行缓存的任务\n- 提供降级方案（如直接使用 document.title）\n\n### Q3: 如何调试自定义环境？\n\n在开发环境下，可以通过设置 `window._uaMark` 来模拟特定环境：\n\n```javascript\n// 在控制台执行\nwindow._uaMark = 'dingtalk';\n// 然后刷新页面\n```\n\n---\n\n## 7. 更新日志\n\n### v9.5.8\n- 初始版本发布\n- 支持钉钉、企业微信、浏览器环境\n- 支持自定义环境扩展\n- 支持动态 SDK 加载\n\n---\n\n## 8. 许可证\n\nMIT License","users":{}}