简介面向Vue前端开发者的Cordova原生能力集成教程资源包围绕vuecordova的技术组合系统演示如何调用手机定位、振动、相机相册与二维码扫描等常见硬件能力。内容从环境准备、全局安装Cordova、创建项目到引入Vue.js均给出清晰步骤并对camera、geolocation、vibration、barcode-scanner四个核心插件的安装命令、调用接口、参数选项和权限配置逐一拆解帮助读者避开实际开发中常见的兼容性坑点。该压缩包约14.48MB以zip形式交付。目前已有532人学习适合具备基础Vue知识、希望以低成本将Web应用快速封装为原生移动能力的开发者。通过跟随教程操作可以完整掌握从项目搭建、插件集成到真机调试的整个链条并学会依据场景灵活调整照片质量、定位精度等细节是一份可直接对照实践的混合App开发参考资料。1. Vue 集成 Cordova 的 Native 能力从网页到真机的一条现实路径Vue 集成 Cordova 的 Native 能力是很多前端把网页变成手机软件时绕不开的一条路页面还是 Vue 写壳子换成系统 WebView摄像头、相册、定位、扫码这类浏览器碰不到的东西靠一座插件桥调通。我第一次拿它做巡检应用五个功能齐上阵结果真机上三个没反应后来查下来一半是权限没声明、一半是回调时机不对当时觉得这套东西像个黑匣子。本文把工程搭建、拍照、相册、定位、振动、扫码从实现到排错完整过一遍坑的位置都标出来。适合已经跑通 Vue 开发环境、想用 vscode 把自己的 Vue 项目做成手机 App 的读者也适合在 H5 基础上补原生能力的老前端。2. 工程骨架把 Vue 项目挂进 Cordova 的目录、依赖与构建流程2.1 为什么是 Cordova而不是纯 WebView 壳Cordova 不是给你换一个像 Chromium 那样的渲染引擎调用原生能力靠的是插件桥JS 侧的navigator.camera、navigator.geolocation这类对象经过插件映射到 Java 或 Objective-C 代码结果再通过回调送回来。你写的 Vue 组件、路由、状态管理全在 DOM 里跑真机上也就是一个带着这座桥的 WebView。这和 RN 那种自绘 UI 的思路完全不同Cordova 最大的价值在于H5 业务代码基本不动只补一层原生能力。它和 Electron 打包 Vue 项目也不是一条路线Electron 服务的是桌面端如果你要做手机 AppElectron 帮不上忙。什么时候应该选 Cordova我的判断标准是核心业务已经用 H5 写完了只差拍照、扫码、定位、振动这类系统能力单独包一层原生壳最划算。反过来如果要做大量原生交互比如指纹、复杂传感器、自定义高性能预览那不如直接原生或者 RN硬套 Cordova 只会两头受气。2.2 初始化步骤从 Vite 工程到 cordova run android前提是 Node 环境和 Vue 的安装及环境配置已经就位。下面这套命令我每次起新项目都用步骤顺序固定先建 Vue 工程再生成 Cordova 壳工程# 1. 用 Vite 脚手架起一个 Vue 工程vue-ts 选不选都行 npm create vuelatest my-app cd my-app npm install # 2. 全局安装 Cordova CLI装完跑一下 cordova -v 确认 npm install -g cordova # 3. 在项目根目录生成 Cordova 壳工程 # 参数分别是目录名、包名、显示名称 cordova create cordova com.example.myapp MyApp # 4. 进入壳工程添加 Android 平台iOS 需要在 macOS 上执行 cd cordova cordova platform add android # 5. 安装后面五个功能要用到的插件 cordova plugin add cordova-plugin-camera \ cordova-plugin-geolocation \ cordova-plugin-vibration \ cordova-plugin-barcodescanner \ cordova-plugin-android-permissions第三步里的com.example.myapp是包名上线前必须换成你自己的域名反写应用商店的包名唯一后面改的话要连原生工程一起动成本不低。cordova platform add android会拉 Android Gradle 工程首次执行要下载 Gradle 依赖时间较长属于正常现象。插件全部装完后cordova prepare android会把 www 目录和插件配置合并进原生工程这一步在后续每次改完前端资源后都要用到。Vue 项目构建出来的dist目录才是 Cordova 真正加载的页面但它不会自动同步进壳工程。我一般用一个拷贝脚本把dist整目录刷到cordova/www// scripts/sync-www.js —— 用 CommonJS 写法避免和 package.json 的 type 字段打架 const fs require(node:fs) const path require(node:path) const dist path.resolve(__dirname, ../dist) const www path.resolve(__dirname, ../cordova/www) fs.rmSync(www, { recursive: true, force: true }) fs.cpSync(dist, www, { recursive: true }) console.log(dist 已同步到 cordova/www)rmSync的recursive是删除非空目录时必须的force防止目标目录不存在的时候抛错cpSync的recursive则保证把整个 dist 目录树完整复制。这个脚本对 Node 版本有要求16.7 以上才支持版本太旧就先用 ncp 之类的工具替代。对应的 package.json 里加上这条命令链{ scripts: { build: vite build, sync:app: node scripts/sync-www.js, build:app: npm run build npm run sync:app } }之后日常流程就固定成改 Vue 代码 →npm run build:app→ 进 cordova 目录cordova prepare android→ 真机cordova run android。整套流程里最容易漏的就是prepare这一步www 更新了但原生工程里的资源还是旧的真机上看到的永远是上一次的页面。2.3 关键配置config.xml 和权限声明Cordova 壳工程的config.xml是原生壳的总配置文件入口页面、应用名、方向、背景色全在这里。我常用的几个配置项widget idcom.example.myapp version1.0.0 xmlnshttp://www.w3.org/ns/widgets nameMyApp/name content srcindex.html / preference nameOrientation valueportrait / preference nameBackgroundColor value#f5f5f5 / preference nameDisallowOverscroll valuetrue / /widgetcontent srcindex.html决定 WebView 启动时加载的入口文件默认就是 www 下的 index.html一般不修改。Orientation锁竖屏在扫码场景下体验更稳如果业务需要横屏扫码再单独改 landscape。DisallowOverscroll用来去掉 Android 上 WebView 边缘的橡皮筋效果能让 App 的原生观感更强一点。权限方面camera、barcode、vibration 这几个插件会把需要的权限自动合并进 AndroidManifest我一般不在 config.xml 里重复写。但 geolocation 是例外它在 Android 上声明的是 coarse 和 fine 定位权限运行时还需要 App 主动申请。为了权限配置一目了然也可以在 config.xml 里显式声明platform nameandroid config-file targetAndroidManifest.xml parent/* uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION / uses-permission android:nameandroid.permission.CAMERA / /config-file /platform这块放到 config.xml 里不影响插件自动生成的权限Gradle 构建阶段会自动去重。但 Android 6.0 之后只是声明权限还不够运行时权限请求必须在 JS 代码里主动触发这就是后面 3.3 里要单独处理的问题。3. 五个核心功能打通拍照、相册、定位、振动、扫码实现3.1 前置先过 deviceready 这道门槛Cordova 的 JS 桥不是页面打开就能用的要等deviceready事件触发。Vue 组件的mounted触发得早SPA 路由一跳就可能提前调用插件此时桥还没注册最常见的结果就是按钮没反应、控制台也没报错。我把等待逻辑封装成一个工具函数// src/utils/deviceReady.js export default function onDeviceReady() { return new Promise((resolve) { // 浏览器调试环境没有 cordova 对象直接放行 if (window.cordova window.deviceReadyFired) { resolve() return } document.addEventListener(deviceready, () resolve(), { once: true }) }) }window.deviceReadyFired是 Cordova 内部在桥接完成后置位的标识加上这层判断可以避免重复监听once: true保证回调只执行一次。浏览器里开发时没有window.cordova函数会直接 resolve这样用 Chrome 做 UI 调试时不会被卡住。在组件里使用就是标准的前置 awaitimport onDeviceReady from /utils/deviceReady async function init() { await onDeviceReady() // 到这里才去调 camera、geolocation、barcodeScanner }所有插件调用都放在这行后面是我写 Cordova 业务的第一条规矩。3.2 拍照与调取相册camera 插件的参数和内存控制以拍照为例完整代码长这样script setup import { ref } from vue import onDeviceReady from /utils/deviceReady const photo ref() async function pickFromCamera() { await onDeviceReady() const fileUri await takePhoto() photo.value fileUri } function takePhoto() { return new Promise((resolve, reject) { navigator.camera.getPicture( resolve, reject, { quality: 80, destinationType: navigator.camera.DestinationType.FILE_URI, sourceType: navigator.camera.PictureSourceType.CAMERA, encodingType: navigator.camera.EncodingType.JPEG, targetWidth: 1280, targetHeight: 1280, correctOrientation: true, saveToPhotoAlbum: false } ) }) } /script template button clickpickFromCamera拍照/button img v-ifphoto :srcphoto alt照片 / /template这套参数我基本不换核心是destinationType: FILE_URI。FILE_URI返回的是file:///storage/...这样的文件路径放在img里直接显示内存开销小如果选DATA_URL得到的是 base64 字符串适合小图上传统一上传但大图会直接把 WebView 内存打爆。sourceType控制来源CAMERA是调相机PHOTOLIBRARY是从相册选业务里如果做“拍照或相册”二选一就做两个按钮分别传不同的sourceType。常用参数速查参数取值说明quality0 ~ 100JPEG 压缩质量80 在画质和体积间比较均衡destinationTypeDATA_URL / FILE_URIbase64 适合小图FILE_URI 适合图片列表sourceTypeCAMERA / PHOTOLIBRARY拍照还是选相册targetWidth / targetHeight像素超出后等比缩放不设则返回原图correctOrientationtrue / falseAndroid 拍照后方向修正建议常开saveToPhotoAlbumtrue / false拍照后是否写入系统相册targetWidth: 1280这行很关键真机上用户拿 5000 万像素的原图直接回传给 WebView哪怕 FILE_URI 不需要解码整张图后续createImageBitmap或 canvas 操作也会卡死页面。correctOrientation: true解决的是 Android 上拍照后图片旋转 90 度的问题这个不修后面在页面里显示就会是横的。3.3 获取地理位置精度、超时和运行时权限定位功能先看数据获取本身function getCurrentPosition() { return new Promise((resolve, reject) { navigator.geolocation.getCurrentPosition( (pos) { resolve({ latitude: pos.coords.latitude, longitude: pos.coords.longitude, accuracy: pos.coords.accuracy, timestamp: pos.timestamp }) }, (err) reject({ code: err.code, message: err.message }), { enableHighAccuracy: false, timeout: 20000, maximumAge: 5000 } ) }) }enableHighAccuracy是最容易踩空的一项设成 true 意味着要等 GPS 收敛室内和楼宇阴影环境下经常十几秒拿不到结果直接走 timeout。所以室内定位默认 false用的是 WiFi 基站 GPS 混合定位速度明显更快。timeout: 20000是等待时间上限从发起请求开始计时超过 20 秒没有拿到位置就触发错误回调。maximumAge: 5000允许复用 5 秒内的定位缓存巡检这类高频获取位置的场景可以不用每次都重新定位。接下来是 Android 上绕不开的运行时权限。cordova-plugin-geolocation 在 Android 上只是声明权限不会自动弹授权框不带权限直接调getCurrentPosition就会走到错误回调错误码是 1PERMISSION_DENIED。所以我在调用定位前先主动申请import onDeviceReady from /utils/deviceReady async function ensureLocationPermission() { await onDeviceReady() const p cordova.plugins.permissions return new Promise((resolve, reject) { p.requestPermission( p.ACCESS_FINE_LOCATION, (status) { // status.hasPermission 为 true 说明用户已授权 status.hasPermission ? resolve() : reject(new Error(定位权限被拒绝)) }, (err) reject(err) ) }) }这段代码在 Android 上会弹出系统授权框用户同意后status.hasPermission为 true。iOS 上cordova-plugin-android-permissions只有在设备是 Android 时才生效iOS 的定位授权走的是 Info.plist 里的NSLocationWhenInUseUsageDescription描述首次调用getCurrentPosition时系统会弹窗。iOS 用户如果拒绝过status.hasPermission同样为 false错误提示要引导用户去系统设置里开权限。3.4 手机振动时长与模式振动是五个功能里最没有存在感的但也最实用扫码成功给一次短振业务失败给一段长振用户不用盯着屏幕也能知道结果。export function vibrate(pattern) { const mode Array.isArray(pattern) ? pattern : [pattern || 200] if (navigator.vibrate typeof navigator.vibrate function) { // Cordova 环境里 navigator.vibrate 可用时直接走它 navigator.vibrate(mode) } else if (window.plugins window.plugins.vibration) { // 兜底调用 vibration 插件的原生方法 window.plugins.vibration.vibrate(mode) } }参数是一个数字毫秒数或者一个数组。数字表示振动时长比如vibrate(100)振 100 毫秒数组表示振动模式[200, 100, 200]表示振动 200ms、停 100ms、再振动 200ms。iOS 的 Safari 里navigator.vibrate不存在但 Cordova 插件可以用数组模式在部分 iOS 版本上会退化成连续振动所以关键提示音还是得配合 notification 插件一起做。这个功能没有回调、没有权限调用即生效踩坑最少。3.5 扫描二维码扫码插件选型与返回数据结构扫码我用的还是cordova-plugin-barcodescanner老牌、稳定接口也简单function scanBarcode() { return new Promise((resolve, reject) { cordova.plugins.barcodeScanner.scan( (result) { if (!result.cancelled) { // text 是识别出的字符串format 是条码类型 resolve({ text: result.text, format: result.format }) } else { // 用户主动取消是正常分支别当错误打日志 reject({ code: CANCELED }) } }, reject, { preferFrontCamera: false, // 默认后置 showFlipCameraButton: true, // Android 上显示翻转摄像头按钮 showTorchButton: true, // 显示手电筒按钮 torchOn: false, formats: QR_CODE,PDF_417, // 限制识别格式防误扫 resultDisplayDuration: 300 } ) }) }result.text是识别出的原始字符串result.format是条码类型result.cancelled表示用户退出了扫码页面。formats这里只保留了QR_CODE和PDF_417付钱码、一维码的场景按需加CODE_128、EAN_13这些限制格式能显著减少误扫率。有一点要提前说清楚扫码页是原生全屏页面不是 DOM 组件你没法往里面嵌入自己的按钮或提示条。常见的做法是在调用扫码前把业务提示画在 Vue 页面上等回调回来再隐藏。result.text不一定是 URL可能是纯文本、一段 JSON 或者 WiFi 配置字符串。我之前就因为回调里只校验http://前缀结果用户扫了个文本码直接报错后来一律先展示原始内容再让用户二次确认。4. 权限、路径、回调和 npm 噪音四条排查记录这一章是血泪经验真机上出问题的时候基本都是按下面这几条路径查的。4.1 真机白屏浏览器里一切正常现象浏览器里 Vite 开发服务跑得好好的cordova run android一装上就是白屏接口请求要么没有要么报错。原因有两类。第一类是 Vite 默认的base是/打包后 index.html 里引用的 js/css 是绝对路径真机 WebView 加载的是file://协议绝对路径直接 404页面只剩一个空的#app。第二类是 Vue Router 用了createWebHistoryhistory 模式依赖服务器端的 URL 重写在file://下没有这个条件路由就匹配不到组件。解决把vite.config.js里的base改成./// vite.config.js export default defineConfig({ base: ./ })老项目用 vue-cli 的话对应字段是vue.config.js的publicPath值同样是./。路由改成 hash 模式// src/router/index.js createRouter({ history: createWebHashHistory(), routes })改完重新npm run build:app进 cordova 目录跑cordova prepare android白屏问题基本就消失了。4.2 定位一直转圈然后超时现象PC Chrome 里定位秒回真机上一直转圈最后err.code 3TIMEOUT或者直接err.code 1PERMISSION_DENIED。原因有两层。权限层的现实是cordova-plugin-geolocation在 Android 上只声明权限不主动弹运行时授权框用户没显式同意过定位接口就一直返回拒绝。定位本身的问题是enableHighAccuracy: true在室内等 GPS 收敛等 20 秒都拿不到锁定然后触发 timeout。解决先调用ensureLocationPermission()拿到运行时权限再执行getCurrentPosition同时把enableHighAccuracy改 false、timeout放到 20000。定位期间 UI 上要显示 loading 状态否则用户会以为卡死了。如果权限一直被拒要在错误提示里引导用户去系统设置手动打开定位权限App 内无法再弹第二次系统弹窗。4.3 拍照后图片裂图或者方向不对现象拍照完成后img :srcphoto显示空白或者照片在系统相册里方向正常App 里看却是横的。原因iOS 的 WKWebView 对file://协议的本地资源显示有限制部分路径含特殊字符时会拒绝渲染Android 上拍照后照片的 EXIF 方向信息没有被正确解析显示层就把它转横了如果用了DATA_URL大图直接爆内存页面闪退。解决统一用FILE_URIcorrectOrientation: true同时把targetWidth限制到 1280。如果FILE_URI在个别 iOS 设备上img依然不显示把文件路径读成 base64 字符串再赋给 src代价是内存占用变大适合单图场景图片列表千万不要这么干。4.4 扫码页黑屏预览不出来现象扫描页面打开全黑部分机型第一次能扫退出再进预览就是黑的Android 的 Logcat 里能看到 Camera 异常。原因cordova-plugin-barcodescanner内部的相机逻辑对 Android 12 的 targetSdk 适配比较敏感老版本插件直接调相机接口没做权限检查个别 ROM 对 Camera 预览面有兼容问题表现就是黑屏。解决先把cordova-plugin-barcodescanner升到最新版本检查config.xml里AndroidTargetSdkVersion是否设得过高或过低再确认 AndroidManifest 里 CAMERA 权限存在。真机复现时重点看 Logcat 的AndroidRuntime标签有没有CameraException。如果升级插件后依然黑屏再考虑换cordova-plugin-qrscanner但那个插件在 iOS 上还有额外的 Info.plist 配置要做换之前先试前者。4.5 npm 的警告不等于装坏了现象npm install或者cordova plugin add时刷出一大段npm warn deprecated node-domexception1.0.0: use your platforms native domexception instead看着像环境坏了。原因依赖树上某个传递依赖还在引用旧 APInpm 只是提示弃用和 Cordova 构建是否成功没有任何关系。这类警告常见于 jsdom、axios 这类库的传递依赖里你直接npm ls node-domexception都定位不到具体来源因为它在很深的位置。解决不用处理继续跑 build 和 run 就行。判断构建成败看的是 exit code不是 warn 的数量。npm 命令只要没有 error构建就能正常出包别被这些噪音吓到去乱升级依赖反而可能把环境搞乱。5. 真机调试三板斧白屏、CORS 和原生日志5.1 用 cordova run 一条命令顶到真机改完 www 重新构建之后cordova run android会重新打包并安装到已连接设备或模拟器上。如果只改了 www 下的前端资源、没动插件可以只跑cordova prepare android后重新 install这个流程熟练之后就是一分钟的事。真机连接先确认adb devices能看到设备adb devices cd cordova cordova run android注意保持 debug 模式运行release 模式会要求签名签名不一致时会出现 INSTALL_FAILED_UPDATE_INCOMPATIBLE那时候还得先卸载旧包再装。模拟器上定位不准我基本只用真机调试室内定位的问题在模拟器上永远复现不出来。5.2 白屏和 CORS两类真机专属问题白屏先不要急着看代码先确认 WebView 到底加载了什么。Chrome 浏览器打开chrome://inspect选择这台设备的 WebView就能看到控制台和 Network 面板。如果请求地址是file:///android_asset/www/js/app.js 404就回头去改base: ./。装了 Vue Devtools 插件之后还可以在 inspect 面板里直接看组件树和 state调 Vue 组件状态的时候比到处console.log快得多。CORS 是另一个真机专属问题file://页面用 fetch 请求 https 接口浏览器照常执行同源策略拦截Cordova 不能豁免这个限制。解决方向不是关跨域而是让服务端放开 CORS 响应头。开发期用 Vite 代理只在浏览器里生效真机上不跑代理所以后端接口的Access-Control-Allow-Origin必须提前处理好。千万别用加启动参数绕过安全策略的办法调试那只会掩盖问题上线就是另一个坑。5.3 JS console 导出到 Logcat真机上看不到 console 输出所以要把前端错误打进原生日志。Cordova-Android 10 以上版本的console.log默认就进 Logcat 的 chromium 标签原生层的异常看AndroidRuntime标签。我在 main.js 里挂一个全局兜底// main.js —— 开发阶段把前端运行错误打进原生日志 window.addEventListener(error, (event) { console.error([vue-app], event.message, event.filename, event.lineno) })这个 hook 在排查“点按钮没反应”这类问题时特别有用Cordova 桥对前端来说是个黑匣子错误到底是在 Vue 层丢了还是插件层丢了通过这个全局错误监听能看出大概范围。过滤日志用adb logcat -s Chromium:V AndroidRuntime:E就不用每次从头翻屏了。这个 hook 上线前要换成上传到自己的错误收集系统不能直接 alert 给用户否则业务场景里全是弹窗。6. 收尾技巧把五处插件调用收敛成一组 Promise 方法前面几个功能都是直接在组件里调 navigator 方法代码能跑但散落在各个组件里后面的维护会越来越难受。我的习惯是把这一层统一收进一个模块所有插件调用封装成 Promise组件里只跟业务数据打交道// src/native/index.js —— 把五个原生能力收敛成一组 Promise 方法 import onDeviceReady from /utils/deviceReady async function callNative(fn) { // 所有调用统一先等 deviceready避免重复写这一步 await onDeviceReady() return fn() } export function useNative() { return { takePhoto: () callNative(openCamera), chooseFromAlbum: () callNative(openAlbum), getLocation: () callNative(readLocation), vibrate: (pattern) callNative(() vibrateByNative(pattern)), scan: () callNative(scanBarcode) } }openCamera、openAlbum、readLocation、vibrateByNative、scanBarcode就是前面几节里那些具体实现统一挂到useNative上。业务组件里就不再出现cordova.plugins全局变量只需要const native useNative()然后await native.takePhoto()。这样做的价值有三个第一所有调用都强制过deviceready不会出现桥没就绪就调插件的低级错误第二将来底层插件更换比如扫码从 barcodescanner 换成 qrscanner只需要改src/native里的一个文件组件层不受影响第三浏览器环境里开发 UI 时onDeviceReady会自动放行Vue 组件可以在 Chrome 里继续跑。从那以后我每接一个 Cordova 项目第一件事就是先把这一层封装铺进 utils。回调地狱只在工具函数里出现一次权限申请和错误处理全部集中管理业务代码永远只跟 Promise 和业务数据打交道这种结构扛住了后面三四年的迭代。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
用SimulIDE搭建Arduino仿真环境:从点灯到舵机控制的完整教程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:28:23
MySQL选课系统设计:存储过程、事务与联合主键实战 简介:面向高校计算机专业毕业设计及智慧校园建设需求,这份资料包以SSM框架为核心,整合MySQL数据库,实现了学生智能选课、课程信息管理、教师数据同步、后台维护等完整功能。压缩包大小约52MB,标题标明内含可运行源码、… · 2026/9/25 4:28:23
Qualcomm Wi-Fi配置文件调优:连接管理、功耗控制与漫游参数详解 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:28:11
Protractor 端到端测试基础设施架构深度解析:从组件到进程通信的全链路 测试 【免费下载链接】protractor E2E test framework for Angular apps 项目地址: https://gitcode.com/gh_mirrors/pr/protractor 点击查看 免费下载 导读
本篇文章以 Protractor 官方文档《How It Works / Infrastructure》为骨架,结合仓库源码与配… · 2026/9/25 5:54:20
昇腾Atlas 300V部署YOLOv5全流程实战:从模型转换到推理调优 Atlas这个词放在AI部署圈里,通常不是一个地图软件,而是指华为昇腾(Ascend)系列的AI计算平台。很多人第一次接触Atlas,是因为手头拿到了一块Atlas 300V 24G的运算加速卡,想拿它跑YOLO目标检测。问题往往从这… · 2026/9/25 5:54:08
Cocos Creator微信小游戏开发闭环指南 1. 为什么一个真实运行的“一人工作室”需要这套闭环指南我从2019年开始用Cocos Creator做微信小游戏,前三年接外包、做定制、带小团队,踩过所有你能想到的坑——打包失败、真机白屏、内存爆表、审核被拒、上线后卡顿掉帧。直到2023年彻底转型为纯一人工… · 2026/9/25 5:54:01
Atlas 300V部署YOLO实战:昇腾推理卡全流程解析与避坑指南 做AI部署这一行的人,但凡接触过边缘计算和推理加速,基本绕不开“atlas”这个名字。昇腾Atlas系列硬件这几年在安防、工业质检、自动驾驶、智慧零售这些场景里出镜率极高,尤其是配合YOLO系列目标检测模型做边缘端部署,几乎是标配方… · 2026/9/25 5:54:01
词达人自动答题脚本:浏览器自动化与题库匹配实战 1. 词达人自动答题脚本的底层逻辑与设计思路1.1 这个脚本到底解决什么问题词达人这类词汇学习平台,核心机制其实不复杂:给定一个英文单词,从四个中文释义里选正确的;或者反过来,给中文选英文。题目本身不难,… · 2026/9/25 5:54:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37