Мигание во время рендеринга страниц с пользовательскими элементами (проблема FOUC)

Я использую пакет dart-polymer для создания пользовательских элементов. Я заметил, что во время загрузки страницы с пользовательскими элементами происходит некоторое мигание. Этот эффект также виден для очень простого приложения ClickCounter. Есть ли способ избежать этого раздражающего мигания?

Проблема хорошо описана в Википедии http://en.wikipedia.org/wiki/Flash_of_unstyled_content.

Предлагаемое решение с сайта http://www.polymer-project.org/docs/polymer/styling.html#fouc-prevention не работает для простого приложения (полимер: «0.10.0-pre.2»).

<html>
  <head>
    <title>Click Counter</title>

    <!-- import the click-counter -->
    <link rel="import" href="packages/polymer/polymer.html">
    <link rel="import" href="clickcounter.html">
    <script type="application/dart">export 'package:polymer/init.dart';</script>
    <script src="packages/browser/dart.js"></script>
  </head>
    <body unresolved>
    <h1>CC</h1>

    <p>Hello world from Dart!</p>

    <div id="sample_container_id">
      <click-counter count="5"></click-counter>
    </div>

  </body>
</html>
<polymer-element name="click-counter" attributes="count">
  <template>
    <style>
      div {
        font-size: 24pt;
        text-align: center;
        margin-top: 140px;
      }
      button {
        font-size: 24pt;
        margin-bottom: 20px;
      }
    </style>
    <div>
      <button on-click="{{increment}}">Click me</button><br>
      <span>(click count: {{count}})</span>
    </div>
  </template>
  <script type="application/dart" src="clickcounter.dart"></script>
</polymer-element>
import 'package:polymer/polymer.dart';

/**
 * A Polymer click counter element.
 */
@CustomTag('click-counter')
class ClickCounter extends PolymerElement {
  @published int count = 0;

  ClickCounter.created() : super.created() {
  }

  void increment() {
    count++;
  }
}

см. также созданную задачу на code.google.com https://code.google.com/p/dart/issues/detail?id=17498


person Roman    schedule 14.03.2014    source источник
comment
Какой браузер (Dartium, Chrome, Firefox), какая версия Dart, какая версия Polymer? Есть ли этот образец приложения где-нибудь в Интернете, где это можно проверить? Я много работаю с Polymer, но понятия не имею, что вы имеете в виду.   -  person Günter Zöchbauer    schedule 14.03.2014
comment
Окружение: Dartium для dart code и последний FF для скомпилированного js-code, последняя dev версия (1.2.0-dev.5.15) dart, последний Polymer (0.10.0-pre.2). Вы можете создать веб-приложение (используя библиотеку полимеров) с демонстрационным содержимым в DartEditor и запустить его в Dartium. Еще в этом примере видно мигание пользовательского элемента при загрузке страницы. мигание означает задержку при создании пользовательского элемента. Статический DOM загружается мгновенно.   -  person Roman    schedule 14.03.2014
comment
Кажется, я знаю, что ты имеешь в виду.   -  person Günter Zöchbauer    schedule 14.03.2014
comment
Я думаю, это потому, что Dart может сработать только после загрузки DOM. Единственная идея, которая у меня есть, это использовать polymer-project.org/ docs/polymer/styling.html#fouc-prevention   -  person Günter Zöchbauer    schedule 14.03.2014
comment
Да, это хорошее временное решение, но скорость загрузки страницы останется прежней. Он отлично работает для приложений, подобных ClickCounter :)   -  person Roman    schedule 14.03.2014
comment
К сожалению, неразрешенный атрибут тела не работает.   -  person Roman    schedule 15.03.2014
comment
То, что я видел, имена классов, используемые в Dart, кажутся разными. Недавно была подмена. Раньше это делалось для каждого компонента отдельно, а теперь — для элемента body. Вероятно, имена классов тоже недавно изменились, и PolymerDart еще не обновлен. То, что я видел во время очень короткой загрузки страницы в Dartium DevTools, всплывало как «polymer-unveil» (не было показано достаточно долго, чтобы быть уверенным). Я изучу исходный код и обновлю свой ответ.   -  person Günter Zöchbauer    schedule 15.03.2014


Ответы (1)


Polymer 0.9.5
Используемые имена классов: polymer-veiled (скрытый) и polymer-unveil (во время перехода к раскрытию). 0.9.0 должно работать.

Соответствующий код находится в packages/polymer/src/boot.dart.

Polymer 0.10.0
Polymer 0.10.0-pre.1 уже использует атрибут unresolved, как описано здесь
Polymer – Справочник по стилю – Предотвращение FOUC

Вам нужно добавить ограничение версии в pubspec.yaml, чтобы получить версию для разработки, например
polymer: ">=0.10.0-pre.1"

person Günter Zöchbauer    schedule 15.03.2014
comment
Спасибо! Но я уже использую polymer: '>=0.10.0-pre.0 <0.11.0', а unresolved не работает для кода выше.. - person Roman; 15.03.2014
comment
Когда я добавляю атрибут unresolved в тело, он удаляется, но я также думаю, что на самом деле он не работает. Я не мог найти способ использовать это, чтобы отображение страницы выглядело как плавный переход. Я снял ошибку. - person Günter Zöchbauer; 15.03.2014