我想在AssemblyScript (TypeScript)中编译一个使用console.log显示1的代码。
我的文件名为example.ts,它包含以下内容:
console.log("1")我将其汇编如下:
asc example.ts但我得到了以下错误:
ERROR TS2304: Cannot find name 'console'.
console.log("1")
~~~~~~~
in example.ts(1,1)
FAILURE 1 compile error(s)process.stdout.write("1")也会发生同样的情况。
这是怎么解决的?
发布于 2020-12-10 03:13:20
我在AssemblyScript服务器上请求帮助解决不和谐问题,一个贡献者(dcodeIO)能够修复有关UTF-8编码的错误。因此,有必要在0.17.7版本(修复此错误的版本)中使用AssemblyScript。另外,另一个协作者(MaxGraey)帮助我创建代码,并安装软件包。
首先,您必须安装加载程序:
npm i @assemblyscript/loader在我的例子中,由于在安装操作系统的USB上存在问题,我不得不在全球范围内安装它:
npm install --force -g @assemblyscript/loader您必须小心,有一个名为npm的assemblyscript-loader包,注意它的中间有一个减号,您不必执行以下操作:
npm install --force -g assemblyscript-loader # Do not do it, it is wrong.example.ts的代码必须如下:
namespace console {
declare function log(str: string): void;
}
/*
main generally unnecessary if you don't use
the `import` object on the host side,
but in this case it's better to delay the implicit
initialization during module instantiation
*/
export function main(): void {
console.log("1");
}要用example.ts编译asc,可以执行以下操作.我为更少的文件权重添加了优化:
asc -O3z --converge -b ./example.wasm ./example.ts这将生成一个3033字节的文件,相当于3kb。
要从执行代码,您必须创建一个文件,例如example.js,它看起来如下所示:
const fs = require("fs")
const loader = require('@assemblyscript/loader/umd');
loader.instantiate( fs.readFileSync("./example.wasm"), {
example: { // if your file called "example.ts"
"console.log"(ptr) {
console.log(exports.__getString(ptr));
}
}
})
.then(module => {
exports = module.exports;
exports.main(); // call entry point
})
.catch(e => {
console.error(e);
})使用fs.readFileSync("./example.wasm")很重要,因为当只使用"./example.wasm"时,它不起作用。这是因为加载器example.wasm.的实现(它是在Node.js中创建的),在index.js文件中,大约在第333行中,将一个Buffer类型的变量作为参数,该变量是Node.js的字节。
在我的示例中,在全局安装它时,在example.js中将其更改为:
const loader = require('/usr/lib/node_modules/@assemblyscript/loader/umd');要从example.js文件中运行Node.js,可以执行以下操作。我在代码跟踪参数中添加了代码跟踪参数,以防发生奇怪的事情:
node --trace-warnings --track-heap-objects ./example.js运行该命令的输出如下:
1正如您所看到的,它工作正常。
https://stackoverflow.com/questions/65217477
复制相似问题