Удаление ссылки на файл Dart убивает приложение

Я пытаюсь запустить приложение Dart в Firefox (v22.0). Вот домашняя страница приложения:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>My 1st Dart App</title>
        <link rel="stylesheet" href="assets/myapp/myapp/myapp.css">
    </head>
    <body>
        <h2>Push the button!</h2>

        <div id="sample_container_id">
            <input type="button" id="someButton" value="Some Button!" />
        </div>

        <script type="application/dart" src="myapp.dart"></script>
        <script src="packages/browser/dart.js"></script>
    </body>
</html>

Когда я запускаю это как есть, мое приложение работает нормально и делает именно то, что я хочу. Но если я удалю первый тег <script/> (<script type="application/dart" src="myapp.dart"></script>), ни один код Dart не будет выполняться во время выполнения. Например, у меня есть обработчик кликов, настроенный для кнопки HTML следующим образом:

void main() {
    querySelector("#someButton").onClick.listen((e) => window.alert("Hello!"));
}

Если я удалю первый тег <script/>, то при нажатии someButton ничего не произойдет.

(1) Почему удаление первого тега <script/> "убивает" код Dart? Я использую pub build для создания кросс-компилированного JavaScript, так почему Firefox должен заботиться о моем исходном файле Dart (поскольку FF 22.0 не не поддерживает Dart изначально)?

(2) Есть ли в Dart рекомендуемое объявление <DOCTYPE>, такое как переходное и т. д.?


person IAmYourFaja    schedule 23.12.2013    source источник


Ответы (4)


1) Firefox не заботится об исходном файле Dart, а сборка pub — заботится. Если ваш HTML-файл не содержит скрипта Dart, pub build можно скопировать файл без какой-либо обработки, в противном случае pub build добавляется код JavaScript, который выполняется вместо скрипта Dart, когда браузер не поддерживает Dart.

2) Ваш тип документа является правильным типом документа HTML5, и Dart отлично работает с ним.

person Günter Zöchbauer    schedule 23.12.2013
comment
Спасибо @Gunter Zochbauer (+1) - единственное, что если я оставлю первую ссылку на тег <script/>, то Firebug выдаст ошибку 404, поскольку не может найти файл Dart. Конечно же, когда я смотрю в каталог build/, который был создан при запуске pub build, там есть кросс-компилированный файл myapp.dart.js, но не исходный файл myapp.dart. Это нормальное поведение? Как я могу подавить ошибку Firebug? Еще раз спасибо! - person IAmYourFaja; 23.12.2013
comment
Последняя информация, которую я получил об этом, заключается в том, что dart2dart еще не закончен, и поскольку в дикой природе нет реальных браузеров, поддерживающих Dart, генерация кода Dart в настоящее время отключена в сборке pub. Это кажется странным, но сборка паба оптимизирует код Dart для развертывания, такого как встряхивание дерева, минимизация, конкатенация и т. д. Когда dart2dart будет включен, браузер с поддержкой Dart будет загружать файлы сценариев Dart, в то время как другие браузеры игнорируют теги сценариев Dart. - person Günter Zöchbauer; 23.12.2013
comment
Еще раз спасибо @Gunter Zochbauer (+1) - так можно ли с уверенностью сказать, что пока мне просто нужно жить с ошибкой Firebug? Другими словами: можете ли вы подтвердить, что я не делаю ничего плохого и что я никак не могу подавить/проигнорировать ошибку Firebug? Спасибо еще раз! - person IAmYourFaja; 23.12.2013
comment
Да, это намеренно. Он основан на том факте, что браузеры обычно игнорируют то, чего не понимают. Вы можете удалить тег сценария Dart в index.html, созданный pub build в каталоге сборки, если вам не нравится ошибка. Если вы хотите поддерживать Dart и JS (когда они поддерживаются), вам придется смириться с ошибкой. - person Günter Zöchbauer; 23.12.2013

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

Длинный ответ: Dart.js будет искать скрипт: application/dart, если он работает в браузере с DartVM (то есть Dartium), он запустит его. В противном случае он возьмет файл сценария myapp.dart, изменит файл на myapp.dart.js и запустит его. Удаляя этот тег script, вы удаляете свой скрипт dart, который ищет dart.js, и в результате ваша скомпилированная версия javascript никогда не вставляется в ваш документ.

Что касается DOCTYPE, никто особенно не рекомендуется, однако, поскольку Dart, как правило, предназначен для последних версий браузера и фактически использует теги HTML5, где это уместно, вероятно, было бы лучше использовать HTML5 DOCTYPE, как в вашем примере.

person Matt B    schedule 23.12.2013
comment
Спасибо @Matt B (+1) - см. мой дополнительный вопрос под ответом Гюнтера - у меня к вам тот же вопрос! - person IAmYourFaja; 23.12.2013
comment
Согласно ответу Гюнтера, это нормально, что в настоящее время версия вашего приложения .dart не копируется для сборки. В конце концов так и будет, но пока вам придется жить с ошибкой 404. В качестве альтернативы вы можете скопировать свои исходные коды в каталог сборки или запустить dart2dart (dart2js --output-type=dart) вручную, чтобы создать уменьшенную версию ваших скриптов dart. Вы не можете удалить строку скрипта application/dart (даже из встроенной версии index.html), так как dart.js ожидает этого там. См.: dartbug.com/15623. - person Matt B; 23.12.2013

1) Посмотрите, что делает packages/browser/dart.js.

Сначала он проверяет, поддерживает ли браузер Dart, а затем, если браузер не поддерживает Dart, ищет файлы с типом application/dart и переназначает их, чтобы они указывали на правильный файл JavaScript.

Поскольку вы удалили свой скрипт Dart, dart.js не находит его и никогда не переназначает, чтобы он указывал на файл JavaScript.

2) Все, что я видел, использует тип документа HTML5: <!DOCTYPE html>, но я не думаю, что существует официальное руководство.

person Pixel Elephant    schedule 23.12.2013
comment
Спасибо @Pixel Elephant (+1) - см. мой дополнительный вопрос под ответом Гюнтера - у меня к вам тот же вопрос! - person IAmYourFaja; 23.12.2013

  1. packages/browser/dart.js проверяет, доступна ли DartVM, если нет, заменяет <script type="application/dart" src="xxx.dart"></script> на <script src="xxx.dart.js"></script>. Предполагая, что вы запустили dart2js, вы можете выполнить это задание вручную, заменив 2 тега скрипта только на <script src="myapp.dart.js"></script>
  2. нет никакой рекомендации.
person Alexandre Ardhuin    schedule 23.12.2013
comment
Спасибо @Alexandre Ardhuin (+1) - см. мой дополнительный вопрос под ответом Гюнтера - у меня к вам тот же вопрос! - person IAmYourFaja; 23.12.2013