retrocode
retrocode
  • 发布:2023-10-11 18:10
  • 更新:2024-01-16 11:41
  • 阅读:279

【报Bug】hbuilderX 3.8.12 构建项目输出代码与cli 3.8.12存在差异, hx中点击发布H5, tsconfig 的 useDefineForClassFields 未生效

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 11

HBuilderX类型: 正式

HBuilderX版本号: 3.8.12

手机系统: Android

手机系统版本号: Android 6.0

手机厂商: idata

手机机型: PDA

页面类型: vue

vue版本: vue3

打包方式: 云端

项目创建方式: HBuilderX

示例代码:
<script lang="ts" setup>  
import { onReady, onLoad } from '@dcloudio/uni-app'  
class A {  
  private a: string  
  public b: string  
  c: string  
  constructor() {  
    this.a = undefined  
    this.b = undefined  
    this.c = undefined  
  }  
}  
class B {  
  private a: string  
  public b: string  
  c: string  
}  
onLoad(() => {  
  // 期望结果: { a: undefined, b: undefined, c: undefined }  
  console.log(new A()) // 运行结果: {}  
  console.log(new B()) // 运行结果: {}  
})  
</script>

操作步骤:

编写一个class,并实例化

class B {  
  private a: string  
  public b: string  
  c: string  
}  
 // 期望结果: { a: undefined, b: undefined, c: undefined }  
 console.log(new A()) // 运行结果: {}

预期结果:

console.log(new A()) // { a: undefined, b: undefined, c: undefined }

实际结果:

console.log(new A()) // {}

bug描述:

经测试 hx 中构建的代码与 cli中构建的代码存在明显差异, 下列的bug在cli中不存在, 可以参考我最新上传demo项目
本机node版本: 16.17.0
cli版本: 3.8.12
hx版本: 3.8.12


tsconfig中已配置 useDefineForClassFields: true

{  
  "compilerOptions": {  
    "target": "esnext",  
    "module": "esnext",  
    "strict": true,  
    "jsx": "preserve",  
    "moduleResolution": "node",  
    "esModuleInterop": true,  
    "sourceMap": true,  
    "skipLibCheck": true,  
    "importHelpers": true,  
    "allowSyntheticDefaultImports": true,  
    "useDefineForClassFields": true,  
    "resolveJsonModule": true,  
    "lib": ["esnext", "dom"],  
    "types": ["@dcloudio/types"]  
  },  
  "exclude": ["node_modules", "unpackage"]  
}

但 new 对象后的实例中依旧没有 相关属性, 按理此时结果应为 { a: undefined, b: undefined, c: undefined }

因项目中存在通过

if (key in obj) {  
   obj[key] = xxx  
}

类的序列化操作, 所以实例内至少得存在该属性, 即使为undefined

测试项目在附件中

2023-10-11 18:10 负责人:无 分享
已邀请:
retrocode

retrocode (作者) - 现已加入旺旺大礼包全家桶

完全无人回复吗

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

感谢反馈,久等了。我使用新版本 hbuiderx 未能复现你的问题,可能是后续修复了这个问题。如果你还有问题,可以 reopen 继续反馈 ❤️

  • retrocode (作者)

    你好, 我使用最新的 HX3.98 正式版测试问题依然存在, 应该是我没描述清楚的问题, 直接在HX里运行项目是没问题的, 但是发布H5, build之后生成的代码有这个问题, 可以参考我下列的图片

    2024-01-15 16:49

retrocode

retrocode (作者) - 现已加入旺旺大礼包全家桶

你好, 我使用最新的 HX3.98 正式版测试问题依然存在, 应该是我没描述清楚的问题, 直接在HX里运行项目是没问题的, 但是发布H5, build之后生成的代码有这个问题, 可以参考我下列的图片

DCloud_UNI_OttoJi

DCloud_UNI_OttoJi - 日常回复 uni-app/x 问题,如果艾特我没看到,请主动私信

我按照下面步骤操作:

  1. 安装 3.99 hbuilderx
  2. 下载 解压 导入你提供的 zip 文件夹
  3. 执行 npm i
  4. 执行 npx AT dcoudio/uvmATlatest 安装最新版的依赖
  5. dev 运行 h5 ,build 运行 h5

看下图,结果相同。你按照我的操作试试,用你提供的源码

  • retrocode (作者)

    cli版是没问题的, 主要问题在 hx 内, 也就是你打开项目不用 npm install , 而是直接把 src 文件夹拖到 hbuilderX 内, 运行也是没问题的, 仅也仅在 直接用 hbuilderX 内的 发行 => H5 编译, 生成的代码有问题, 运行到内置浏览器都是OK的, 我在下面增加了 截图, 和一个2分钟的录屏演示, 你可以看下.

    2024-01-16 11:42

  • retrocode (作者)

    主要如果是H5还好解决, 直接用 cli 版就好, 这个问题我最初弄纯nvue的app端发现的, 在纯nvue的app上也有这个问题, 我复现后发现 h5上也有相同问题, 就提的 H5了, app牵扯到云打包/插件这些, 必须使用 hx内的 发行功能打包, 所以不得不解决这个问题

    2024-01-16 11:45

retrocode

retrocode (作者) - 现已加入旺旺大礼包全家桶

cli版是没问题的, 主要问题在 hx 内, 也就是你打开项目不用 npm install , 而是直接把 src 文件夹拖到 hbuilderX 内, 运行也是没问题的, 仅也仅在 直接用hbuilderX 内的 发行 => H5 编译, 生成的代码有问题, 运行到内置浏览器都是OK的

下面这个截图是, 我用cli版的 npm run build:h5 编译, 和把 src拖到 hx 内用 发行 => H5 编译, 产生结果对比, Hx的结果是有问题的.

我录制了一个视频, 也许能让你更好的理解我这个bug, 已经更新到 hx 3.99 版了
https://test.retrocode.io/20240116_112614.mp4

要回复问题请先登录注册