求助, safari 上运行报错的前端问题

2022-10-20 14:44:15 +08:00
 sunny1688

先说问题,在 chrome 、firefox 上完美运行,但在 safari 上运行报错:SyntaxError: Unexpected token '='. Expected an opening '(' before a method's parameter list.

safari 版本:13.x

# src/utils/helper.ts

export default new class Helpers {
    public list: string[] = [];			// 主要是这行导致的
}
npm create vite@latest safari-demo --template vue-ts
cd safari-demo
npm install
npm run dev

是什么原因导致的啊?是需要安装什么插件吗?有遇到相同问题的吗?

1510 次点击
所在节点    问与答
15 条回复
hua123s
2022-10-20 14:57:48 +08:00
这是什么奇怪的写法
export default new (class Helpers {
public list: string[] = []; // 主要是这行导致的
})();
这个意思?
MrYELiex
2022-10-20 14:59:18 +08:00
报错都这么明显了 还想浏览器帮你改好吗
sunny1688
2022-10-20 15:00:15 +08:00
ts 翻译成 js 后其实就是

class Helpers {
list = []; // safari 不支持这样的写法
}
happyeveryday
2022-10-20 15:05:03 +08:00
vitejs 我们只打 dev 模式本地开发,确实速度提升巨大
测试预发生产环境都是 webpack 打,稳稳地
Rache1
2022-10-20 15:07:31 +08:00
Safari 的版本太低了,还不支持这个语法,可以用 babel 处理一下

javascript - SAFARI : Unexpected token '='. Expected an opening '(' before a method's parameter list - Stack Overflow
https://stackoverflow.com/questions/60026651/safari-unexpected-token-expected-an-opening-before-a-methods-paramet
hua123s
2022-10-20 15:08:26 +08:00
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields
Safari 14.1 才支持 public class field ,编译成 ES5 咯。
hua123s
2022-10-20 15:09:04 +08:00
lenonrade
2022-10-20 15:09:46 +08:00
safari 不支持 ES6 的 Class static initialization blocks, ES6 的类归根到底还是 JavaScript 的原型继承,不要忘了 javascript 的本质.
参考文献:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Class_static_initialization_blocks
sunny1688
2022-10-20 15:29:35 +08:00
@hua123s @lenonrade @Rache1

发现只有在开发期间的时候报错,一样的代码,npm run build 后可以运行
sunny1688
2022-10-20 15:31:58 +08:00
开发期间看到浏览器是直接请求 /xxx/xxx.ts ,而不是编译后的 js
wunonglin
2022-10-20 15:43:26 +08:00
谁说 safari 不支持 class ?

https://imgur.com/OwmctqL
sunny1688
2022-10-20 16:07:06 +08:00
@wunonglin 你的 safari 哪个版本?
wunonglin
2022-10-20 16:09:04 +08:00
@sunny1688 #12

Version 16.0 (17614.1.25.9.10, 17614)
hua123s
2022-10-20 16:12:00 +08:00
@sunny1688 如果只是这一个 public class field 问题,可以修改 tsconfig => compilerOptions => useDefineForClassFields: false 来解决。
sunny1688
2022-10-20 16:28:20 +08:00
@hua123s 感谢,按照你的方法可以正常运行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888428

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX