uniapp unexpected token '?' 报错如何解决?

在使用uniapp开发时遇到报错:“unexpected token ‘?’”,这个错误通常出现在代码中使用可选链操作符(?.)的时候。我的开发环境是HBuilderX,基础库版本也检查过是支持的,但编译时还是会报这个语法错误。请问该如何解决这个问题?是否需要配置特定的编译器选项或插件?

2 回复

检查代码中是否有可选链操作符?.,可能是低版本编译器不支持。升级HBuilderX或配置babel转译即可解决。


在uni-app中遇到Unexpected token '?'错误,通常是因为代码中使用了可选链操作符(?.)空值合并操作符(??),但当前JavaScript环境不支持这些ES2020语法。

解决方案:

  1. 检查代码中的可选链操作符(?.)和空值合并操作符(??)

    • 搜索代码中是否包含 ?.??,例如:
      const name = obj?.name;
      const value = data ?? 'default';
      
  2. 转换为兼容语法

    • 可选链操作符(?.) 改为使用 && 链式判断:
      // 原代码
      const name = obj?.user?.name;
      
      // 修改后
      const name = obj && obj.user && obj.user.name;
      
    • 空值合并操作符(??) 改为使用逻辑或 ||(注意:|| 会过滤所有假值,?? 仅针对 null/undefined):
      // 原代码
      const value = data ?? 'default';
      
      // 修改后
      const value = data !== null && data !== undefined ? data : 'default';
      
  3. 配置编译器以支持新语法

    • vue.config.js 中配置 transpileDependencies(若使用 Vue CLI):
      module.exports = {
        transpileDependencies: ['your-es6-package']
      };
      
    • 或通过 Babel 插件 @babel/plugin-proposal-optional-chaining@babel/plugin-proposal-nullish-coalescing-operator 进行转换。
  4. 确保HBuilderX或构建环境更新

    • 更新 HBuilderX 到最新版本(支持ES6+语法)。
    • 检查 manifest.json 中是否设置了正确的小程序基础库版本(部分平台需≥2.11.0)。

示例修改:

修改前:

onLoad(options) {
  const id = options?.id ?? 'unknown';
}

修改后:

onLoad(options) {
  const id = (options && options.id) !== null && (options && options.id) !== undefined 
    ? options.id 
    : 'unknown';
}

通过以上调整,可解决语法兼容性问题。如果问题持续,请检查开发工具及依赖版本。

回到顶部