HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

最近项目需要在app中导出pdf的功能

renderjs

哈哈,来来来,今天我得跟你说说 UniApp 这文档的事儿。你说说,这 renderjs 的文档,短得可怕,是不是怕我学会啊?这文档可真是看得我心里直发毛,我本来以为这是个学习资料,结果一打开,哎呀妈呀,竟然跟个“速成班”的讲义似的,咋就这么简洁呢?你说说,应该让人看完了能学会吧?这也太简单了!学这技术,没点“内容”,学个啥呀?

你看吧,首先就得跟大家说一下,renderjs,是吧,按理说,应该是让我们写页面的工具,特别适合那些要自定义渲染的同学。结果呢,打开文档,三句话两段代码就解决问题了。啊?这就完了?我本以为能多看点深奥的东西,像什么内部原理,性能优化,咋就这俩小段儿代码呢?这些人是怕我学得太快,怕我一下子就超越他们吗?这么短,是怕我学会么?怕我一看就能秒懂吗?

你看看,代码部分我都能背下来了,这可好,整个文档就跟我点了点头,告诉我:“差不多得了!”。是想让我自己再去摸索,还是你们觉得我真能秒懂?我倒是觉得,这不是真的怕我学会,而是他们自己也没太研究明白吧。

总之,这文档就跟速食面似的,三分钟搞定。咱们当学员的,自己也得补补课,不能就这么吃干饭了!这就跟给我送的“菜”一样,根本没味儿,得自己再调味儿,别的地方也得好好琢磨琢磨,不能轻易就得出结论,这 renderjs 是个宝还是个坑呢?

你说,UniApp啊,能不能不这么“抠”点?文档也得好好整整,做个“系统餐”好不好?

继续阅读 »

renderjs

哈哈,来来来,今天我得跟你说说 UniApp 这文档的事儿。你说说,这 renderjs 的文档,短得可怕,是不是怕我学会啊?这文档可真是看得我心里直发毛,我本来以为这是个学习资料,结果一打开,哎呀妈呀,竟然跟个“速成班”的讲义似的,咋就这么简洁呢?你说说,应该让人看完了能学会吧?这也太简单了!学这技术,没点“内容”,学个啥呀?

你看吧,首先就得跟大家说一下,renderjs,是吧,按理说,应该是让我们写页面的工具,特别适合那些要自定义渲染的同学。结果呢,打开文档,三句话两段代码就解决问题了。啊?这就完了?我本以为能多看点深奥的东西,像什么内部原理,性能优化,咋就这俩小段儿代码呢?这些人是怕我学得太快,怕我一下子就超越他们吗?这么短,是怕我学会么?怕我一看就能秒懂吗?

你看看,代码部分我都能背下来了,这可好,整个文档就跟我点了点头,告诉我:“差不多得了!”。是想让我自己再去摸索,还是你们觉得我真能秒懂?我倒是觉得,这不是真的怕我学会,而是他们自己也没太研究明白吧。

总之,这文档就跟速食面似的,三分钟搞定。咱们当学员的,自己也得补补课,不能就这么吃干饭了!这就跟给我送的“菜”一样,根本没味儿,得自己再调味儿,别的地方也得好好琢磨琢磨,不能轻易就得出结论,这 renderjs 是个宝还是个坑呢?

你说,UniApp啊,能不能不这么“抠”点?文档也得好好整整,做个“系统餐”好不好?

收起阅读 »

uniapp开发App,不用安装插件也可以做到可以使用svg图标

SVG

1:创建imgSvg.ts文件
2:如图一所示,在imgSvg.ts这个文件夹中添加你想使用的svg图标
3:如图二所示,使用你的svg图标

1:创建imgSvg.ts文件
2:如图一所示,在imgSvg.ts这个文件夹中添加你想使用的svg图标
3:如图二所示,使用你的svg图标

在vscode上如何实现自定义组件、uniapp的uni_modules组件、vue-i8n、uni对象的类型声明,以及uniapp项目出错时修复的方法

vscode uniapp

首先,我们先把tsconfig.json的"strict": true开启,然后下载好vue,后面还需要的下载后面再说,对了,在uniapp项目里会出现问题,本文的后面有修复方法,推荐先看
对了,import和export关键字在dts文件的顶层不能乱加,要加只能在作为一个模块或者一个模块拓展时才加,不然写的declare就不能全局生效了

