didi / mpx

Mpx,一款具有优秀开发体验和深度性能优化的增强型跨端小程序框架

Home Page:https://mpxjs.cn

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Bug report] Skyline 模式下 worklet 函数写在 composition api 的 setup 中不被触发,写在 methods 中可以触发

ItsRyanWu opened this issue · comments

问题描述
请用简洁的语言描述你遇到的bug,至少包括以下部分,如提供截图请尽量完整:

  1. 问题触发的条件
    Skyline 模式下 worklet 函数写在 composition api 下的 setup 中不被触发,写在 options api 下的 methods 对象中可以触发
  2. 期望的表现
    写在 setup 中也可以触发
  3. 实际的表现
    写在 setup 中不被触发

环境信息描述
至少包含以下部分:

  1. 系统类型(Mac或者Windows)
    macOS Sonoma 14.2
  2. Mpx依赖版本(@mpxjs/core、@mpxjs/webpack-plugin和@mpxjs/api-proxy的具体版本,可以通过package-lock.json或者实际去node_modules当中查看)
"dependencies": {
    "@mpxjs/api-proxy": "^2.9.0",
    "@mpxjs/core": "^2.9.0",
    "@mpxjs/fetch": "^2.9.0",
    "@mpxjs/pinia": "^2.9.0",
    "@mpxjs/store": "^2.9.0",
    "@mpxjs/utils": "^2.9.0",
    "pinia": "^2.0.14",
    "vue": "^2.7.0",
    "vue-demi": "^0.14.6",
    "vue-i18n": "^8.27.2",
    "vue-i18n-bridge": "^9.2.2",
    "vue-router": "^3.1.3"
  },
  1. 小程序开发者工具信息(小程序平台、开发者工具版本、基础库版本)
    基础库:3.3.2
image

最简复现demo
一般来说通过文字和截图的描述我们很难定位到问题,为了帮助我们快速定位问题并修复,请按照以下指南编写并上传最简复现demo:

  1. 根据现有项目遇到的问题,尝试精简代码,确定问题的最小复现条件
  2. 使用脚手架创建新项目,基于最小复现条件编写稳定的最简复现demo
  3. 删除项目中的node_modules部分,打包项目,并拖拽到issue输入框中上传(或提供远程可下载地址)

mpx-worklet-demo.zip

这个问题同微信确认目前没有支持,不过他们会考虑后续如何支持这种写法,在微信支持之前可以先用混合写法把worklet函数静态定义在methods中

@hiyuki 我这边还测试到 worklet 函数即使写在 methods 中,dev 模式可以,但 build 之后就不行了

这是因为terser默认会删除非标准的directives,可以更改terser配置规避这个问题:

new TerserPlugin({
  // terserOptions参考 https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
  terserOptions: {
    compress: {
      // terser的默认行为会把某些对象方法转为箭头函数,导致ios9等不支持箭头函数的环境白屏,详情见 https://github.com/terser/terser#compress-options
      arrows: false,
      // terser默认会删除非标准directive,为了保障skyline worklet的正常工作,需关闭该配置
      directives: false
    }
  }
}

我们更建议的做法是安装微信提供的babel插件,不仅可以规避上面这个问题,也不用依赖微信开发者工具的es5转义和worklet编译,插件地址:
https://www.npmjs.com/package/babel-plugin-worklet

感谢