Полимер 3: ошибка ссылки: определение не определено в Firefox

#javascript #polymer #polymer-3.x

#javascript #полимер #polymer-3.x

Вопрос:

Я вручную конвертирую проект из Polymer 2 в Polymer 3. Примечание: сначала я безуспешно попробовал modulizer (я сделал много попыток в Windows, linux и mac), поэтому я решил перейти вручную. Этот вопрос не касается modulizer (уже много обсуждений).

Проект довольно огромный, поэтому я конвертирую его по шагам. Я смог заставить базовую часть работать (преобразование всех необходимых элементов в классы ES6 и т.д.).

Я тестирую его с помощью polymer serve, поэтому пока не в сборке.

Он также корректно работает в Chrome и Chrome Canary и загружается довольно быстро. В Firefox я получаю пустую страницу, и эта ошибка в консоли: ReferenceError: define не определена

Я пока ничего не нашел об этой ошибке в Интернете, поэтому решил спросить сообщество.

Он застрял в первой строке загруженного элемента. Извините, я не могу предоставить так много кода, просто чтобы иметь представление о том, где он застрял:

 define(["../../node_modules/@polymer/polymer/polymer-element.js", 
...
...

 

правильно ли, что импорт исходного кода преобразуется таким образом в FF?
В этой же строке представлены все импортируемые модули в массиве.

Первая строка того же элемента в консоли Chrome выглядит следующим образом:

 import { PolymerElement, html } from "../../node_modules/@polymer/polymer/polymer-element.js";
 

за ним следует другой импорт, например, в исходном коде, который выглядит следующим образом:

 import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
 

Любая помощь действительно приветствуется.
Спасибо!

Обновление после нескольких тестов:

Я заметил, что эта проблема возникает, когда я импортирую модуль, добавляя его в скрипт с помощью createElement.

Я попробовал в новом проекте Polymer 3 (без преобразования, только демонстрация, которую они имеют в первом элементе Polymer 3).

Если я включу модуль таким образом (по умолчанию в demo/index.html ):

 <script type="module" src="demo-element.js"></script>
 

он нормально работает как в Chrome, так и в Firefox.

Если я вместо этого включу модуль другим способом:

 <script>

  let script = document.createElement('script');
  script.setAttribute('type','module');
  script.setAttribute('src', 'demo-element.js');
  script.onload = function(){
    console.log('ready');
  };

  document.head.appendChild(script);

</script>
 

это работает только в Chrome.
В Firefox он выдает ту же ошибку (определение не определено):

введите описание изображения здесь

Я также попытался добавить прослушиватель в WebComponentsReady и загрузить модуль после него:

 <script>

  window.addEventListener('WebComponentsReady', function(e) {
    console.log('components ready');

    let script = document.createElement('script');
    script.setAttribute('type','module');
    script.setAttribute('src', 'demo-element.js');
    script.onload = function(){
      console.log('ready');
    };

    document.head.appendChild(script);

  });

</script>
 

и я получил в Firefox ту же ошибку:

введите описание изображения здесь

Примечание: та же проблема возникает и в Edge. Это работает только в Chrome. Я не тестировал в Safari.

На данный момент я немного застрял. Спасибо за любую помощь.

Комментарии:

1. Определите функцию из RequireJS, в частности, форму «определить с зависимостями» этой функции. Он используется для определения «модуля». Если вы предоставите свою версию Polymer 2, будет легко понять предмет. requirejs.org/docs/api.html#define

2. Спасибо за ваш ответ. Я не уверен, где RequireJS используется в нашем приложении. Я обнаружил, что мы используем только require.js потому что он импортируется raven.js для sentry (он загружается в наш предварительный загрузчик как глобальная функция). Для тестирования я попытался полностью удалить raven, но ошибка все еще существует. Как вы думаете, это может быть связано с сервером Polymer 3? Использует ли Polymer сам RequireJS? Кроме того, у вас есть идея, почему он работает в Chrome, а не в FF? Я немного запутался в этом вопросе, может быть, другой способ загрузки компонентов? Еще раз спасибо!

3. Похоже, у нас есть последняя версия в зависимостях npm: ` «node-requirejs-define»: { «версия»: «1.0.1», «решаемая»: » registry.npmjs.org/node-requirejs-define /-/… «, «целостность»: «sha1-5x7DpGQ/P3PwnYcWKslZcqnmZt8=», «требуется»: {«requirejs»: «2.3.6» } }, `