首页 > 解决方案 > 从 Javascript 调用 Dart ......这是一个错误吗?

问题描述

在编译以下漂亮的代码时...

@JS()
library nodejs;

import 'package:js/js.dart';

@JS()
class Exports {
  external set functionName(Function function);
}

@JS()
external Exports get exports;

void _someDartFunction(dynamic s) {
  print('Hello from Dirt!');
}

void main(List<String> arguments) {
  exports.functionName = allowInterop(_someDartFunction);
}

...使用 dart2js 命令从 dart 到 js,如下所示:

dart2js -o node_modules/nodejs/index.js  bin/main.dart 

结节被称为“nodejs”(在这种情况下,名称不是问题!)。该模块之前由 npm 使用适当的 package.json 初始化。

然后我启动 nodejs 并需要模块

$ nodejs
> var n = require("nodejs")
ReferenceError: self is not defined
    at Object.main (/home/buergerling/Schreibtisch/dart/nodejs1/node_modules/njs/index.js:2544:28)
    at /home/buergerling/Schreibtisch/dart/nodejs1/node_modules/njs/index.js:3569:9
    at init.currentScript (/home/buergerling/Schreibtisch/dart/nodejs1/node_modules/njs/index.js:3549:7)
    at dartProgram (/home/buergerling/Schreibtisch/dart/nodejs1/node_modules/njs/index.js:3564:5)

收到错误。这个问题可以通过self从编译的 index.js 文件中取消来解决。

问题可以在这里发现:

...
  main: function($arguments) {
      var t1 = type$.Function;
      J.set$functionName$x(self.exports, P.allowInterop(D.main___someDartFunction$closure(), t1));
      J.set$functionName$x(self.module.exports, P.allowInterop(D.main___someDartFunction$closure(), t1));
      self.functionName = P.allowInterop(D.main___someDartFunction$closure(), t1);
      P.print("Hello from Dirt!");
    },
    Exports: function Exports() {
    }
...

更改self.exportsexports解决问题,模块可以按预期加载和使用。

有没有比手动编辑编译文件更优雅的解决方案?

标签: dartinterop

解决方案


推荐阅读