`??` 属于 ES2020 非 ES5 但是 uni-app 编译后 vendor.js 未将其转换为 ES5

?? 属于 ES2020 非 ES5 但是 uni-app 编译后 vendor.js 未将其转换为 ES5

开发环境 版本号 项目创建方式
Windows Windows 10 22H2 19045.5965 HBuilderX
HBuilderX 4.66 -
第三方开发者工具 1.06.2503300 win32-x64 -
基础库 3.8.8 -

产品分类:uniapp/小程序/微信

操作步骤:

function durationToMillis(matrix, vals) {  
  let sum = vals.milliseconds ?? 0;  
  for (const unit of reverseUnits.slice(1)) {  
    if (vals[unit]) {  
      sum += vals[unit] * matrix[unit]["milliseconds"];  
    }  
  }  
  return sum;  
}

预期结果:

`vals.milliseconds ?? 0` 这段代码应被编译为 `vals.milliseconds === null || vals.milliseconds === undefined ? 0 : vals.milliseconds`

实际结果:

实际上并未被转义

bug描述:

如题。
这会导致微信小程序代码上传报错:`SyntaxError: Unexpected token ? ...`

更多关于`??` 属于 ES2020 非 ES5 但是 uni-app 编译后 vendor.js 未将其转换为 ES5的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

改成 vals.milliseconds || 0 试试

更多关于`??` 属于 ES2020 非 ES5 但是 uni-app 编译后 vendor.js 未将其转换为 ES5的实战教程也可以访问 https://www.itying.com/category-93-b0.html


如果是项目的代码,手动改成 vals.milliseconds || 0 是可以。但是如果这段代码是第三方库的呢 ?

可以尝试用babel处理下

HBuilderX 有内置的 Babel,默认是有启用 ES6 转 ES5 的(这点在官网中也有说明)。现在的问题是,对于 HBuilderX 创建的工程项目,编译后并未对上述的 ?? 语法进行转义/降级。应该是内置 Babel 的问题?

这是因为uni-app默认的ES5转换配置未包含ES2020的空值合并操作符(??)。uni-app的编译流程中,babel转换规则主要针对ES6语法降级,而??属于较新的ES2020特性,需要额外配置。

解决方案:

  1. 修改babel配置:在项目根目录创建babel.config.js,添加以下内容:
module.exports = {
  presets: [
    ['@babel/preset-env', {
      targets: { ie: '11' },
      include: ['@babel/plugin-proposal-nullish-coalescing-operator']
    }]
  ]
};
  1. 使用条件运算符替代:临时将代码改为兼容写法:
let sum = vals.milliseconds !== null && vals.milliseconds !== undefined ? vals.milliseconds : 0;
回到顶部