Aurelia TypeScript应用在Safari 7.1无法运行,8及以上版本正常
解决Aurelia+TypeScript应用在Safari 7.1中无法运行的问题
嘿,这个问题我之前帮团队处理过类似的——Safari 7.1对ES6+特性的支持非常有限,尤其是ES6装饰器语法,它完全没有实现这个特性,这就是你的应用在老版本Safari里跑不起来的核心原因。结合Aurelia和TypeScript的技术栈,给你几个可行的解决方向:
用Babel转译装饰器及ES6+特性
TypeScript本身对装饰器的编译只是做了基础语法转换,但Safari 7.1连转换后的代码都可能无法兼容。你需要引入Babel来进一步降级代码:- 安装必要的Babel插件:
npm install @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties --save-dev - 在Babel配置文件(
.babelrc或babel.config.json)中启用这些插件,注意Aurelia的装饰器基于旧提案,需要开启legacy模式:{ "plugins": [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose": true }] ] } - 调整TypeScript编译配置,把
target设为ES5,让TypeScript先输出ES5代码,再交给Babel处理装饰器和剩余的ES6特性。
- 安装必要的Babel插件:
优化TypeScript编译配置
检查你的tsconfig.json,确保以下配置正确:{ "compilerOptions": { "target": "ES5", "lib": ["ES2015", "DOM"], // 确保包含必要的标准库 "experimentalDecorators": true, "emitDecoratorMetadata": true, // Aurelia依赖这个元数据生成 "module": "ESNext", // 配合打包工具使用 "moduleResolution": "Node" } }把
target设为ES5是关键,因为Safari 7.1对ES5的支持更完善。添加必要的Polyfill
Safari 7.1缺少很多ES6内置API,比如Promise、Array.from、Object.assign等,这些都是Aurelia运行时依赖的。你可以用core-js来补充这些API:- 安装依赖:
npm install core-js regenerator-runtime --save - 在应用的入口文件(比如
main.ts)最顶部导入:import 'core-js/stable'; import 'regenerator-runtime/runtime';
这样能确保所有缺失的ES6+ API都被Polyfill,避免运行时报错。
- 安装依赖:
验证并排查具体错误
打开Safari 7.1的开发者工具(偏好设置→高级→勾选“显示开发菜单”),查看控制台的具体错误信息。如果是Unexpected token '@',说明装饰器没被转译;如果是XXX is not defined,那就是对应的API需要Polyfill。根据错误信息针对性调整配置,能更快定位问题。
内容的提问来源于stack exchange,提问作者Ramjan khan
相关产品推荐
相关产品推荐

