Введение
Впервые я начал использовать Веб-компоненты и Полимер почти 3 года назад. В то время WebComponents все еще были идеей, написание полимерных элементов в Dart все еще оставалось популярной идеей, а библиотека (теперь фреймворк, но скоро снова станет библиотекой) все еще находилась на расстоянии более полугода от производства. выпуск. Тем не менее, как разработчик, который прошел путь от jQuery до Knockout и Durandal, я влюбился в мечту о WebComponents как кросс-браузерной спецификации для создания компонентов пользовательского интерфейса, не зависящих от фреймворка.
Перенесемся в сегодняшний день, и эта мечта очень близка к реальности. WebComponents не только готовы, поддержка со стороны 3 основных производителей браузеров практически завершена. Они практически готовы к использованию везде. Поскольку я большой поклонник простоты, скорости и эффективности FuseBox, я решил опубликовать статью, в которой подробно рассказывается, как объединить их вместе.
Это кому?
Это для всех, кто прочитал статью Роб Додсон о Как использовать Polymer с Webpack и подумал, что это здорово, но с FuseBox могло бы быть еще лучше.
Привет, мир!
Я создал крошечный демонстрационный проект, чтобы вы могли следить за ним.
Для начала создайте пустую папку проекта. Создайте в корне проекта папку package.json со следующим содержимым:
Установите зависимости с помощью пряжи.
yarn
Затем создайте свою fuse.js
конфигурацию и добавьте следующий код. Я сделал все возможное, чтобы прокомментировать каждый раздел, поэтому, если вы новичок в FuseBox, вы можете понять, что происходит.
Это довольно стандартная настройка FuseBox, за исключением копирования поверх полифилла WebComponents. Мы вернемся к этому позже.
Затем мы создадим наш компонент hello-world.ts
в каталоге компонентов с помощью следующего кода.
Одна небольшая деталь заключается в том, что из-за того, что мы используем TypeScript, класс PolymerElement
не регистрируется правильно. Чтобы исправить это, добавьте файл typings.d.ts
в каталог src
со следующим содержимым.
declare var Polymer: { Element: { new () } }
Затем мы импортируем этот компонент вindex.ts
и определим его с помощью customElements.define
.
Наконец, мы создадим наш HTML-файл шаблона index.html
со следующим кодом.
Важно отметить, что мы используем custom-elements-es5-adapter
для обработки наших транспилированных компонентов в браузерах с встроенной поддержкой и используем $bundles
, чтобы сообщить FuseBox, куда вставлять файлы сборки. В качестве последнего шага скопируйте webcomponents-lite.js
в каталог src
из node_modules/@webcomponents/webcomponentsjs
.
Теперь мы можем запустить node fuse
и быть щедро вознаграждены нашим hello-world
рендерингом компонентов в браузере.
Таким образом, вы успешно собрали свой первый компонент Polymer с помощью FuseBox. На этом можно закончить, но помните, что это решение будет работать только в Chrome и Safari.
Самым простым решением было бы загрузить полифилл webcomponents-lite
, но это решение означало бы загрузку ненужных зависимостей в браузеры, которые полностью соответствуют спецификации.
Второе и лучшее решение - использовать webcomponents-loader
для необязательной загрузки зависимостей, а затем определять наши компоненты после срабатывания события WebComponentsReady
.
Для этой статьи я выберу вариант 3: использование динамического импорта для загрузки полифилла, если это необходимо; в противном случае вернуться к определению компонентов. Скопируйте webcomponents-lite.js
в наш src
директор, а затем обновите index.ts
следующим кодом.
Если мы обнаружим, что Shadow DOM или API Custom Element отсутствуют, мы сначала загрузим полифилл, а затем загрузим компоненты и определим их. В противном случае мы просто загружаем и определяем их.
Открытые вопросы
А как насчет использования пряжи --flat
при установке Polymer?
К сожалению, похоже, что существует проблема с разрешением между некоторыми библиотеками Polymer и FuseBox. Несмотря на это, я смог успешно установить зависимости и построить, не полагаясь на этот флаг.
Вывод
Надеюсь, теперь вы хорошо понимаете, как легко создавать Polymer с помощью FuseBox. Оба инструмента представляют значительную ценность для сообщества разработчиков, и их совместное использование является естественным шагом к созданию компонентов, не зависящих от инфраструктуры.
Большое спасибо Робу Додсону и его полезной статье, которую я без зазрения совести адаптировал.
Счастливые тропы.