使用AssemblyScript在360浏览器下报错 SyntaxError: Unexpected reserved word
背景
最近在一个项目中使用了AssemblyScript,它能将类似于TypeScript的代码编译为WebAssembly,在其他浏览器都能正常使用,然而在360浏览器上却会报错:SyntaxError: Unexpected reserved word。
原因
先看index.ts,里面有一个简单的add方法,add里面调用了console.log
export function add(a: i32, b: i32): i32 {
console.log((a + b).toString());
return a + b;
}
编译后生成的release.js
async function instantiate(module, imports = {}) {
const adaptedImports = {
env: Object.assign(Object.create(globalThis), imports.env || {}, {
abort(message, fileName, lineNumber, columnNumber) {
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
message = __liftString(message >>> 0);
fileName = __liftString(fileName >>> 0);
lineNumber = lineNumber >>> 0;
columnNumber = columnNumber >>> 0;
(() => {
// @external.js
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
})();
},
"console.log"(text) {
// ~lib/bindings/dom/console.log(~lib/string/String) => void
text = __liftString(text >>> 0);
console.log(text);
},
}),
};
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
const memory = exports.memory || imports.env.memory;
function __liftString(pointer) {
if (!pointer) return null;
const
end = pointer + new Uint32Array(memory.buffer)[pointer - 4 >>> 2] >>> 1,
memoryU16 = new Uint16Array(memory.buffer);
let
start = pointer >>> 1,
string = "";
while (end - start > 1024) string += String.fromCharCode(...memoryU16.subarray(start, start += 1024));
return string + String.fromCharCode(...memoryU16.subarray(start, end));
}
return exports;
}
export const {
memory,
add
} = await (async url => instantiate(
await (async () => {
try { return await globalThis.WebAssembly.compileStreaming(globalThis.fetch(url)); }
catch { return globalThis.WebAssembly.compile(await (await import("node:fs/promises")).readFile(url)); }
})(), {
}
))(new URL("release.wasm", import.meta.url));
360浏览器报错锁定在await这一行
} = await (async url => instantiate(
查看360浏览器的内核版本,发现是86.0.4240.198,360浏览器已经是最新的版本了。

而支持在模块顶层使用await的chrome最低版本是89,点这里查看

所以出现了这个错误~
所以,有没有什么解决方法呢?
解决方法
不使用await就行了,用Promise代替await。
修改release.js,根据自己的代码进行修改,不能直接照抄
function instantiate(module, imports = {}) {
return new Promise((resolve) => {
// 如果有 __lowerString 需要先在这里定义
let __liftString = function () {};
const adaptedImports = {
env: Object.assign(Object.create(globalThis), imports.env || {}, {
abort(message, fileName, lineNumber, columnNumber) {
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
message = __liftString(message >>> 0);
fileName = __liftString(fileName >>> 0);
lineNumber = lineNumber >>> 0;
columnNumber = columnNumber >>> 0;
(() => {
// @external.js
throw Error(
`${message} in ${fileName}:${lineNumber}:${columnNumber}`
);
})();
},
"console.log"(text) {
// ~lib/bindings/dom/console.log(~lib/string/String) => void
text = __liftString(text >>> 0);
console.log(text);
},
}),
};
WebAssembly.instantiate(module, adaptedImports).then((res) => {
const { exports } = res;
const memory = exports.memory || imports.env.memory;
__liftString = function (pointer) {
if (!pointer) return null;
const end =
(pointer + new Uint32Array(memory.buffer)[(pointer - 4) >>> 2]) >>>
1,
memoryU16 = new Uint16Array(memory.buffer);
let start = pointer >>> 1,
string = "";
while (end - start > 1024)
string += String.fromCharCode(
...memoryU16.subarray(start, (start += 1024))
);
return string + String.fromCharCode(...memoryU16.subarray(start, end));
};
resolve(exports);
});
});
}
export const exports = new Promise((resolve, reject) => {
globalThis.WebAssembly.compileStreaming(
globalThis.fetch(new URL("release.wasm", import.meta.url))
).then((module) => {
instantiate(module, {})
.then((res) => resolve(res))
.catch((err) => {
console.error(err);
reject(err);
});
});
});
引入
<script type="module">
import { exports } from "./release.js";
exports.then((res) => {
// add方法
const { add } = res;
add(12, 34);
});
</script>
完美。
使用AssemblyScript在360浏览器下报错 SyntaxError: Unexpected reserved word的更多相关文章
- IE浏览器下报错: strict 模式下不允许一个属性有多个定义
vue项目,打包后在IE11和360浏览器(都是IE内核)上运行,控制台报了strict 模式下不允许一个属性有多个定义这个错误,导致流程不能正常走下去,查资料后知道应该是定义了重复的属性,于是就开始 ...
- react-native create-react-app创建项目报错SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' npm代理
SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' 错误 ...
- create-react-app创建项目报错SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' npm代理
SyntaxError: Unexpected end of JSON input while parsing near '...ttachment":false,"tar' 错误 ...
- Node.js启动服务报错SyntaxError: Unexpected token import
启动服务报错如下: Last login: Wed Nov :: on ttys000 localhost:~ sipeng$ cd /Users/sipeng/Desktop/彭思/2017年学习/ ...
- 『奇葩问题集锦』function * (next){ 执行报错 SyntaxError: Unexpected token *
这是因为 app.use(function * (){ 语句中有一个 * ,这种方式被称为generator functions ,一般写作function *(){...} 的形式,在此类func ...
- WebUploader IE9下报错
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在项目中,推荐并一直在使用WebUploader进行文件上传业务开发. ...
- 【Python】selenium调用IE11浏览器,报错“找不到元素”NoSuchWindowException: Message:Unable to find element on closed window
当编写自动化脚本,定位浏览器元素时,报如下错误: 代码: >>> # coding=utf-8 >>> from selenium import webdriver ...
- js插件设置innerHTML时,在IE8下报错“未知运行时错误”
问题描述: 网站中使用了一个js插件,设置innerHTML时,在IE8下报错“未知运行时错误”: <div id=”divContainer”> <a name=”link”> ...
- jquery.validate.js在IE8下报错不运行
因为项目要表单验证,所以特意去找了jquery.validate这个应该是jquery官方团队出品的表单验证插件. 实际应用时,却在IE8调试时碰到了问题. 从jquery.validate官网下载了 ...
- IE8、IE9浏览器下报:JSON未定义 解决方法
IE8.IE9浏览器下报:JSON未定义的问题 解决方法: 在jsp中引入如下代码 <!-- 解决 IE8.IE9 下显示混乱的问题--><% String browserStrin ...
随机推荐
- 康谋分享 | aiSim5 物理相机传感器模型验证方法(一)
摘要: aiSim5可以实时模拟复杂的传感器配置,在多GPU分布式渲支持的支持下,aiSim可以渲染20多个摄像头.10多个雷达和10多个激光雷达在同一环境下运行.aiSim5独有的实时渲染引擎能够满 ...
- 倍增 & Tarjan 求解LCA
什么是LCA? 假设我们有一棵树: 1 / \ 2 3 / \ / 4 5 6 对于 \(2\) 和 \(6\) 的LCA,就是最近公共祖先,即为距离 \(2\) 和 \(6\) 最近的两个节点公有的 ...
- 浏览器如何确定最终的CSS属性值?解析计算优先级与规则
前言 上篇文章中有提到CSS值的处理过程,但如果想要确定一个元素的最终样式值可以不需要这么多步.实际上我们写的任何一个标签元素无论写没写样式,它都会有一套完整的样式.理解这一点非常重要️ 比如:一个简 ...
- servlet @WebServlet注解
web开发中可以通过web.xml写servlet标签表明一个类是Servlet,servlet3.0后可以使用@WebServlet表示一个类为Servlet. @WebServlet 参数 说明 ...
- JAVA 24 环境安装与配置
JAVA 24 环境安装与配置 一.Java Downloads Java 下载(Windows x64) https://www.oracle.com/java/technologies/downl ...
- 操作系统 :AArch64体系--ARM最新编程架构模型剖析
本节来讲讲 ARM 的 AArch64 体系结构,扩展一下视野. 看看什么是 AArch64 体系,然后分析一下 AArch64 体系有什么特点,最后了解一下 AArch64 体系下运行程序的基础,包 ...
- 构建现代交互式平台:CodeBuddy如何简化复杂系统开发
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 交互式平台的架构挑战 构建现代 ...
- MethodImpl优化性能
参数解释 MethodImplOptions.AggressiveInlining:请求编译器在可能的情况下对方法进行内联. MethodImpl:这是一个属性,允许开发者为方法指定特定的实现行为,比 ...
- PyPI 使用的国内源
通过几次 pip 的使用,对于默认的 pip 源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下:阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大 ...
- pandas.read_csv() 报错 OSError: Initializing from file failed
pandas.read_csv() 报错 OSError: Initializing from file failed,一般由两种情况引起:一种是函数参数为路径而非文件名称,另一种是函数参数带有中文. ...