2014-12-05 2 views
3

Я хотел бы экспортировать Dart API в JavaScript в браузерах без Dart VM. Например, если класс А:Экспорт Dart API на JavaScript без Dart VM

class A { 
    String name; 

    A(); 

    A.withName(this.name); 
} 

Я хотел бы создать объект JavaScript с помощью экспортируемого API с:

var a = new A(); 

Ответ на мой previous question указал мне на JS-Interop.

Однако я не могу получить ожидаемый результат при работе через README example. Похоже, что моя библиотека Dart не экспортируется в JavaScript.

pubspec.yaml:

name: interop 
description: > 
    A library useful for applications or for sharing on pub.dartlang.org. 
version: 0.0.1 
dev_dependencies: 
    unittest: any 
dependencies: 
    js: 
    git: 
     url: git://github.com/dart-lang/js-interop.git 
transformers: 
    - js 
    - js/initializer 

Пример/main.dart

библиотека Основной:

import 'package:js/js.dart'; 

main() { 
    initializeJavaScript(); 
} 

Библиотека/a.dart

library a; 

import 'package:js/js.dart'; 

@Export() 
class A { 
    String name; 

    A(); 

    A.withName(this.name); 
} 

index.html

<html> 
    <head> 
    <script src="packages/js/interop.js"></script> 
    </head> 
    <body> 
    <script type="application/dart" src="build/example/main.dart"></script> 
    </body> 
</html> 

(Это не ясно, где атрибут SRC из этого последнего тега сценария должен указывать. Я также попытался использовать /example/main.dart, что не меняет результат.)

Ожидается, что я смогу открыть консоль после компиляции (Tool -> Pub Build) и загрузить index.html , а затем сделать это:

var a = new dart.a.A(); 

Однако я получаю вместо этого: «не удается прочитать свойство„а“не определено». Другими словами, dart.a не определено.

Включение исходного скрипта Дарта в index.html предполагает, что js-interop предназначен для браузера с Dart VM. Я попытался запустить index.html на Dartium с тем же результатом.

Что мне не хватает?

ответ

2

Атрибут тега сценария по-прежнему должен указывать на файл со сценарием Дартс, который содержит метод main(). Когда приложение построено на JavaScript с использованием pub build Dart скомпилирован в JavaScript и может быть запущен в браузерах без Dart VM.

+0

Спасибо, это приятно знать. Учитывая, что любые идеи относительно того, где моя установка идет не так? –

+0

Я еще не использовал этот пакет, но я знаю, что вам нужно запустить 'pub build', чтобы получить JavaScript из Dart и файл' main.dart', который указывает файл 'src', не должен находиться в каталоге' build'. Когда вы запускаете 'pub build', каталог' build' очищается. Файл 'main.dart' должен находиться в каталоге' web', а атрибут 'src' должен быть просто' src = 'main.dart' –

+0

Спасибо за подсказку. Я добавил каталог «web» и переместил index.html там. Отредактировано src, чтобы указать на «main.dart». Я могу «Запустить» index.html, и сервер запустится. Однако проблема остается. dart.a не указана после загрузки страницы. , и многие файлы dart загружаются при загрузке страницы, о чем свидетельствует «Выход инструмента» в редакторе Dart. –

0

Да, это работает только в браузере JavaScript. Оказывается, в документации не указаны все этапы. Вот что сработало для меня, начиная с нового проекта.

Создайте новый пакетный проект под названием «jsout», используя (Файл-> Новый проект/пакет).Удалить эти файлы:

  • test/all_test.dart
  • example/jsout.dart

Редактировать эти файлы:

pubspec.yaml

name: jsout 
description: > 
    A library useful for applications or for sharing on pub.dartlang.org. 
version: 0.0.1 
dev_dependencies: 
    unittest: any 
dependencies: 
    js: 
    git: 
     url: git://github.com/dart-lang/js-interop.git 
transformers: 
    - js 
    - js/initializer 

Библиотека/main.dart

part of main; 

@Export() 
class A { 
    String name; 

    A(); 

    A.withName(this.name); 

    talk() { 
    print(name); 
    } 
} 

Создать папку web, и добавить эти файлы:

веб/main.dart

library main; 

import 'package:js/js.dart'; 

part '../lib/jsout.dart'; 

main() { 
    initializeJavaScript(); 
} 

веб/index.html

<!DOCTYPE html> 
<html> 
    <head></head> 
    <body> 
    <script src="main.dart_initialize.js"></script> 
    <script src="main.dart.js"></script> 
    </body> 
</html> 

После обновления эти файлы, загружать index.html и откройте консоль:

var a = new dart.main.A.withName('foo'); 

a.talk(); // returns 'foo' 

Эта процедура работала пересмотра 7afdb.

+0

Почему у вас есть файл 'main.dart.js 'как источник скрипта. У вас даже нет такого файла. Я думаю, вам стоит ссылаться на файл' main.dart' здесь. 'Pub build' или' pub serve' должен заменить это на лету при загрузке из браузера, не поддерживающего Dart. –

+0

Этот подход работал при запуске Dartium, но нет t Chrome. В последнем случае при запуске конструктора возникла ошибка. Эта ошибка исчезла при использовании файлов javascript. –

+0

Когда вы загружаете 'index.html' из' build/web', созданного 'pub build'? Можете ли вы опубликовать сообщение об ошибке? Вы пробовали его с помощью 'pub serve' (или запуска из DartEditor, который использовал' pub serve' за шторами). –