Как вы взаимодействуете с js из dart?

Нет, это не то же самое, что другой вопрос с таким же названием.

Кажется, что есть идентичные пакеты, которые делают это, но с разными apis.

Почему их двое?

Какой из них мы должны использовать?

Интерфейс взаимодействия выглядит новее и имеет лучший API, но на самом деле не работает. Согласно документации, вы должны иметь возможность преобразовать этот javascript:

var stage = new PIXI.Stage(0xFFFFFF);;
renderer = PIXI.autoDetectRenderer(800, 600);
document.body.appendChild(renderer.view);

В:

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

Но вот ошибки при попытке его скомпилировать:

dart2js
Error occured:/Users/doug/megac/client/public/dart/index.dart:7:27:
Warning: No member named 'PIXI' in class 'Proxy'.
var pixi = new js.Proxy(js.context.PIXI.Stage, 0xffffff);
^^^^^^^^^^^^^^^

Итак ... js: dart? Это то, что вы должны использовать?

Изменить: кстати, для всех, кто наткнется на это, также есть открытая ошибка http://code.google.com/p/dart/issues/detail?id=15795&thanks=15795&ts=1388068177 относительно того, как минифицированные операции моста взаимодействия dart-js в настоящее время не работают. Об исходной проблеме было сообщено в мае 2013 года, и с тех пор никаких действий по ней не предпринималось, так что не задерживайте дыхание.


person Doug    schedule 15.12.2013    source источник
comment
Последняя ошибка, которую вы получаете, похоже, доказывает, что вы забыли добавить <script src="pixi.js"></script> на свою html-страницу.   -  person Alexandre Ardhuin    schedule 15.12.2013
comment
Неа. Это не так. Фактически, js.context ['PIXI'] ['Stage'] работает нормально, документация просто неверна.   -  person Doug    schedule 15.12.2013
comment
Хорошо, вы просто путаете API dart: js и package: js.   -  person Alexandre Ardhuin    schedule 15.12.2013
comment
@AlexandreArdhuin Послушайте, если у вас нет ничего полезного, вы можете просто промолчать. Это действительно хорошо, я не против. Документация здесь dart-lang.github.io/js-interop/docs /js.html ясно показывает использование синтаксиса blah.blah.blah, который не работает. Если у вас есть что добавить к любому из других вопросов, например: почему есть два способа сделать это? Какой из них мы должны использовать? Конечно, я приветствую это, но в данный момент вы просто бесполезны.   -  person Doug    schedule 15.12.2013


Ответы (1)


Js-взаимодействие началось с package: js. Он был создан с помощью window.postMessage.

Позже был добавлен dart: js для повышения производительности и уменьшения размер скомпилированного js файла. В основном цели были:

  • удаление объемов и ручное управление жизненным циклом
  • избегая noSuchMethod, чтобы размер компиляции был как можно меньше
  • переименование объектов, чтобы API был более понятным

После того, как dart: js был готов, package: js был переписан для использования dart: js под прикрытием.

package: js предоставляет более простой API, который достигается за счет увеличения размера js (поскольку package: js использует dart: mirrors и noSuchMethod).

То же самое делается с package: js и dart: 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']);
}
person Alexandre Ardhuin    schedule 15.12.2013