如何在Node.js中从JavaScript调用Dart类的静态方法?
在Dart JS互操作中实现类静态方法的JS暴露
可以通过dart:js和dart:js_util提供的API,自动将Dart类的静态方法挂载到Node.js的exports对象上,无需手动编写JS胶水代码。
优化后的实现方案
改造你现有的defineStaticMethods方法,利用dart:js_util的setProperty方法,直接给导出的类对象绑定静态方法:
import 'dart:js'; import 'dart:js_util' as js_util; void defineStaticMethods(dynamic jsClass, Map<String, Function> methods) { methods.forEach((methodName, dartFunc) { // 将Dart函数包装为JS可调用函数,挂载到类对象上 js_util.setProperty(jsClass, methodName, allowInterop(dartFunc)); }); } // 使用示例 var jsClass = createJSClass('ClassName', (Object self, String value) { return ClassName(value); }); defineStaticMethods(jsClass, { 'fromJson': (Object jsJson) => ClassName.fromJson(objectToMap(jsJson)), }); // 将类对象导出到Node.js的exports js_util.setProperty(context['exports'], 'ClassName', jsClass);
核心逻辑说明
allowInterop负责把Dart函数转换成JS环境可调用的函数js_util.setProperty可以直接操作JS对象的属性,包括给类构造函数添加静态方法- 整个流程完全在Dart层面完成,不需要手动编写
set$ClassName这类JS代码
关于dart-sass的实现思路
dart-sass在处理JS互操作的静态方法暴露时,也是基于类似逻辑:通过Dart的JS互操作API直接操作全局对象或导出对象,将静态方法绑定到对应类的构造函数上,全程避免手动编写胶水代码。
内容的提问来源于stack exchange,提问作者borut
相关产品推荐
相关产品推荐

