首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在console.log中编译AssemblyScript (“1”)?

如何在console.log中编译AssemblyScript (“1”)?
EN

Stack Overflow用户
提问于 2020-12-09 13:10:37
回答 1查看 841关注 0票数 0

我想在AssemblyScript (TypeScript)中编译一个使用console.log显示1的代码。

我的文件名为example.ts,它包含以下内容:

代码语言:javascript
复制
console.log("1")

我将其汇编如下:

代码语言:javascript
复制
asc example.ts

但我得到了以下错误:

代码语言:javascript
复制
ERROR TS2304: Cannot find name 'console'.

 console.log("1")
 ~~~~~~~
 in example.ts(1,1)

FAILURE 1 compile error(s)

process.stdout.write("1")也会发生同样的情况。

这是怎么解决的?

EN

回答 1

Stack Overflow用户

发布于 2020-12-10 03:13:20

我在AssemblyScript服务器上请求帮助解决不和谐问题,一个贡献者(dcodeIO)能够修复有关UTF-8编码的错误。因此,有必要在0.17.7版本(修复此错误的版本)中使用AssemblyScript。另外,另一个协作者(MaxGraey)帮助我创建代码,并安装软件包。

首先,您必须安装加载程序:

代码语言:javascript
复制
npm i @assemblyscript/loader

在我的例子中,由于在安装操作系统的USB上存在问题,我不得不在全球范围内安装它:

代码语言:javascript
复制
npm install --force -g @assemblyscript/loader

您必须小心,有一个名为npmassemblyscript-loader包,注意它的中间有一个减号,您不必执行以下操作:

代码语言:javascript
复制
npm install --force -g assemblyscript-loader # Do not do it, it is wrong.

example.ts的代码必须如下:

代码语言:javascript
复制
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,可以执行以下操作.我为更少的文件权重添加了优化:

代码语言:javascript
复制
asc -O3z --converge -b ./example.wasm ./example.ts

这将生成一个3033字节的文件,相当于3kb。

要从执行代码,您必须创建一个文件,例如example.js,它看起来如下所示:

代码语言:javascript
复制
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中将其更改为:

代码语言:javascript
复制
const loader = require('/usr/lib/node_modules/@assemblyscript/loader/umd');

要从example.js文件中运行Node.js,可以执行以下操作。我在代码跟踪参数中添加了代码跟踪参数,以防发生奇怪的事情:

代码语言:javascript
复制
node --trace-warnings --track-heap-objects ./example.js

运行该命令的输出如下:

代码语言:javascript
复制
1

正如您所看到的,它工作正常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65217477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档