HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

一个用于压缩小程序 JSON 文件的 unplugin 插件,支持 webpack 和 vite

体积优化 uni-app uni-app-x 小程序

@uni_toolkit/unplugin-compress-json

一个用于压缩 JSON 文件的 unplugin 插件,可用于减小小程序端产物体积,支持 Vite、Webpack 主流构建工具。

功能特性

  • 🗜️ 自动压缩 - 自动移除 JSON 文件中的空白字符和换行符
  • 🔧 多构建工具支持 - 支持 Vite、Webpack、Rollup 等构建工具
  • 零配置 - 开箱即用,无需额外配置
  • 🎯 精确匹配 - 只处理 .json 文件,不影响其他资源

安装

# npm  
npm install @uni_toolkit/unplugin-compress-json -D  

# yarn  
yarn add @uni_toolkit/unplugin-compress-json -D  

# pnpm  
pnpm add @uni_toolkit/unplugin-compress-json -D

使用方法

Vite

// vite.config.js  
import { defineConfig } from 'vite'  
import CompressJson from '@uni_toolkit/unplugin-compress-json/vite'  
import uni from '@dcloudio/vite-plugin-uni'  

export default defineConfig({  
  plugins: [  
    uni(),  
    CompressJson(),  
  ],  
})

Vue CLI

// vue.config.js  
const CompressJson = require('@uni_toolkit/unplugin-compress-json/webpack')  

module.exports = {  
  configureWebpack: {  
    plugins: [  
      CompressJson(),  
    ],  
  },  
}

工作原理

插件会在构建过程中自动检测所有 .json 文件,并移除其中的:

  • 空格
  • 制表符
  • 换行符
  • 其他空白字符

压缩前:

{  
  "name": "example",  
  "version": "1.0.0",  
  "description": "这是一个示例"  
}

压缩后:

{"name":"example","version":"1.0.0","description":"这是一个示例"}

注意事项

  • 插件只处理构建输出中的 .json 文件
  • 不会修改源代码文件
  • 适用于生产环境构建,可以减小打包体积
继续阅读 »

@uni_toolkit/unplugin-compress-json

一个用于压缩 JSON 文件的 unplugin 插件,可用于减小小程序端产物体积,支持 Vite、Webpack 主流构建工具。

功能特性

  • 🗜️ 自动压缩 - 自动移除 JSON 文件中的空白字符和换行符
  • 🔧 多构建工具支持 - 支持 Vite、Webpack、Rollup 等构建工具
  • 零配置 - 开箱即用,无需额外配置
  • 🎯 精确匹配 - 只处理 .json 文件,不影响其他资源

安装

# npm  
npm install @uni_toolkit/unplugin-compress-json -D  

# yarn  
yarn add @uni_toolkit/unplugin-compress-json -D  

# pnpm  
pnpm add @uni_toolkit/unplugin-compress-json -D

使用方法

Vite

// vite.config.js  
import { defineConfig } from 'vite'  
import CompressJson from '@uni_toolkit/unplugin-compress-json/vite'  
import uni from '@dcloudio/vite-plugin-uni'  

export default defineConfig({  
  plugins: [  
    uni(),  
    CompressJson(),  
  ],  
})

Vue CLI

// vue.config.js  
const CompressJson = require('@uni_toolkit/unplugin-compress-json/webpack')  

module.exports = {  
  configureWebpack: {  
    plugins: [  
      CompressJson(),  
    ],  
  },  
}

工作原理

插件会在构建过程中自动检测所有 .json 文件,并移除其中的:

  • 空格
  • 制表符
  • 换行符
  • 其他空白字符

压缩前:

{  
  "name": "example",  
  "version": "1.0.0",  
  "description": "这是一个示例"  
}

压缩后:

{"name":"example","version":"1.0.0","description":"这是一个示例"}

注意事项

  • 插件只处理构建输出中的 .json 文件
  • 不会修改源代码文件
  • 适用于生产环境构建,可以减小打包体积
收起阅读 »

【经验】pc微信小程序监听窗口状态:最小化、显示、失焦聚焦

微信小程序