// tsconfig.json  
{  
  "compilerOptions": {  
    "strict": true    //就是这个  
  },  
}  

自定义组件、uniapp的uni_modules组件的类型声明
我们需要下载三个依赖,分别是vite、@vitejs/plugin-vue、unplugin-vue-components,然后在vite.config.ts里写入以下代码

import { defineConfig } from 'vite'  
import vue from '@vitejs/plugin-vue'  
import Components from 'unplugin-vue-components/vite'  

export default defineConfig({  
  plugins: [  
    vue(),  
    Components({  
      // 你的 vue 文件所在目录  
      dirs: ['uni_modules','components'],   
      extensions: ['vue'],  
      deep: true, // 是否递归查找子目录  
      directoryAsNamespace: false,  
      dts: 'custom-types/components/index.d.ts', // 自动生成的类型声明文件  
    }),  
  ]  
}  
)

然后我们接着在package.json的scripts节点添加一下代码

"scripts": {  
        "dev": "vite dev"  
    }

然后我们在npm run dev一下,就会发现多了'custom-types/components/index.d.ts'这么一个组件类型声明文件
如此一来,自定义的组件和下载的uni_modules组件的类型就有了

vue-i8n的类型声明
vue-i18n的类型声明是指在模版的组件上添加上$t函数,并为$t函数的参数添加类型,让我们只要输入‘’单引号就跳出提示,这样就不用傻乎乎的写字符的键了。i18n的类型声明比较简单,只需要的创建好i18n.d.ts文件,再写入以下代码

import  "vue"  
import TypeI18n from "./en"   //这里是导入你的i18n配置文件,要把en.json复制一份过来并把后缀改成ts,export default 那个json对象  
declare module "vue" {  
  export declare  interface ComponentCustomProperties {  
   $t(key:keyof typeof TypeI18n):string;  
  }  
}

uni对象的类型声明
这里我们需要下载@dcloudio/types这个依赖,然后在tsconfig.json里添加以下代码即可

{  
  "compilerOptions": {  
       "typeRoots": [  
      "./node_modules/@dcloudio"  
    ]  
  },  
}

uniapp项目出错时修复的方法
在uniapp里,想使用vite.config.ts需要一个依赖@dcloudio/vite-plugin-uni,hx已经内置好了,只需要引用即可

这是之前文章错误的地方,不要这么做  
使用npm包管理器下载@dcloudio/vite-plugin-uni依赖之后,npm会提示其中有一些依赖太老旧已经被抛弃了等提示,我们可以运行一下命令修复依赖

最后把vite.config.ts改成以下代码

import { defineConfig } from 'vite';  
import uni from '@dcloudio/vite-plugin-uni';  
import Components from 'unplugin-vue-components/vite'    
export default defineConfig({  
    plugins: [uni(),  
        Components({    
      // 你的 vue 文件所在目录    
      dirs: ['uni_modules','components'],     
      extensions: ['vue'],    
      deep: true, // 是否递归查找子目录    
      directoryAsNamespace: false,    
      dts: 'custom-types/components/index.d.ts', // 自动生成的类型声明文件    
    }),   
    ],  
});

完毕

继续阅读 »

首先,我们先把tsconfig.json的"strict": true开启,然后下载好vue,后面还需要的下载后面再说,对了,在uniapp项目里会出现问题,本文的后面有修复方法,推荐先看
对了,import和export关键字在dts文件的顶层不能乱加,要加只能在作为一个模块或者一个模块拓展时才加,不然写的declare就不能全局生效了

// tsconfig.json  
{  
  "compilerOptions": {  
    "strict": true    //就是这个  
  },  
}  

自定义组件、uniapp的uni_modules组件的类型声明
我们需要下载三个依赖,分别是vite、@vitejs/plugin-vue、unplugin-vue-components,然后在vite.config.ts里写入以下代码

import { defineConfig } from 'vite'  
import vue from '@vitejs/plugin-vue'  
import Components from 'unplugin-vue-components/vite'  

export default defineConfig({  
  plugins: [  
    vue(),  
    Components({  
      // 你的 vue 文件所在目录  
      dirs: ['uni_modules','components'],   
      extensions: ['vue'],  
      deep: true, // 是否递归查找子目录  
      directoryAsNamespace: false,  
      dts: 'custom-types/components/index.d.ts', // 自动生成的类型声明文件  
    }),  
  ]  
}  
)

