Веб-компонент обсуждался некоторое время, и с помощью полифила webcomponentsjs из проекта полимера разработчики наконец-то могут воспользоваться преимуществами этого мощного инструмента. Поскольку стандарт не зависит от фреймворков, компоненты могут использоваться в любой архитектуре и предлагают простой вариант интеграции компонентов в ваш проект. Но как можно использовать веб-компоненты в проекте Angular 6?
В целом существует два способа определения и распространения веб-компонентов: как файлы JavaScript или как входные данные HTML. Доступно несколько руководств, объясняющих, как использовать JavaScript-файлы в Angular (у Брайана Форбса из Sitepen есть отличный учебник Использование веб-компонентов с Angular), однако интеграция веб-компонентов из HTML-файлов все еще немного хакерская.
В этой статье я представляю, как мне удалось импортировать веб-компонент в мои проекты Angular. В примере приложения используется веб-компонент google-map с веб-сайта webcomponents.org.
TL;DR Поскольку Angular не поддерживает импорт HTML, решение состоит в том, чтобы добавить полифил и веб-компонент, доступные в ресурсах, и загрузить два ресурса в index.html.
Прежде чем мы сможем начать, нам нужно создать новый проект angular с помощью Angular CLI.
ng new sample-google-map-project
Добавьте зависимости беседки
Поскольку большинство веб-компонентов, похоже, распространяются с помощью bower, нам нужно будет добавить менеджер пакетов в проект. Используйте npm, чтобы добавить его в зависимости проекта. Мы добавляем Bower только локально, так как я не очень часто использую Bower. Если вы хотите установить Bower глобально, добавьте в команду -g.
npm install --save bower
Bower сохраняет зависимости проекта в файле bower.json. Чтобы сгенерировать такой файл, используйте команду инициализации Bower и следуйте инструкциям.
./node_modules/.bin/bower init
Поскольку Angular использует npm для управления своими зависимостями, установка для разработчиков обычно ограничивается простой установкой npm, которая запускает npm для установки всех зависимостей. Чтобы сохранить эту функциональность в Bower, нам нужно добавить скрипт postinstall в package.json. Сценарий постустановки вызывается npm после завершения команды установки. Мы будем использовать этот скрипт, чтобы заставить Bower установить зависимости, перечисленные в файле bower.json.
"postinstall": "./node_modules/.bin/bower install"
Теперь мы можем использовать Bower для загрузки файлов для полифила webcomponentsjs и веб-компонента google-map. Исходники будут сохранены в каталоге bower_components.
./node_modules/.bin/bower install --save google-map ./node_modules/.bin/bower install --save webcomponentsjs
Добавьте Bower_components в активы
Если мы посмотрим на файловую структуру в bower_components/google-map, мы увидим, что файлы, содержащие веб-компонент, находятся в google-map.html. Этот файл необходимо импортировать в проект с помощью импорта HTML. К сожалению, Angular пока не поддерживает импорт HTML. Поэтому импорт необходимо реализовать за пределами angular.
В .angular-cli.json нам нужно добавить каталог bower_components к ресурсам, чтобы получить доступ к файлам из index.html. Однако по умолчанию корневой каталог установлен в каталог src, и кли не позволяет ссылаться на файлы за пределами корневого каталога. Поэтому нам нужно изменить корень проекта на корневой каталог.
Это повлияет на все пути к файлам приложения. Поэтому все пути должны быть обновлены.
"apps": [ { "root": "", "outDir": "dist", "assets": [ { "glob": "**/*", "input": "src/assets/", "output": "assets/" }, { "glob": "favicon.ico", "input": "src", "output": "" }, "bower_components" ], "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "test": "src/test.ts", "tsconfig": "src/tsconfig.app.json", "testTsconfig": "src/tsconfig.spec.json", "prefix": "app", "styles": [ "src/styles.css" ], "scripts": [], "environmentSource": "src/environments/environment.ts", "environments": { "dev": "src/environments/environment.ts", "prod": "src/environments/environment.prod.ts" } } ],
В приведенном выше angular-cli.json массив assets содержит все файлы, которые копируются в каталог dist как есть. Здесь мы добавили каталог bower_components, чтобы получить доступ к веб-компонентам, загруженным через Bower. Каталог активов и favicon.ico были заменены объектом, который отображает пути ввода и пути вывода. Это необходимо для сохранения исходной структуры URL-адресов этих ресурсов.
Если вы работаете над реальным проектом или проектом с несколькими зависимостями от Bower, я рекомендую только добавлять файлы, которые вам нужны, в ресурсы, а не весь каталог bower_components
Если вы все сделали правильно, эта ссылка должна вернуть файл bower веб-компонента google-map
зарегистрироваться CUSTOM_ELEMENTS_SCHEMA
Чтобы Angular cli регистрировал веб-компоненты как действительные компоненты, нам нужно добавить регистр CUSTOM_ELEMENTS_SCHEMA в модуль нашего приложения.
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; @NgModule({ /* ... */ schemas:[ CUSTOM_ELEMENTS_SCHEMA ] })
Импортировать веб-компонент google-map
После того, как мы все настроили, теперь мы можем получить доступ ко всем файлам в папке Bower_components. Чтобы загрузить веб-компонент google-map, используйте импорт HTML в файле index.html.
<script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script> <link rel="import" href="bower_components/google-map/google-map.html">
Используйте веб-компонент
Теперь, когда все настроено, мы можем использовать компонент google-map в нашем проекте. Просто добавьте тег в свой app.component.html и добавьте стиль, чтобы придать ему размер (иначе он может не отображаться).
<style> google-map{ width: 300px; height: 300px } </style> <google-map></google-map>
Спасибо, что прочитали мою статью. Я надеюсь, что вы нашли этот урок полезным. Это мой первый пост здесь на Medium, и я буду рад обратной связи. Или, если вы знаете более элегантное решение по интеграции веб-компонентов, поделитесь им.