feat: 打通 HBuilderX CLI 构建 + 修复文章闭环静态盲区

构建:
- 新增 tools/build.js:junction HBuilderX 工具链,CLI 构建 h5/mp-weixin
- vue 指向补丁版 @dcloudio/uni-h5-vue(官方 npm vue 不导出 isInSSRComponentSetup)
- 设 HX_APP_ROOT 避免退化成 H5 空壳产物;产物完整性校验

校验工具:
- 新增 check-cloud-methods.js:acorn 解析云对象方法,比对 94 处调用点
- 新增 check-android-contract.js:Kotlin 侧云对象契约校验
- audit-project.js 修 downloadFile 误报(注释未剥离);tools/ 排除出扫描
- package.json 声明此前隐式依赖的 acorn

功能:
- 补 uni-cms-articles.getPublishedArticles(安卓端依赖但此前不存在)
- 修 u-parse <audio> 引用已移除组件导致 H5 构建失败
This commit is contained in:
2026-09-12 01:02:45 +08:00
parent 4f5893f87a
commit 3117146281
26 changed files with 2043 additions and 337 deletions
@@ -45,8 +45,9 @@ export default {
this.className
]
},
styles () {
let style = this.data.data.style
styles () {
let style = this.data?.data?.style || ''
if (this.width) {
style += `;width:${this.width}px`
@@ -61,14 +62,16 @@ export default {
this.loadImagePath()
},
methods: {
async loadImagePath () {
const parseImages = await parseImageUrl({
insert: {image: this.data.data.value},
attributes: this.data.data.attributes,
}, "editor")
async loadImagePath () {
const value = this.data?.data?.value || ''
if (!value) return
const parseImages = await parseImageUrl({
insert: {image: value},
attributes: this.data?.data?.attributes || {},
}, "editor")
this.imagePath = parseImages[0].src
},
this.imagePath = parseImages?.[0]?.src || ''
},
imagePreview () {
uni.$emit('imagePreview', this.data.data.value)
},
@@ -1,6 +1,6 @@
<template>
<view class="content" :style="color">
<template v-for="op in content">
<view class="content" :style="{ color }">
<template v-for="(op, index) in content" :key="index">
<render-text
v-if="op.type === 'paragraph'"
:data="op.data"
@@ -8,7 +8,7 @@
:style="op.style"
></render-text>
<render-image
v-else-if="op.type === 'image' && op.data.length > 0"
v-else-if="op.type === 'image' && Array.isArray(op.data) && op.data.length > 0"
:data="op.data[0]"
:className="op.class"
:style="op.style"
@@ -83,16 +83,9 @@ export default {
mounted() {
this.initImage()
},
// #ifdef VUE2
beforeDestroy() {
uni.$off('imagePreview')
},
// #endif
// #ifdef VUE3
beforeUnmount () {
uni.$off('imagePreview')
},
// #endif
beforeUnmount () {
uni.$off('imagePreview', this.imagePreview)
},
methods: {
// 初始化图片
async initImage() {
@@ -104,7 +97,8 @@ export default {
}
// 监听图片预览
uni.$on('imagePreview', this.imagePreview)
uni.$off('imagePreview', this.imagePreview)
uni.$on('imagePreview', this.imagePreview)
},
// 点击图片预览
imagePreview(src) {
@@ -1,8 +1,11 @@
<template>
<view :class="['list', data.type]">
<view class="list-item" v-for="(item, index) in data.items">
<text class="dot">{{data.type === 'ordered' ? `${index + 1}.` : '&#8226'}}</text>
<render-text :data="item.data" reset class="reset-default"></render-text>
<view class="list-item" v-for="(item, index) in (data.items || [])" :key="index">
<text class="dot">{{data.type === 'ordered' ? `${index + 1}.` : '•'}}</text>
<view class="item-content">
<render-text :data="item.data || []" reset class="reset-default"></render-text>
<render-list v-if="item.children" :data="item.children"></render-list>
</view>
</view>
</view>
</template>
@@ -2,8 +2,8 @@
<view class="video">
<video
class="v"
:src="data.attributes.src"
:poster="data.attributes.poster"
:src="data.value || data.attributes?.src || ''"
:poster="data.attributes?.poster || ''"
></video>
</view>
</template>