然后我们接着在package.json的scripts节点添加一下代码

"scripts": {  
        "dev": "vite dev"  
    }

然后我们在npm run dev一下,就会发现多了'custom-types/components/index.d.ts'这么一个组件类型声明文件
如此一来,自定义的组件和下载的uni_modules组件的类型就有了

vue-i8n的类型声明
vue-i18n的类型声明是指在模版的组件上添加上$t函数,并为$t函数的参数添加类型,让我们只要输入‘’单引号就跳出提示,这样就不用傻乎乎的写字符的键了。i18n的类型声明比较简单,只需要的创建好i18n.d.ts文件,再写入以下代码

import  "vue"  
import TypeI18n from "./en"   //这里是导入你的i18n配置文件,要把en.json复制一份过来并把后缀改成ts,export default 那个json对象  
declare module "vue" {  
  export declare  interface ComponentCustomProperties {  
   $t(key:keyof typeof TypeI18n):string;  
  }  
}

uni对象的类型声明
这里我们需要下载@dcloudio/types这个依赖,然后在tsconfig.json里添加以下代码即可

{  
  "compilerOptions": {  
       "typeRoots": [  
      "./node_modules/@dcloudio"  
    ]  
  },  
}

uniapp项目出错时修复的方法
在uniapp里,想使用vite.config.ts需要一个依赖@dcloudio/vite-plugin-uni,hx已经内置好了,只需要引用即可

这是之前文章错误的地方,不要这么做  
使用npm包管理器下载@dcloudio/vite-plugin-uni依赖之后,npm会提示其中有一些依赖太老旧已经被抛弃了等提示,我们可以运行一下命令修复依赖

最后把vite.config.ts改成以下代码

import { defineConfig } from 'vite';  
import uni from '@dcloudio/vite-plugin-uni';  
import Components from 'unplugin-vue-components/vite'    
export default defineConfig({  
    plugins: [uni(),  
        Components({    
      // 你的 vue 文件所在目录    
      dirs: ['uni_modules','components'],     
      extensions: ['vue'],    
      deep: true, // 是否递归查找子目录    
      directoryAsNamespace: false,    
      dts: 'custom-types/components/index.d.ts', // 自动生成的类型声明文件    
    }),   
    ],  
});

完毕

收起阅读 »

ios、android备案公钥、模数、MD5免费查询方法 苹果安卓备案查询

uniapp 教程

2023年8月后,现在上架的app都需要备案了,无论是新上架还是已上架的app都要求做备案

网上的教程要么就是要使用mac电脑去获取公钥,android则需要安装工具去获取公钥,实在是太麻烦了。

而且不同的备案平台,要求录入的公钥的格式还不一样,有的需要输入公钥16进制,有的需要输入公钥10进制。

分享一个视化工具,上传证书就可以获取app的公钥和MD5值,省去了很多时间,无需安装工具和使用mac电脑即可获取到公钥,而且这个工具的查询结果包含了各平台需要的公钥原文、公钥16进制和公钥10进制的值:

https://apk.xekctl.cn/

继续阅读 »

2023年8月后,现在上架的app都需要备案了,无论是新上架还是已上架的app都要求做备案

网上的教程要么就是要使用mac电脑去获取公钥,android则需要安装工具去获取公钥,实在是太麻烦了。

而且不同的备案平台,要求录入的公钥的格式还不一样,有的需要输入公钥16进制,有的需要输入公钥10进制。

分享一个视化工具,上传证书就可以获取app的公钥和MD5值,省去了很多时间,无需安装工具和使用mac电脑即可获取到公钥,而且这个工具的查询结果包含了各平台需要的公钥原文、公钥16进制和公钥10进制的值:

https://apk.xekctl.cn/

收起阅读 »

关于 uniCloud 用户手机号实名核验的公告

uniCloud

自 2025 年 5 月12 日 0 时 起,用户登录 uniCloud 控制台 时,将进行手机号实名信息核验。具体规则如下:

个人用户(持身份证证件):

请确保 注册手机号的实名信息 与 身份证号、开发者名称 保持一致。如不一致,请及时修改手机号。
使用护照、港澳通行证的个人用户不受影响。