文档地址:
wx.onWindowStateChange监听小程序窗口状态变化事件。仅适用于 PC 平台
wx.offWindowStateChange移除小程序窗口状态变化事件的监听函数

// #ifdef MP-WEIXIN  
// 监听小程序窗口状态变化事件。仅适用于 PC 平台;建议在onLoad生命周期下添加监听  
if (wx.onWindowStateChange) {  
    wx.onWindowStateChange(function(res) {  
        /**  
         * @param {string} res.state  
         * blur:窗口失焦  
         * minimize:窗口最小化  
         * normal:窗口最小化后,再次打开小程序  
         * focus:窗口聚焦  
         */  
    });  
}  
// 移除小程序窗口状态变化事件的监听函数;建议在onUnload生命周期下移除  
if (wx.offWindowStateChange) {  
    wx.offWindowStateChange();  
}  
// #endif
继续阅读 »

文档地址:
wx.onWindowStateChange监听小程序窗口状态变化事件。仅适用于 PC 平台
wx.offWindowStateChange移除小程序窗口状态变化事件的监听函数

// #ifdef MP-WEIXIN  
// 监听小程序窗口状态变化事件。仅适用于 PC 平台;建议在onLoad生命周期下添加监听  
if (wx.onWindowStateChange) {  
    wx.onWindowStateChange(function(res) {  
        /**  
         * @param {string} res.state  
         * blur:窗口失焦  
         * minimize:窗口最小化  
         * normal:窗口最小化后,再次打开小程序  
         * focus:窗口聚焦  
         */  
    });  
}  
// 移除小程序窗口状态变化事件的监听函数;建议在onUnload生命周期下移除  
if (wx.offWindowStateChange) {  
    wx.offWindowStateChange();  
}  
// #endif
收起阅读 »

个人全职接单,时间充裕,诚心全职开发,期待合作!!!

编译 uniapp uni_app项目 招聘与外包 外包接单 外包

全栈经验,这方面的软件开发的比较多,有相关案例,时间充裕,诚心合作,个人全职工作。uniapp 做过很多,十分熟练,有需要请联系我 V:zwwz123123
同行勿扰谢谢.

全栈经验,这方面的软件开发的比较多,有相关案例,时间充裕,诚心合作,个人全职工作。uniapp 做过很多,十分熟练,有需要请联系我 V:zwwz123123
同行勿扰谢谢.

uni-app差异性问题记录(个人记录)

uni-app

原生标签

input元素编译后的结构(251002)

浏览器和微信小程序编译后的DOM结构有区别,需要注意样式的使用可能会引起兼容性问题

# 源文件  
input  

# 编译到浏览器  
uni-input  
  div.uni-input-wrapper  
    div.uni-input-placeholder  
    input.uni-input-input  

# 编译到微信小程序  
input

input元素的align-items属性(251008)

当给input元素添加display:flex; align-items: center;属性后,微信开发者工具/安卓小程序和苹果小程序显示不一致,前者的palceholder并未垂直居中,而是靠顶部对齐,后者则不受影响。
最好是不要给input元素设置flex相关属性,避免兼容性问题

# 微信小程序开发者工具agent  
userAgent: "wechatdevtools desktopapp appservice port/50966 token/e995b79e6bfb4535967abddb723dda7a runtime/2 sessionid/323 MicroMessenger"  

