В чем разница между дротиками: js и js package?

Всюду в документации Dart рекомендуется использовать пакет js для взаимодействия javascript.

Однако недавно я обнаружил, что пакет dart:js существует в SDK, который, похоже, имеет похожий (но не тот же) интерфейс.

Существуют ли различия между этими пакетами? Являются ли они эквивалентными? Какой из них рекомендуется?

Ответ 1

Взаимодействие с Js началось с пакета : js. Он был построен с использованием window.postMessage.

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

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

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

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

Вот то же самое, что и с пакетом: 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']);
}

Ответ 2

Я получил ответ независимо от этого на GitHub:

Этот комментарий о переполнении стека устарел. Предпочитаю package:js - мы работаем над обновлением документов, чтобы явно рекомендовать это. Он больше не реализован над window.postMessage (это было решение на основе Dartium) - он обрабатывается непосредственно в компиляторах и должен быть более эффективным, чем dart:js.

Источник: https://github.com/flutter/flutter/issues/35588#issuecomment-522097151