企业用户:

请确保 联系人手机号的实名信息 与 联系人姓名、身份证号 保持一致。如不一致,请及时修改联系人信息。

请您尽快核对相关信息,以免影响正常使用 uniCloud 服务。

继续阅读 »

自 2025 年 5 月12 日 0 时 起,用户登录 uniCloud 控制台 时,将进行手机号实名信息核验。具体规则如下:

个人用户(持身份证证件):

请确保 注册手机号的实名信息 与 身份证号、开发者名称 保持一致。如不一致,请及时修改手机号。
使用护照、港澳通行证的个人用户不受影响。

企业用户:

请确保 联系人手机号的实名信息 与 联系人姓名、身份证号 保持一致。如不一致,请及时修改联系人信息。

请您尽快核对相关信息,以免影响正常使用 uniCloud 服务。

收起阅读 »

关于荣耀手机9.0版本真机调试,Hbuilder一直搜索不到设备问题

真机调试

类似关于USB调试的方法大家已经看过很多,也都尝试过了,如果还是不行,可以看看,我的办法能否解决。

在开发人员选项中,恢复默认设置,然后重新多次点击版本号进入开发者模式:
在开发人员选项中,开启USB调试,USB配置为传输文件(多媒体传输);
关闭Hbuilder并重新打开,运行——手机或模拟器——运行到安卓app基座,这时就可以看到我们的设备已经出现了。
连接正常,可以进行测试了。
ps:本人使用的是mac电脑,但在windows电脑也出现相同问题。
在开发人员选项——选择待调试应用功能,已经不是不可选中了,可以勾选Hbuilder应用。

继续阅读 »

类似关于USB调试的方法大家已经看过很多,也都尝试过了,如果还是不行,可以看看,我的办法能否解决。

在开发人员选项中,恢复默认设置,然后重新多次点击版本号进入开发者模式:
在开发人员选项中,开启USB调试,USB配置为传输文件(多媒体传输);
关闭Hbuilder并重新打开,运行——手机或模拟器——运行到安卓app基座,这时就可以看到我们的设备已经出现了。
连接正常,可以进行测试了。
ps:本人使用的是mac电脑,但在windows电脑也出现相同问题。
在开发人员选项——选择待调试应用功能,已经不是不可选中了,可以勾选Hbuilder应用。

收起阅读 »

vue3.5+deepseek-v3多轮流式AI对话助手

vite vue3

2025实战ai开发vue3.5整合deepseek-v3搭建一款仿DeepSeek/ChatGPT网页版流式聊天AI对话模板。
集成 Vite6 对接 DeepSeek-V3 API 流式打字输出对话大模型。支持上下文多轮对话、代码高亮、本地缓存,亮色+暗黑主题。

使用技术

  • 技术框架:vite^6.2.0+vue^3.5.13+vue-router^4.5.0
  • AI框架:DeepSeek-R1 + OpenAI
  • 组件库:arco-design^2.57.0 (字节桌面端组件库)
  • 状态管理:pinia^3.0.1
  • 本地存储:pinia-plugin-persistedstate^4.2.0
  • 高亮插件:highlight.js^11.11.1
  • markdown解析:markdown-it

项目特色

  1. 流式响应:Vue3+DeepSeek实现逐行打字输出效果
  2. 丝滑极速:基于Vite6构建,接入DeepSeek,性能更优,聊天丝滑流畅
  3. 特色功能:支持各种代码高亮,利于展示和分享代码片段、支持暗黑+亮色主题模式
  4. 风格:采用arco-design组件库,风格统一,美观大气

项目框架结构

想要了解更多的技术实现细节可以去参考下面这篇分享文章。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果

继续阅读 »

2025实战ai开发vue3.5整合deepseek-v3搭建一款仿DeepSeek/ChatGPT网页版流式聊天AI对话模板。
集成 Vite6 对接 DeepSeek-V3 API 流式打字输出对话大模型。支持上下文多轮对话、代码高亮、本地缓存,亮色+暗黑主题。

使用技术

  • 技术框架:vite^6.2.0+vue^3.5.13+vue-router^4.5.0
  • AI框架:DeepSeek-R1 + OpenAI
  • 组件库:arco-design^2.57.0 (字节桌面端组件库)
  • 状态管理:pinia^3.0.1
  • 本地存储:pinia-plugin-persistedstate^4.2.0
  • 高亮插件:highlight.js^11.11.1
  • markdown解析:markdown-it

