Знайомимось з Web Components (Polymer)

15 липня 2016 18:06 yarikgenza 285 0

Привіт, кодегідці!

Цього разу ми познайомимось із новим веб-стандартом, та напишемо власний Polymer-компонент.

Що таке Web Components?

It's future. Future of web.

Web Components - це веб-стандарт, який дозволяє нам будувати кастомні, ізольовані html-елементи.

Що крутого нам пропонують Web Components?

  • Можливість створювати власні html-елементи. Наприклад: <my-super-element></my-super-element>
  • Багаторазове використання. Ви можете застосувати ваш компонент знову і знову, на різних сайтах і додатках. Приклад: Ви написали компонент <my-audio>, який вміщує у себе аудіо-плеєр для Вашого сайту. А чому б не використати його ще й для блогу? Для цього ми просто підключаємо js-скрипт та додаємо наш плеєр за допомогою html-тегу - <my-audio></my-audio>. Круто, чи не так?
  • Атрибути. Як і нативні html-елементи, web components також мають атрибути. Приклад: <my-audio mode="dark" autoplay="false"></my-audio>
  • Великий вибір готових компонентів. Ви можете застосувати чужий компонент (audio-player, slider, віджет і тд.) просто додавши html-тег
  • Новий погляд на створення web-додатків. Тепер можна будувати додатки за допомогою компонентів Як вам така структура?
<iron-pages role="main" selected="[[page]]" attr-for-selected="name" selected-attribute="visible">
    <!-- home view -->
    <shop-home name="home" categories="[[categories]]"></shop-home>
    <!-- list view of items in a category -->
    <shop-list name="list" route="[[subroute]]" offline="[[offline]]"></shop-list>
    <!-- detail view of one item -->
    <shop-detail name="detail" route="[[subroute]]" offline="[[offline]]"></shop-detail>
    <!-- cart view -->
    <shop-cart name="cart" cart="[[cart]]" total="[[total]]"></shop-cart>
    <!-- checkout view -->
    <shop-checkout
        name="checkout"
        cart="[[cart]]"
        total="[[total]]"
        route="{{subroute}}"></shop-checkout>
  </iron-pages>

Що таке Polymer?

Polymer - це бібліотека від Google, яка дозволяє нам створювати власні веб-компоненти.

Що нам пропонує Polymer?

  • Легке створення компонентів. Із власними атрибутами, логікою та стилями
  • Поліфіли - завдяки ним компоненти без проблем підтримуються всіма популярними браузерами (Chrome, Firefox, Opera, Safari)

Пишемо власний веб-компонент!

Сьогодні ми підготуємо середовище на напишемо тестовий варіант компонента.

Розпочнемо.

Створюємо директорію для нашого проекту:

mkdir my-component

Переходимо в директорію та ініціалізуємо node.js - додаток.

cd my-component
npm init

(Переконайтесь, що у вас встановлений node.js)

Використання node.js для веб-компонентів необовязкове. Ми застосовуємо його лише для віддачі статики та bower.

Натискаємо Enter, поки у нашій директорії не з'явиться файл package.json

Пишемо сервер для віддачі html-сторінки:
Встановлюємо Express

npm i --save express

В корені директорії створюємо два файли:
server.js та index.html

Вміст server.js:

const express = require('express') //підключаємо express
const app = express() //ініціалізуємо додаток
const port = 7000; //оголошуємо порт
app.use(express.static(__dirname));   //використовуємо віддачу статики
app.listen(port, () => {  //реєструємо порт
  console.log(`listening at ${port}...`)
})

Вміст index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Codeguida atricle page</title>
</head>
<body>
  <h1>Hello world!</h1>
</body>
</html>

Запускаємо наш сервер:

node server.js

Та знаходимо наш сайт за адресою

http://localhost:7000/

Налаштовуємо Polymer

Для зручності інсталюємо bower

npm i bower -g

Інсталюємо Polymer

bower install polymer

Створимо окрему директорію в нашому проекті для компонентів "components" із файлом "my-component.html".

Та імпортуємо polymer + наш веб-компонент у головний index.html

<script src="./bower_components/webcomponentsjs/webcomponents.min.js"></script>
  <link rel="import" href="./components/my-component.html">

Тепер можемо викликати наш веб-компонент за допомогою html-тегу:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Codeguida atricle page</title>
  <script src="./bower_components/webcomponentsjs/webcomponents.min.js"></script>
  <link rel="import" href="./components/my-component.html">
</head>
<body>
  <my-component></my-component>
</body>
</html>

Поки-що виникне помилка, оскільки ми ще не написали шаблон + логіку нашого компонента.

// my-component.html
<link rel="import" href="../bower_components/polymer/polymer.html"> <!--імпортуємо Polymer-->
<dom-module id="my-component">
    <template> <!-- шаблон нашого компоненту:  html-структура та стилі -->
        <style>
            .container {
              font-family: Roboto, Noto, sans-serif;
            }
            #name {
              color: red;
            }
        </style>
      <div class="container">
        <div id="hello-box">
          Hi, <span id="name">[[name]]</span> <!-- [[name]] - змінна, яку можна передавати у атрибути html-тега -->
        </div>
      </div>
    </template>
    <script>
        Polymer({ // ініціалізуємо компонент
            is: 'my-component',  // визначає тег, за допомогою якого ми зможемо викликати компонент
            properties: {  // вказуємо, які атрибути може приймати html-тег нашого компонента
            name: {
              type: String,  // тип даних
              value: "Yarik" // значення за замовчуванням
            }
            },
            attached: function() {
            console.log('Component initialised')
                // `attached` викликається коли елементи та шаблон уже зрендерений в DOM
                //це хороше місце для функцій, які працюють із DOM-елементами, наприклад анімацій.
            }
        });
    </script>
</dom-module>

Перевіряємо нашу сторінку у браузері і радіємо появі компонента.

Зверніть увагу на <my-component></my component> тег у структурі DOM дерева. Він зовсім не відрізняється від звичайних html-елементів. Круто, так?

Працюємо із атрибутами.

Звичайні html-елементи мають атрибути.

<input type="text"...
<audio src="audio-file-url"..

Ми також можемо використовувати атрибути у нашому компоненті.
Вище у логіці компонента за допомогою цього коду :

properties: {  
            name: {
              type: String,  // тип даних
              value: "Yarik" // Значення за замовчуванням
            }
            },

Ми вказали, які атрибути може приймати тег компонента та задали значення за замовчуванням. Давайте спробуємо передати name-атрибут тегу <my-component></my-component>

// index.html
<body>
  <my-component name="codeguidaUser"></my-component>
</body>

Перевіряємо результат і дивуємося можливостям Polymer.

На сьогодні все.
Юзайте web components :)

285 5

Схожі матеріали:

Коментарі:

Авторизуйтесь, щоб залишити коментар.