11

在 Dart 文档的任何地方,都建议使用jspackage 来实现 javascript 互操作性。

但是,我最近发现dart:jsSDK 中存在似乎具有相似(但不相同)接口的包。

这些包之间有什么区别吗?它们的功能是否相同?推荐哪一个?

4

2 回答 2

13

Js 互操作从package:js开始。它是用window.postMessage构建的。

后来添加了dart:js以提供更好的性能并减小编译后的 js 文件的大小。基本上目标是:

  • 删除范围和生命周期手动处理
  • 避免 noSuchMethod 以保持编译大小尽可能小
  • 重命名对象以使 api 更易于理解

一旦dart:js准备就绪,package:js已经被重写以在封面下使用dart:js 。

package:js提供了一个更简单的 Api,但代价是增加了 js 的大小(因为package:js使用dart:mirrorsnoSuchMethod)。

用package:jsdart:js做同样的事情:

import 'package:js/js.dart' as js;

main() {
  var pixi = new js.Proxy(js.context.PIXI.Stage, 0xffffff);
  var renderer = js.context.PIXI.autoDetectRenderer(400, 400);
  document.body.append(renderer.view);
}

import 'dart:js' as js;

main() {
  var pixi = new js.JsObject(js.context['PIXI']['Stage'], [0xffffff]);
  var renderer = js.context['PIXI'].callMethod('autoDetectRenderer', [400, 400]);
  document.body.append(renderer['view']);
}
于 2013-10-18T14:35:38.163 回答
1

不管怎样,我在 GitHub 上都收到了回复:

该堆栈溢出注释已过时。更喜欢package:js- 我们正在努力更新文档以明确推荐。它不再被实现window.postMessage(那是一个基于 Dartium 的解决方案)——它直接在编译器中处理,应该比dart:js.

来源:https ://github.com/flutter/flutter/issues/35588#issuecomment-522097151

于 2019-08-17T08:43:33.550 回答