项目特色

  1. 流式响应:Vue3+DeepSeek实现逐行打字输出效果
  2. 丝滑极速:基于Vite6构建,接入DeepSeek,性能更优,聊天丝滑流畅
  3. 特色功能:支持各种代码高亮,利于展示和分享代码片段、支持暗黑+亮色主题模式
  4. 风格:采用arco-design组件库,风格统一,美观大气

项目框架结构

想要了解更多的技术实现细节可以去参考下面这篇分享文章。
vue3-webseek网页版AI问答|Vite6+DeepSeek+Arco流式ai聊天打字效果

收起阅读 »

SubNVue 在 iOS模拟器中

subnvue

const subNVue = uni.getSubNVueById('xxx')
在iOS模拟器中,一个侧滑就让 subNVue Unmounted 了, 然后就打不开了

const subNVue = uni.getSubNVueById('xxx')
在iOS模拟器中,一个侧滑就让 subNVue Unmounted 了, 然后就打不开了

onResize 和 onWindowResize

在uniapp nvue页面中, 都会多次执行.


onResize 在第几个打开页面, 执行几次.

uni.onWindowResize 打开几个页面,执行几次.


App.vue 里定义

    function windowResizeFn(res) {  
        if (res.size.windowWidth > res.size.windowHeight) {  
            console.log('当前是横屏', res);  
        } else {  
            console.log('当前是竖屏', res);  
        }  
        uni.$emit('windowResize', res)  
    }  
    export default {  
        onLaunch: function() {  
            console.log('App Launch')  
            uni.onWindowResize(windowResizeFn);  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        }  
    }

在页面 uni.$on('windowResize', data => { }), 防止重复触发.

继续阅读 »

在uniapp nvue页面中, 都会多次执行.


onResize 在第几个打开页面, 执行几次.

uni.onWindowResize 打开几个页面,执行几次.


App.vue 里定义

    function windowResizeFn(res) {  
        if (res.size.windowWidth > res.size.windowHeight) {  
            console.log('当前是横屏', res);  
        } else {  
            console.log('当前是竖屏', res);  
        }  
        uni.$emit('windowResize', res)  
    }  
    export default {  
        onLaunch: function() {  
            console.log('App Launch')  
            uni.onWindowResize(windowResizeFn);  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        }  
    }

在页面 uni.$on('windowResize', data => { }), 防止重复触发.

收起阅读 »

关于荣耀Magic UI系列HBuilder真机调试检测不到解决办法

真机调试

magicOS9 ,刚更新的Hbuildrx4.57

手机电脑端都下载荣耀手机助手,用数据线连接

找到hbuilderx 工具-设置-运行配置-adb路径 换成HBuilderX目录下 plugins\launcher-tools\tools\adbs\1.0.36\adb.exe

USB连接方式-仅充电

开启了“仅充电”模式下允许ADB调试
选择待调试应用

打开hbuilderx 运行-运行到手机或模拟器-运行到Android App基座

摘自:水目

继续阅读 »

magicOS9 ,刚更新的Hbuildrx4.57

手机电脑端都下载荣耀手机助手,用数据线连接

找到hbuilderx 工具-设置-运行配置-adb路径 换成HBuilderX目录下 plugins\launcher-tools\tools\adbs\1.0.36\adb.exe

USB连接方式-仅充电

开启了“仅充电”模式下允许ADB调试
选择待调试应用

打开hbuilderx 运行-运行到手机或模拟器-运行到Android App基座

摘自:水目

收起阅读 »

部分条件下避坑u-parse

如果你是Vue2.0 配合uView1.0版本的话,在打包H5的时候一定要避坑“u-parse”打包H5的时候会自动打包出来一个wx.canIUse,这会导致H5内嵌到微信小程序的web-view时候出现“连接服务器超时,点击屏幕重试”

如果你是Vue2.0 配合uView1.0版本的话,在打包H5的时候一定要避坑“u-parse”打包H5的时候会自动打包出来一个wx.canIUse,这会导致H5内嵌到微信小程序的web-view时候出现“连接服务器超时,点击屏幕重试”