dart2js компилируется без IDE

Я использую dart2js для компиляции dart в JavaScript на моем сервере Ubuntu.

Я могу использовать простые команды, такие как print(), но я не могу использовать DOM. Код ниже возвращает null.

Есть ли что-то еще, что мне нужно, чтобы импорт работал, кроме включения скомпилированного out.js?

import 'dart:html';

void main() {
    print(document.querySelector('body'));
}

HTML:

<!DOCTYPE HTML>
<html>
<head>
    <link rel="stylesheet" href="/css/f4cacce_main_1.css" />
    <script src="/js/51de0d2_main_1.js"></script>
</head>
<body>
</body>
</html>

person Tek    schedule 13.01.2015    source источник


Ответы (1)


Если вы импортируете out.js вручную, проблема, вероятно, в вашем HTML-файле. Пожалуйста, добавьте его к вашему вопросу.

Вы должны использовать pub build вместо dart2js (pub build использует dart2js внутри). pub build позаботится о добавлении тега script для сгенерированного JavaScript.

Редактировать

Ваш HTML должен выглядеть так, прежде чем вы запустите pub build

<!DOCTYPE HTML>
<html>
<head>
  <link rel="stylesheet" href="/css/f4cacce_main_1.css" />
</head>
<body>
  <script type="application/dart" src="main1.dart"></script>
  <script src="packages/browser/dart.js"></script>
</body>
</html>

(при условии, что main1.dart — это файл, содержащий ваш код Dart).

Вы можете открыть это в Dartium без сборки на JavaScript.
Вы также можете использовать это с помощью pub serve, а затем открыть его из Dartium или браузеров, не поддерживающих Dart, и pub serve всегда возвращает правильный вывод (Dart или JS).

person Günter Zöchbauer    schedule 14.01.2015
comment
Отредактированный вопрос с HTML. - person Tek; 14.01.2015
comment
Этот код будет запускаться с сервера, поэтому отсутствие дисплея означает отсутствие Dartium. Кроме того, он будет использоваться другими людьми, поэтому мне нужно скомпилировать свой код в javascript. - person Tek; 14.01.2015
comment
Что вы подразумеваете под этим кодом, который будет запускаться с сервера? Браузер загружает код с сервера и выполняет его? Так это обычно делается с клиентскими приложениями Dart. pub build компилирует его в JavaScript. Что вы подразумеваете под будет использоваться для использования другими людьми? Должно ли какое-либо другое приложение Dart или JavaScript загружать встроенный JavaScript (созданный из вашего кода)? - person Günter Zöchbauer; 14.01.2015
comment
Верно, но основная идея в том, что я должен скомпилировать его на сервере. Я буду использовать эту программу для повседневных браузеров, поэтому я не могу использовать метод, описанный вами выше. - person Tek; 14.01.2015
comment
Что вы подразумеваете под идеей, что я должен скомпилировать его на сервере? pub serve — это просто инструмент разработки, поэтому вам не нужно вызывать pub build во время разработки (это делается на лету). Обычно вам нужно скомпилировать код Dart в JavaScript перед тем, как передать его клиенту. Это то, что делает pub build. - person Günter Zöchbauer; 14.01.2015
comment
Как сборка pub влияет на скомпилированный javascript по сравнению с dart2js? - person Tek; 14.01.2015
comment
pub build создает все файлы в проекте и применяет преобразователи, если они указаны в файле pubspec.yaml. Вы также можете добавить dart2js параметры конфигурации в pubspec.yaml, которые учитываются pub build (передаются в dart2js). pub build внутренне звонит dart2js. - person Günter Zöchbauer; 14.01.2015
comment
Несколько примеров настройки dart2js в pubspec.yaml stackoverflow.com/a/21339347/217408, stackoverflow.com/a/23257605/217408 - person Günter Zöchbauer; 14.01.2015
comment
Оказывается, dart2js прекрасно компилировал код дротика в javascript. Я пропустил dart.js, который входит в build/web/packages/browser.js. Это заставило его работать во всех браузерах, а приведенный выше код смог получить доступ к DOM и работал, как ожидалось. Не могли бы вы добавить это к своему ответу, чтобы я мог принять? - person Tek; 16.01.2015