Babel Standalone:IE11 预期 '('
Babel Standalone: IE11 Expected '('
我目前正在尝试让我的 es2017 代码在 IE11 中工作,不幸的是,由于我的项目的性质,我需要在客户端转换代码。
我正在查看其他一些 SO 帖子 (),这些帖子确实对我有所帮助,但我发现自己卡在了这一点上。
我从上面链接的 SO 问题中提取了以下示例代码以进行测试:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Standalone Async/Await Example</h1>
<!-- Load Babel -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.8.3/polyfill.min.js" type="text/javascript"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel" data-presets="es2017, stage-3" data-plugins="syntax-async-generators">
/* Output of Babel object */
console.log('Babel =', Babel);
var users = { '123' : { name : 'Joe Montana'} };
process();
async function process()
{
var id = await getId();
var name = await getUserName(id);
console.log("User Name: "+name);
}
function getId()
{
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('calling'); resolve("123"); }, 2000);
});
}
function getUserName(id)
{
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('requesting user name with id: '+id); resolve(users[id].name); }, 3000);
});
}
</script>
</body>
</html>
然而,当我在浏览器中加载 HTML 时,我在 IE11 上看到这个错误:
SCRIPT1005: Expected '('
File: testAsync.html, Line: 19, Column: 40
我不明白为什么在此处引用的行中需要括号:
var name = await getUserName(id);
有人能给我指出正确的方向吗?我做错了什么?
问题不在于您的 type="text/babel"
脚本中的代码行,由于 link IE11 在控制台中提供给您,所以这是一条红鲱鱼。它在 Babel 创建的 generated 脚本中,在这一行:
_process = asyncToGenerator(function* () {
注意 IE 不支持的生成器函数 (function*
)。
Babel 的输出是因为示例的 data-presets
不完整。该示例有 data-presets="es2017, stage-3"
,但这并没有告诉 Babel 它需要 t运行spile ES2015 和 ES2016,因此它假设它可以使用 ES2015 中的生成器函数。
要修复它,请将这些添加到您的预设中:data-presets="es2015, es2016, es2017, stage-3"
以下是我的诊断方法,以防它有用:由于 type="text/babel"
脚本中的代码在语法上是正确的,所以我知道不是这样。所以我认为它必须是 t运行spiled 结果。我可以在 IE11 的 DOM 资源管理器中看到 t运行 溢出的结果,并注意到其中的 function*
。所以我知道有一个 t运行spiling 问题,我认为是那一行,但 IE11 不允许我复制代码,所以如果我能看到那是否是第 19 行。所以我 运行 它在 Brave(类似于 Chrome)中,复制了生成的代码,确实是其中的第 19 行。这让我更加仔细地查看了 data-presets
并意识到发生了什么。
我目前正在尝试让我的 es2017 代码在 IE11 中工作,不幸的是,由于我的项目的性质,我需要在客户端转换代码。
我正在查看其他一些 SO 帖子 (
我从上面链接的 SO 问题中提取了以下示例代码以进行测试:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Standalone Async/Await Example</h1>
<!-- Load Babel -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/7.8.3/polyfill.min.js" type="text/javascript"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel" data-presets="es2017, stage-3" data-plugins="syntax-async-generators">
/* Output of Babel object */
console.log('Babel =', Babel);
var users = { '123' : { name : 'Joe Montana'} };
process();
async function process()
{
var id = await getId();
var name = await getUserName(id);
console.log("User Name: "+name);
}
function getId()
{
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('calling'); resolve("123"); }, 2000);
});
}
function getUserName(id)
{
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('requesting user name with id: '+id); resolve(users[id].name); }, 3000);
});
}
</script>
</body>
</html>
然而,当我在浏览器中加载 HTML 时,我在 IE11 上看到这个错误:
SCRIPT1005: Expected '('
File: testAsync.html, Line: 19, Column: 40
我不明白为什么在此处引用的行中需要括号:
var name = await getUserName(id);
有人能给我指出正确的方向吗?我做错了什么?
问题不在于您的 type="text/babel"
脚本中的代码行,由于 link IE11 在控制台中提供给您,所以这是一条红鲱鱼。它在 Babel 创建的 generated 脚本中,在这一行:
_process = asyncToGenerator(function* () {
注意 IE 不支持的生成器函数 (function*
)。
Babel 的输出是因为示例的 data-presets
不完整。该示例有 data-presets="es2017, stage-3"
,但这并没有告诉 Babel 它需要 t运行spile ES2015 和 ES2016,因此它假设它可以使用 ES2015 中的生成器函数。
要修复它,请将这些添加到您的预设中:data-presets="es2015, es2016, es2017, stage-3"
以下是我的诊断方法,以防它有用:由于 type="text/babel"
脚本中的代码在语法上是正确的,所以我知道不是这样。所以我认为它必须是 t运行spiled 结果。我可以在 IE11 的 DOM 资源管理器中看到 t运行 溢出的结果,并注意到其中的 function*
。所以我知道有一个 t运行spiling 问题,我认为是那一行,但 IE11 不允许我复制代码,所以如果我能看到那是否是第 19 行。所以我 运行 它在 Brave(类似于 Chrome)中,复制了生成的代码,确实是其中的第 19 行。这让我更加仔细地查看了 data-presets
并意识到发生了什么。