`??` 属于 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处理下
这是因为uni-app默认的ES5转换配置未包含ES2020的空值合并操作符(??)。uni-app的编译流程中,babel转换规则主要针对ES6语法降级,而??属于较新的ES2020特性,需要额外配置。
解决方案:
- 修改babel配置:在项目根目录创建
babel.config.js,添加以下内容:
module.exports = {
presets: [
['@babel/preset-env', {
targets: { ie: '11' },
include: ['@babel/plugin-proposal-nullish-coalescing-operator']
}]
]
};
- 使用条件运算符替代:临时将代码改为兼容写法:
let sum = vals.milliseconds !== null && vals.milliseconds !== undefined ? vals.milliseconds : 0;