# 安卓小程序agent  
UA: Mozilla/5.0 (Linux; Android 13; ANY-AN00 Build/HONORANY-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.180 Mobile Safari/537.36 XWEB/1380215 MMWEBSDK/20250804 MMWEBID/5667 MicroMessenger/8.0.63.2920(0x28003F3C) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android  

# 苹果小程序agent  
UA: Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.64(0x18004028) NetType/WIFI Language/zh_CN MiniProgramEnv/iOS

button元素编译后的结构(251012)

浏览器和小程序环境编译后的标签名不一致,需要注意可访问性以及样式兼容性的问题

  • tailwindcss中的disabled状态会失效,因为uni-button没有disabled属性
# 源文件  
button  

# 编译到浏览器  
uni-button  
  ::after  

# 编译到小程序  
button  
  ::after # 这个是由微信注入

自定义组件

自定义组件DOM结构(251002)

浏览器和微信小程序编译后的DOM结构有区别,需要注意样式的使用可能会引起兼容性问题

# 源文件  
# components/simple-demo/simple-demo.vue  
view  

# 编译到浏览器  
uni-view data-v-xxx  

# 编译到微信开发者工具  
components/simple-demo/simple-demo class=data-v-xxx  
  #shadow-root  
    view  

# 编译到微信小程序  
simple-demo class=data-v-xxx ul="xxx" uP=undefined  
  Shadow Root  
    view

自定义组件根节点样式(251011)

自定义组件上的class在浏览器环境中会被编译到组件的根节点上,微信小程序环境中会被编译到新创建的组件节点上,uniapp暂不支持虚拟化这个组件节点
需要由外部控制自定义组件根节点样式的场景下,需要显式声明一个rootClass属性,避免样式冲突

# 源文件  
# components/simple-demo/simple-demo.vue  
view.example  

# 编译到浏览器  
uni-view.example  

# 编译到微信开发者工具  
components/simple-demo/simple-demo.example  
  #shadow-root  
    view  

# 编译到微信小程序  
simple-demo.example  
  Shadow Root  
    view

参考:

vue语法

App.vue(251006)

App.vue中的template模块无论是在小程序环境,还是在浏览器环境,会被忽略,不会被构建到page中渲染
注入全局组件只能通过自定义vite插件实现

全局函数

getCurrentPages在小程序环境下不支持options选项(251012)

想要实现多端能用的useQuery逻辑,目前只能通过页面的onLoad事件实现

参考:

第3方依赖

weapp-tailwindcss/vite(251012)

.py,.px编译后浏览器和小程序环境语法不一致,需要注意文字竖向书写时的兼容问题

# 源代码  
.py-2  

# 编译到浏览器环境  
.py-2 {  
  padding-block: calc(var(--spacing) * 2)  
}  

# 编译到小程序环境  
.py-2 {  
  padding-top: 8rpx;  
  padding-bottom: 8rpx;  
}
继续阅读 »

uni-app

原生标签

input元素编译后的结构(251002)

浏览器和微信小程序编译后的DOM结构有区别,需要注意样式的使用可能会引起兼容性问题

# 源文件  
input  

# 编译到浏览器  
uni-input  
  div.uni-input-wrapper  
    div.uni-input-placeholder  
    input.uni-input-input  

# 编译到微信小程序  
input

input元素的align-items属性(251008)

当给input元素添加display:flex; align-items: center;属性后,微信开发者工具/安卓小程序和苹果小程序显示不一致,前者的palceholder并未垂直居中,而是靠顶部对齐,后者则不受影响。
最好是不要给input元素设置flex相关属性,避免兼容性问题

# 微信小程序开发者工具agent  
userAgent: "wechatdevtools desktopapp appservice port/50966 token/e995b79e6bfb4535967abddb723dda7a runtime/2 sessionid/323 MicroMessenger"  

# 安卓小程序agent  
UA: Mozilla/5.0 (Linux; Android 13; ANY-AN00 Build/HONORANY-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/138.0.7204.180 Mobile Safari/537.36 XWEB/1380215 MMWEBSDK/20250804 MMWEBID/5667 MicroMessenger/8.0.63.2920(0x28003F3C) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android  

# 苹果小程序agent  
UA: Mozilla/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.64(0x18004028) NetType/WIFI Language/zh_CN MiniProgramEnv/iOS

button元素编译后的结构(251012)

浏览器和小程序环境编译后的标签名不一致,需要注意可访问性以及样式兼容性的问题

  • tailwindcss中的disabled状态会失效,因为uni-button没有disabled属性
# 源文件  
button  

# 编译到浏览器  
uni-button  
  ::after  

# 编译到小程序  
button  
  ::after # 这个是由微信注入

自定义组件

自定义组件DOM结构(251002)

浏览器和微信小程序编译后的DOM结构有区别,需要注意样式的使用可能会引起兼容性问题

# 源文件  
# components/simple-demo/simple-demo.vue  
view  

# 编译到浏览器  
uni-view data-v-xxx  

# 编译到微信开发者工具  
components/simple-demo/simple-demo class=data-v-xxx  
  #shadow-root  
    view  

# 编译到微信小程序  
simple-demo class=data-v-xxx ul="xxx" uP=undefined  
  Shadow Root  
    view

自定义组件根节点样式(251011)

自定义组件上的class在浏览器环境中会被编译到组件的根节点上,微信小程序环境中会被编译到新创建的组件节点上,uniapp暂不支持虚拟化这个组件节点
需要由外部控制自定义组件根节点样式的场景下,需要显式声明一个rootClass属性,避免样式冲突

# 源文件  
# components/simple-demo/simple-demo.vue  
view.example  

# 编译到浏览器  
uni-view.example  

# 编译到微信开发者工具  
components/simple-demo/simple-demo.example  
  #shadow-root  
    view  

# 编译到微信小程序  
simple-demo.example  
  Shadow Root  
    view

参考:

vue语法

App.vue(251006)

App.vue中的template模块无论是在小程序环境,还是在浏览器环境,会被忽略,不会被构建到page中渲染
注入全局组件只能通过自定义vite插件实现

全局函数

getCurrentPages在小程序环境下不支持options选项(251012)

想要实现多端能用的useQuery逻辑,目前只能通过页面的onLoad事件实现

参考:

第3方依赖

weapp-tailwindcss/vite(251012)

.py,.px编译后浏览器和小程序环境语法不一致,需要注意文字竖向书写时的兼容问题

# 源代码  
.py-2  

# 编译到浏览器环境  
.py-2 {  
  padding-block: calc(var(--spacing) * 2)  
}  

# 编译到小程序环境  
.py-2 {  
  padding-top: 8rpx;  
  padding-bottom: 8rpx;  
}
收起阅读 »

关于uni-app 在vue3版本下在renderjs引入three.js使用报错TypeError: ‘get‘ on proxy: property ‘modelViewMatrix‘的解决方法

vue3

标题

  • 关于uni-app 在vue3版本下在renderjs引入three.min.js使用renderer.render(scene, camera);报错TypeError: ‘get‘ on proxy: property ‘modelViewMatrix‘ is a read-only and non-configurable data property的解决方法

问题描述

  • 我在uni-app vue3版本下在renderjs中引入three.min.js,实现360全景视频播放,播放功能是封装好的,在vue2版本下是能正常使用的,但在vue3版本下会报错TypeError: ‘get‘ on proxy: property ‘modelViewMatrix‘ is a read-only and non-configurable data property........
  • 在网上搜索,发现是vue3的proxy的锅,因为three.js内部一些变量使用Object.defineProperty来定义的,这样就被vue3抓到了,给处理成成了响应式,但three.js内部自有一套变量响应,导致冲突,大概原因就是这样具体看这里

    网上传的解决办法

  • 都说是不要在data函数或者用reactive定义变量来存储three实例化后的对象,直接用全局变量接收,比如:
//这样是错误的,会导致报错  
let data = reactive({  
  scene: null  
})
//正确的定义方法  
let scene = null
  • 这种方法行不行,我也不清楚,因为renderjs是不支持组合api语法的,而且我是使用封装的类来调用three.js的,根本没用vue的变量接收实例化对象,所以这种方式对我没用

尝试解决办法

  • 我在找资料时,无意间看到一篇文章Bpmn.js 使用【问题?解决】,虽然和three.js无关,但好像和我的问题有点类似,他的解决方法为:
    // 我的解决是:引入Modeler的文件,importXML时 modeler使用toRaw包一下。并且在使用modeling.updateProperties更新元素属性时,将this.element也使用toRaw包一下:toRaw(this.element)  
    updateProperties(properties) {  
     const modeling = toRaw(this.modeler).get("modeling");  
     modeling.updateProperties(toRaw(this.element), properties);  
    }
  • 于是我也尝试引入vue3的toRaw在render的时候包裹一下:
    //在renderjs下引入toRaw   
    import { toRaw } from 'vue'  
    export default {  
    mounted () {  
    window.toRaw = toRaw//需要挂载到window对象上,不然类里面调用不到  
    }  
    }
    //在我的类里面,调用toRaw  
    const scene = window.toRaw ? window.toRaw(this.secne) : this.scene  
    this.renderer.render(scene, this.camera);
  • 该方式确实可以解决我的问题,但只支持h5,因为在app vue3 renderjs下使用import { toRaw } from 'vue',会报错could not resolve ‘vue’,这下就卡住了。

最终解决办法

  • 既然toRaw在app当中引入不了,那我自己实现一个toRaw行不行?说干就干,定位到toRaw的源码,发现结构为:
    function toRaw (observed) {  
    const raw = observed && observed["__v_raw"]  ? observed["__v_raw"] : observed  
    return raw ? toRaw(raw) : observed   
    }
  • 意外是个很简单的代码,判断传入的值有没有__v_raw属性,如果有返回该属性值,如果没有返回传入的值
  • 这样解决起来就很简单了:
    const scene = this.scene["__v_raw"] ? this.scene["__v_raw"] : this.scene  
    this.renderer.render(scene, this.camera);
  • 这样app和h5都没问题了
继续阅读 »

标题

  • 关于uni-app 在vue3版本下在renderjs引入three.min.js使用renderer.render(scene, camera);报错TypeError: ‘get‘ on proxy: property ‘modelViewMatrix‘ is a read-only and non-configurable data property的解决方法

问题描述

  • 我在uni-app vue3版本下在renderjs中引入three.min.js,实现360全景视频播放,播放功能是封装好的,在vue2版本下是能正常使用的,但在vue3版本下会报错TypeError: ‘get‘ on proxy: property ‘modelViewMatrix‘ is a read-only and non-configurable data property........
  • 在网上搜索,发现是vue3的proxy的锅,因为three.js内部一些变量使用Object.defineProperty来定义的,这样就被vue3抓到了,给处理成成了响应式,但three.js内部自有一套变量响应,导致冲突,大概原因就是这样具体看这里

    网上传的解决办法

  • 都说是不要在data函数或者用reactive定义变量来存储three实例化后的对象,直接用全局变量接收,比如:
//这样是错误的,会导致报错  
let data = reactive({  
  scene: null  
})
//正确的定义方法  
let scene = null
  • 这种方法行不行,我也不清楚,因为renderjs是不支持组合api语法的,而且我是使用封装的类来调用three.js的,根本没用vue的变量接收实例化对象,所以这种方式对我没用

尝试解决办法

  • 我在找资料时,无意间看到一篇文章Bpmn.js 使用【问题?解决】,虽然和three.js无关,但好像和我的问题有点类似,他的解决方法为:
    // 我的解决是:引入Modeler的文件,importXML时 modeler使用toRaw包一下。并且在使用modeling.updateProperties更新元素属性时,将this.element也使用toRaw包一下:toRaw(this.element)  
    updateProperties(properties) {  
     const modeling = toRaw(this.modeler).get("modeling");  
     modeling.updateProperties(toRaw(this.element), properties);  
    }
  • 于是我也尝试引入vue3的toRaw在render的时候包裹一下:
    //在renderjs下引入toRaw   
    import { toRaw } from 'vue'  
    export default {  
    mounted () {  
    window.toRaw = toRaw//需要挂载到window对象上,不然类里面调用不到  
    }  
    }
    //在我的类里面,调用toRaw  
    const scene = window.toRaw ? window.toRaw(this.secne) : this.scene  
    this.renderer.render(scene, this.camera);
  • 该方式确实可以解决我的问题,但只支持h5,因为在app vue3 renderjs下使用import { toRaw } from 'vue',会报错could not resolve ‘vue’,这下就卡住了。

最终解决办法

  • 既然toRaw在app当中引入不了,那我自己实现一个toRaw行不行?说干就干,定位到toRaw的源码,发现结构为:
    function toRaw (observed) {  
    const raw = observed && observed["__v_raw"]  ? observed["__v_raw"] : observed  
    return raw ? toRaw(raw) : observed   
    }
  • 意外是个很简单的代码,判断传入的值有没有__v_raw属性,如果有返回该属性值,如果没有返回传入的值
  • 这样解决起来就很简单了:
    const scene = this.scene["__v_raw"] ? this.scene["__v_raw"] : this.scene  
    this.renderer.render(scene, this.camera);
  • 这样app和h5都没问题了
收起阅读 »

uni.request的配置参数中,enableChunked: true时,返回值RequestTask的abort方法,无法中断网络请求。

uni.request

普通网络请求,没配置enableChunked时:

配置enableChunked时:

使用abort()方法后:

页面上的ai回答内容没有再继续了,但是network中的网络请求仍在继续请求,一直到请求完成。

有没有大佬遇到过这种情况,怎么解决!这个算bug吗

继续阅读 »

普通网络请求,没配置enableChunked时:

配置enableChunked时:

使用abort()方法后:

页面上的ai回答内容没有再继续了,但是network中的网络请求仍在继续请求,一直到请求完成。

有没有大佬遇到过这种情况,怎么解决!这个算bug吗

收起阅读 »

[Android] Android 端 Weex 框架适配 16KB PageSize,经验分享

16KB GooglePlay uni_app weex Android

Google Play 要求以 Android 15 及更高版本为目标平台的应用支持 16 KB 内存页面大小。

目前阿里开源的 Weex 跨端开发框架没有做适配,会导致 GooglePlay 上架和更新时报警告。Uniapp 也使用了 Weex,所以理论上应该也需要做适配。所以发到这里分享一下,欢迎大家沟通交流。

之前有人在 Weex 项目里提过 issue,但都没有得到回复,目前阿里那边应该是没人跟进这个项目了。本着自己动手丰衣足食的原则,我自己克隆源码搞了一下。现在已经跑通,准备把这个东西开源分享出来,也给社区做点贡献😁 如果能帮到 Uniapp 社区的大家解决技术问题,那就更好了😁(开源精神,源神,启动!😂)

目前已经给 Weex 开源库提交了 pull request (https://github.com/alibaba/weex/pull/3365)
也可以直接克隆我 Fork 出来的仓库(https://github.com/ShadowJoker/weex-16kb)

本项目是基于原版 Weex 项目 Fork 出来的。仅做了编译配置修改,和极少的 C++ 语法适配性修改。没有修改 Weex 的代码逻辑,理论上不会影响 Weex 的功能。

主要改动点

  • 升级 NDK 27,适配 16KB PageSize
  • 更新 ReactNative 发布的最新 JSCore,适配 16KB PageSize
  • 配套工具链升级,Gradle配置修改
  • C++ 代码修改,由于升级 NDK 27,部分老代码需要做调整

编译环境需求

  • Java 17
  • NDK 27.1.12297006
  • CMake 3.22.1
  • Gradle 8.10.2
  • APG 8.7.2

编译步骤

  1. 首先确保环境正确,各工具的版本严格符合编译环境说明
  2. 进入到工程中 android 路径下(可以直接使用 AndroidStudio 打开这个路径,这是一个标准的Android工程)
  3. 执行 ./gradlew assembleRelease 编译项目
  4. 编译完成后,在 android/sdk/build/outputs/aar 目录下会生成 aar 文件。
  5. 在自己的项目中使用这个 AAR 作为 Weex SDK。

注意事项

如果集成 AAR 包以后,启动闪退,可能是由于 libc++shared.so 版本不一致问题。Weex AAR 包中包含了 libc++shared.so,需要确保 App 使用相同的版本和这个相同。

继续阅读 »

Google Play 要求以 Android 15 及更高版本为目标平台的应用支持 16 KB 内存页面大小。

目前阿里开源的 Weex 跨端开发框架没有做适配,会导致 GooglePlay 上架和更新时报警告。Uniapp 也使用了 Weex,所以理论上应该也需要做适配。所以发到这里分享一下,欢迎大家沟通交流。

之前有人在 Weex 项目里提过 issue,但都没有得到回复,目前阿里那边应该是没人跟进这个项目了。本着自己动手丰衣足食的原则,我自己克隆源码搞了一下。现在已经跑通,准备把这个东西开源分享出来,也给社区做点贡献😁 如果能帮到 Uniapp 社区的大家解决技术问题,那就更好了😁(开源精神,源神,启动!😂)

目前已经给 Weex 开源库提交了 pull request (https://github.com/alibaba/weex/pull/3365)
也可以直接克隆我 Fork 出来的仓库(https://github.com/ShadowJoker/weex-16kb)

本项目是基于原版 Weex 项目 Fork 出来的。仅做了编译配置修改,和极少的 C++ 语法适配性修改。没有修改 Weex 的代码逻辑,理论上不会影响 Weex 的功能。

主要改动点

  • 升级 NDK 27,适配 16KB PageSize
  • 更新 ReactNative 发布的最新 JSCore,适配 16KB PageSize
  • 配套工具链升级,Gradle配置修改
  • C++ 代码修改,由于升级 NDK 27,部分老代码需要做调整

编译环境需求

  • Java 17
  • NDK 27.1.12297006
  • CMake 3.22.1
  • Gradle 8.10.2
  • APG 8.7.2

编译步骤

  1. 首先确保环境正确,各工具的版本严格符合编译环境说明
  2. 进入到工程中 android 路径下(可以直接使用 AndroidStudio 打开这个路径,这是一个标准的Android工程)
  3. 执行 ./gradlew assembleRelease 编译项目
  4. 编译完成后,在 android/sdk/build/outputs/aar 目录下会生成 aar 文件。
  5. 在自己的项目中使用这个 AAR 作为 Weex SDK。

注意事项

如果集成 AAR 包以后,启动闪退,可能是由于 libc++shared.so 版本不一致问题。Weex AAR 包中包含了 libc++shared.so,需要确保 App 使用相同的版本和这个相同。

收起阅读 »

微信、支付宝、抖音等小程序支持自定义 componentPlaceholder

uni-app x uniapp 微信小程序 支付宝小程序 抖音小程序 小红书小程序

背景

微信小程序支持 跨分包自定义组件引用,但是 uniapp 目前只支持在 pages.json 下的页面中配置 componentPlaceholder, 并不支持在某个具体的组件中添加此配置。

可以通过这个 插件 来解决此问题,支持 cli项目 和 hx项目

Vue3

安装

npm install @uni_toolkit/vite-plugin-component-config -D  
# 或  
pnpm add @uni_toolkit/vite-plugin-component-config -D  
# 或  
yarn add @uni_toolkit/vite-plugin-component-config -D

使用方法

配置 vite.config.js

// vite.config.js  
import { defineConfig } from 'vite'  
import uni from '@dcloudio/vite-plugin-uni'  
import componentConfig from '@uni_toolkit/vite-plugin-component-config'  

export default defineConfig({  
  plugins: [  
    componentConfig(), // 在 uni 插件之前调用  
    uni(),  
  ]  
})

修改 Vue 文件

<template>  
  <view class="container">  
    <text>Hello World</text>  
  </view>  
</template>  

<script>  
export default {  
  name: 'MyComponent'  
}  
</script>  

<component-config>  
// 此处必须是标准的 json 对象  
{  
  "usingComponents": {  
    "custom-button": "/components/custom-button"  
  },  
  "componentPlaceholder": {  
    "test": "view",  
  }  
}  
</component-config>

Vue2

安装

npm install @uni_toolkit/webpack-plugin-component-config -D  
# 或  
pnpm add @uni_toolkit/webpack-plugin-component-config -D  
# 或  
yarn add @uni_toolkit/webpack-plugin-component-config -D

使用方法

配置 vue.config.js

const WebpackComponentConfigPlugin = require('@uni_toolkit/webpack-plugin-component-config').default;  

module.exports = {  
  configureWebpack: {  
    plugins: [  
      new WebpackComponentConfigPlugin()  
    ]  
  }  
};

修改 Vue 文件

<template>  
  <view class="container">  
    <text>Hello World</text>  
  </view>  
</template>  

<script>  
export default {  
  name: 'MyComponent'  
}  
</script>  

<component-config>  
// 此处必须是标准的 json 对象  
{  
  "usingComponents": {  
    "custom-button": "/components/custom-button"  
  },  
  "componentPlaceholder": {  
    "test": "view",  
  }  
}  
</component-config>
继续阅读 »

背景

微信小程序支持 跨分包自定义组件引用,但是 uniapp 目前只支持在 pages.json 下的页面中配置 componentPlaceholder, 并不支持在某个具体的组件中添加此配置。

可以通过这个 插件 来解决此问题,支持 cli项目 和 hx项目

Vue3

安装

npm install @uni_toolkit/vite-plugin-component-config -D  
# 或  
pnpm add @uni_toolkit/vite-plugin-component-config -D  
# 或  
yarn add @uni_toolkit/vite-plugin-component-config -D

使用方法

配置 vite.config.js

// vite.config.js  
import { defineConfig } from 'vite'  
import uni from '@dcloudio/vite-plugin-uni'  
import componentConfig from '@uni_toolkit/vite-plugin-component-config'  

export default defineConfig({  
  plugins: [  
    componentConfig(), // 在 uni 插件之前调用  
    uni(),  
  ]  
})

修改 Vue 文件

<template>  
  <view class="container">  
    <text>Hello World</text>  
  </view>  
</template>  

<script>  
export default {  
  name: 'MyComponent'  
}  
</script>  

<component-config>  
// 此处必须是标准的 json 对象  
{  
  "usingComponents": {  
    "custom-button": "/components/custom-button"  
  },  
  "componentPlaceholder": {  
    "test": "view",  
  }  
}  
</component-config>

Vue2

安装

npm install @uni_toolkit/webpack-plugin-component-config -D  
# 或  
pnpm add @uni_toolkit/webpack-plugin-component-config -D  
# 或  
yarn add @uni_toolkit/webpack-plugin-component-config -D

使用方法

配置 vue.config.js

const WebpackComponentConfigPlugin = require('@uni_toolkit/webpack-plugin-component-config').default;  

module.exports = {  
  configureWebpack: {  
    plugins: [  
      new WebpackComponentConfigPlugin()  
    ]  
  }  
};

修改 Vue 文件

<template>  
  <view class="container">  
    <text>Hello World</text>  
  </view>  
</template>  

<script>  
export default {  
  name: 'MyComponent'  
}  
</script>  

<component-config>  
// 此处必须是标准的 json 对象  
{  
  "usingComponents": {  
    "custom-button": "/components/custom-button"  
  },  
  "componentPlaceholder": {  
    "test": "view",  
  }  
}  
</component-config>
收起阅读 »

【分享经验】windows11家庭版开启Hyper-V,运行到DevEco Studio前提需要

鸿蒙模拟器

来源:https://zhuanlan.zhihu.com/p/4203312229

1、在电脑桌面创建“Hyper-V Installer.txt”文本文档

2、将下面内容粘贴到“Hyper-V Installer.txt”中

pushd "%~dp0"  
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt  
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"  
del hyper-v.txt  
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

3、将“Hyper-V Installer.txt”的文件名修改为“Hyper-V Installer.cmd”

4、右键“Hyper-V Installer.cmd”选择以管理员身份运行

5、cmd显示“是否立即重启计算机?(Y/N)”,输入“Y”重启电脑

6、重启完电脑后,打开控制面板--->程序--->启用或关闭Windows功能--->勾选“Hyper-V”---->点击“确定”按钮

继续阅读 »

来源:https://zhuanlan.zhihu.com/p/4203312229

1、在电脑桌面创建“Hyper-V Installer.txt”文本文档

2、将下面内容粘贴到“Hyper-V Installer.txt”中

pushd "%~dp0"  
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt  
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"  
del hyper-v.txt  
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

3、将“Hyper-V Installer.txt”的文件名修改为“Hyper-V Installer.cmd”

4、右键“Hyper-V Installer.cmd”选择以管理员身份运行

5、cmd显示“是否立即重启计算机?(Y/N)”,输入“Y”重启电脑

6、重启完电脑后,打开控制面板--->程序--->启用或关闭Windows功能--->勾选“Hyper-V”---->点击“确定”按钮

收起阅读 »

参数错误,请通过HBuilder打开 pwd

云打包 阿里云OSS

参数错误,请通过HBuilder打开 pwd 请问有没有大佬知道如何解决?

参数错误,请通过HBuilder打开 pwd 请问有没有大佬知道如何解决?

谷歌上架提示,应用必须支持 16 KB 的内存页面大小

应用上架

如题所示,看附加图片,最后期限11月1日,如何解决该问题?

如题所示,看附加图片,最后期限11月1日,如何解决该问题?