Статьи

Как создать плагин Vorlon.js для удаленного тестирования собственного JavaScript

Во время основного выступления на недавней конференции // BUILD 2015 наша команда в Microsoft выпустила Vorlon.js , инструмент для отладки вашего сайта.

Vorlon.js в основном состоит из панели инструментов, которая отображает данные, поступающие с вашего сайта. Чтобы это работало, вам нужно всего лишь ссылаться на скрипт в коде вашего сайта.

Vorlonjs приборная панель

Мы ( Pierre Lagarde , David Catuhe , David Rousset и я ) создали это в первую очередь, чтобы помочь веб-разработчикам отлаживать свои сайты на мобильных устройствах . Конечно, уже существуют проприетарные решения, такие как инструменты разработчика Chrome для отладки Chrome Mobile, аналог Safari, Visual Studio для Internet Explorer или даже Weinre; но ни один из них не является действительно независимым от технологии и платформы.

Это пробел, который мы хотели заполнить с помощью Vorlon.js.

Диаграмма, показывающая работу Vorlon с разными платформами

Вы можете установить Vorlon.js из npm или путем клонирования репозитория GitHub и использования gulp для подготовки к работе.

Вы можете найти больше информации об этом на нашем сайте или в блоге, который написал мой друг Дэвид .

Чтобы создать плагин для Vorlon, вы можете использовать TypeScript или сделать это напрямую с помощью JavaScript.

Я дам вам код JavaScript и TypeScript, чтобы вы могли читать его на своем любимом языке!

В этой статье я решил создать плагин, который будет получать информацию об устройстве. Это основано на сайте http://mydevice.io/, созданном Raphaël Goetter . Для простоты я получу данные только из раздела « Размеры » в категории « Мой экран ».

скриншот mydeviceio

Если этот плагин активирован, на панели мониторинга Vorlon.js будет отображаться информация о размере, полученная от клиента.

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

В этом видео я делаю демонстрацию в настольном браузере, но это, очевидно, также работает на мобильном телефоне или планшете.

Плагин Vorlon.js — это не что иное, как HTML, CSS и код JavaScript. Ваш плагин получает данные от клиента и отправляет их на сервер для отображения на панели инструментов.

Это означает, что вы можете сначала сделать это без Vorlon.js, написать все в простом веб-проекте, а затем включить его в архитектуру плагина Vorlon.js.

Наш плагин получит некоторую информацию, связанную с размером клиента, и отобразит ее в списке HTML. Это также обновит данные при изменении размера браузера. Вы можете увидеть полный образец, запущенный здесь (это не красиво, но делает работу!).

Мой экран, показывающий размеры устройства

HTML-код довольно легкий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html xmlns=»http://www.w3.org/1999/xhtml»>
    <head>
        <title></title>
        <link href=»control.css» rel=»stylesheet» />
        <script src=»vorlon.deviceinfo.js»></script>
    </head>
    <body>
        <div id=»deviceinfo» class=»deviceinfo-container»>
            <h2>My Screen</h2>
            <ul>
                <li>CSS device-width: <span id=»devicewidth»>
                <li>CSS device-height: <span id=»deviceheight»>
                <li>JS screen.width: <span id=»screenwidth»>
                <li>JS window.innerWidth: <span id=»windowinnerwidth»>
                <li>JS body.clientWidth: <span id=»bodyclientwidth»>
                <li>JS screen.availWidth: <span id=»screenavailwidth»>
            </ul>
        </div>
    </body>
</html>

Он использует следующий файл control.css:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
.deviceinfo-container {
    font-family: «Verdana», «Comic Sans MS»;
}
 
.deviceinfo-container h2 {
    font-weight: normal;
}
 
.deviceinfo-container ul li {
    font-weight: bold;
}
 
.deviceinfo-container ul span {
    font-weight: normal;
}

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
(function(){
    var compute = function() {
        document.getElementById(‘devicewidth’).innerText = document.documentElement.clientWidth + ‘px’;
        document.getElementById(‘deviceheight’).innerText = document.documentElement.clientHeight + ‘px’;
        document.getElementById(‘screenwidth’).innerText = screen.width + ‘px’;;
        document.getElementById(‘windowinnerwidth’).innerText = window.innerWidth + ‘px’;
        document.getElementById(‘bodyclientwidth’).innerText = document.body.clientWidth + ‘px’;
        document.getElementById(‘screenavailwidth’).innerText = screen.availWidth + ‘px’;
    };
      
    window.onresize = function(event) {
        compute();
    };
      
    document.addEventListener(«DOMContentLoaded», compute);
 
})();

Итак, до сих пор мы пишем только простой, классический веб-код. Давайте теперь посмотрим, как преобразовать это в плагин Vorlon.js!

В Vorlon.js плагин — это класс JavaScript, который наследуется от класса Plugin. Минимальный код содержит constructor и функцию getID .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var __extends = this.__extends ||
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d;
    __.prototype = b.prototype;
    d.prototype = new __();
};
var VORLON;
(function (VORLON) {
    var MyDeviceInfo = (function (_super) {
        __extends(MyDeviceInfo, _super);
        function MyDeviceInfo() {
            _super.call(this, «mydeviceinfo», «control.html», «control.css»);
            this._ready = true;
        }
        MyDeviceInfo.prototype.getID = function () {
            return «MYDEVICEINFO»;
        };
        return MyDeviceInfo;
    })(Plugin);
    VORLON.MyDeviceInfo = MyDeviceInfo;
 
    //Register the plugin with vorlon core
    Core.RegisterPlugin(new MyDeviceInfo());
})(VORLON || (VORLON = {}));
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
module VORLON {
    export class MyDeviceInfo extends Plugin {
 
        constructor() {
            super(«mydeviceinfo», «control.html», «control.css»);
            this._ready = true;
        }
 
        public getID(): string {
            return «MYDEVICEINFO»;
        }
    }
 
    //Register the plugin with vorlon core
    Core.RegisterPlugin(new MyDeviceInfo());
}

Идентификатор — это просто строка, которую вы можете выбрать. Он понадобится вам, когда вы добавите плагин на панель инструментов.

Конструктор вызывает функцию super и присваивает ей имя — файлы control.html и control.css. Для этого необходимо знать эти файлы и загружать их при необходимости.

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

Каждый раз, когда он загружает плагин, панель инструментов создает новую вкладку в правой панели. Это пространство для рендеринга вашего плагина.

Часть макета для плагина Vorlon.js содержится в файле HTML. В примере, который мы собираемся создать, он называется control.html, который является соглашением в плагинах Vorlon.js. Он не отображается по умолчанию, поэтому вы должны управлять им в коде вашего плагина. Это делается с помощью _insertHtmlContentAsync и обычно в функции startDashboardSide .

startDashboardSide вызывается, когда панель мониторинга создает плагин на стороне сервера. Он имеет только один параметр, который является HTML-дивом, где вы можете визуализировать свой элемент управления. По сути, это div, который отображается на вкладке вашего плагина.

_insertHtmlContentAsync — это помощник, который асинхронно загружает все файлы, которые вы дали во время создания плагина. Первый аргумент — это рендеринг div, а второй — функция обратного вызова, дающая вам загруженный div после того, как все сделано.

1
2
3
4
5
6
MyDeviceInfo.prototype.startDashboardSide = function (div) {
    if (div === void 0) { div = null;
    this._insertHtmlContentAsync(div, function (filledDiv) {
        //load data
    });
};
1
2
3
4
5
public startDashboardSide(div: HTMLDivElement = null): void {
    this._insertHtmlContentAsync(div, (filledDiv) => {
        //load data
    })
}

В части control.html вам нужно только удалить ссылку JavaScript, что приводит к следующему коду:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html xmlns=»http://www.w3.org/1999/xhtml»>
    <head>
        <title></title>
        <link href=»control.css» rel=»stylesheet» />
    </head>
    <body>
        <div id=»mydeviceinfocontainer» class=»deviceinfo-container»>
            <h2>My Screen</h2>
            <ul>
                <li>CSS device-width: <span id=»devicewidth»>
                <li>CSS device-height: <span id=»deviceheight»>
                <li>JS screen.width: <span id=»screenwidth»>
                <li>JS window.innerWidth: <span id=»windowinnerwidth»>
                <li>JS body.clientWidth: <span id=»bodyclientwidth»>
                <li>JS screen.availWidth: <span id=»screenavailwidth»>
            </ul>
        </div>
    </body>
</html>

Итак, теперь, когда вы визуализируете свой шаблон управления на панели инструментов, вам нужно отправить ему данные от клиента. По исходному коду это было сделано на той же странице. Теперь вам нужно все упаковать и отправить.

Весь процесс общения обрабатывается для вас. Вам нужно только создать объект с данными в нем и вызвать правильную функцию. Это помощник, доступный в Core.Messenger именем sendRealTimeMessage .

В классе MyDeviceInfo мы добавляем пользовательскую функцию с именем sendClientData . Он получит всю информацию о текущем размере и отправит ее.

01
02
03
04
05
06
07
08
09
10
11
MyDeviceInfo.prototype.sendClientData = function () {
    var data = {
        «devicewidth»: document.documentElement.clientWidth,
        «deviceheight»: document.documentElement.clientHeight,
        «screenwidth»: screen.width,
        «windowinnerwidth»: window.innerWidth,
        «bodyclientwidth»: document.body.clientWidth,
        «screenavailwidth»: screen.availWidth
    };
    VORLON.Core.Messenger.sendRealtimeMessage(this.getID(), data, 0 /* Client */);
};
01
02
03
04
05
06
07
08
09
10
11
12
public sendClientData(): void {
    var data = {
        «devicewidth» : document.documentElement.clientWidth,
        «deviceheight» : document.documentElement.clientHeight,
        «screenwidth» : screen.width,
        «windowinnerwidth» : window.innerWidth,
        «bodyclientwidth» : document.body.clientWidth,
        «screenavailwidth» : screen.availWidth
    };
              
    Core.Messenger.sendRealtimeMessage(this.getID(), data, RuntimeSide.Client);
}

SendRealtimeMessage имеет три обязательных параметра:

  • идентификатор плагина (это строка, которую вы возвращаете в функции getID )
  • объект, который вы хотите отправить (здесь, содержащий информацию о размерах)
  • арендатор, откуда поступил запрос (клиент или панель инструментов)

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

startClientSide функция, которая будет вызываться при инициализации клиента для регистрации в событии window.onresize :

1
2
3
4
5
6
MyDeviceInfo.prototype.startClientSide = function () {
    var that = this;
    window.onresize = function (event) {
        that.sendClientData();
    };
};
1
2
3
4
5
6
public startClientSide(): void {
    var that = this;
    window.onresize = (event) => {
        that.sendClientData();
    };
}

Каждый раз, когда пользователь изменяет размер браузера, этот код отправляет новую информацию на панель инструментов.

И, наконец, нам нужно добавить функцию refresh . Он будет вызываться каждый раз, когда приборной панели нужна текущая информация от клиента.

1
2
3
MyDeviceInfo.prototype.refresh = function () {
    this.sendClientData();
};
1
2
3
public refresh(): void {
    this.sendClientData();
}

И это все!

Теперь, когда данные отправляются с клиента на панель инструментов, вам все равно нужно обрабатывать их на другой стороне.

Для этого вы можете использовать функцию onRealtimeMessageReceivedFromClientSide . Он вызывается каждый раз, когда клиент отправляет сообщение через Core.Messenger . Он имеет только один параметр, в котором вы получаете объект, который вы отправили.

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

1
2
3
4
5
6
7
8
9
MyDeviceInfo.prototype.onRealtimeMessageReceivedFromClientSide = function (receivedObject) {
    document.getElementById(‘devicewidth’).innerText = receivedObject.devicewidth + ‘px’;
    document.getElementById(‘deviceheight’).innerText = receivedObject.deviceheight + ‘px’;
    document.getElementById(‘screenwidth’).innerText = receivedObject.screenwidth + ‘px’;
    ;
    document.getElementById(‘windowinnerwidth’).innerText = receivedObject.windowinnerwidth + ‘px’;
    document.getElementById(‘bodyclientwidth’).innerText = receivedObject.bodyclientwidth + ‘px’;
    document.getElementById(‘screenavailwidth’).innerText = receivedObject.screenavailwidth + ‘px’;
};
1
2
3
4
5
6
7
8
public onRealtimeMessageReceivedFromClientSide(receivedObject: any): void {
    document.getElementById(‘devicewidth’).innerText = receivedObject.devicewidth + ‘px’;
    document.getElementById(‘deviceheight’).innerText = receivedObject.deviceheight + ‘px’;
    document.getElementById(‘screenwidth’).innerText = receivedObject.screenwidth + ‘px’;;
    document.getElementById(‘windowinnerwidth’).innerText = receivedObject.windowinnerwidth + ‘px’;
    document.getElementById(‘bodyclientwidth’).innerText = receivedObject.bodyclientwidth + ‘px’;
    document.getElementById(‘screenavailwidth’).innerText = receivedObject.screenavailwidth + ‘px’;
}

Чтобы протестировать этот плагин, вам нужно выполнить несколько простых шагов.

Если вы выбрали TypeScript, вам нужно будет использовать инструмент, такой как компилятор TypeScript, доступный на npm , или интегрировать себя в процесс gulp, изменив файл gulpfile.js, доступный в папке /Plugins .

После завершения компиляции из TypeScript в JavaScript вам нужно минимизировать ваш JS-файл. Важно, что вы используете это соглашение:

  • vorlon.yourPluginName.js (для развернутой версии)
  • vorlon.yourPluginName.min.js (для минимизированной версии)

Второй шаг — скопировать все ваши файлы в папку /Server/public/vorlon/plugins . Там вы должны создать папку, используя имя вашего плагина и поместить все под нее. Это включает в себя ваши файлы HTML, CSS и JavaScript.

Вот как это делается для плагина, который мы создаем в этой статье:

Папка с файлами CSS HTML и JS

Следующим шагом является регистрация вашего плагина на сервере. Для этого добавьте строку в файл Server/public/catalog.json :

01
02
03
04
05
06
07
08
09
10
{
    «IncludeSocketIO»: true,
    «plugins»: [
        { «id»: «CONSOLE», «name»: «Interactive Console», «panel»: «bottom», «foldername» : «interactiveConsole»},
        { «id»: «DOM», «name»: «Dom Explorer», «panel»: «top», «foldername» : «domExplorer» },
        { «id»: «MODERNIZR», «name»: «Modernizr»,»panel»: «bottom», «foldername» : «modernizrReport» },
        { «id» : «OBJEXPLORER», «name» : «Obj. Explorer»,»panel»: «top», «foldername» : «objectExplorer» },
        { «id» : «MYDEVICEINFO», «name» : «My Device Info»,»panel»: «top», «foldername» : «mydeviceinfo» }
    ]
}

Вы можете найти больше информации об этом в документации Vorlon.js .

Откройте командную строку в папке /Server и выполните следующую команду:

1
node server.js

Наконец, запустите клиент, ссылающийся на ваш локальный экземпляр Vorlon.js. Вы можете использовать образец, предоставленный в папке /Plugins/samples .

Просмотрите панель мониторинга, используя http: // localhost: 1337 / dashboard / default .

И … рок-н-ролл!

Тестовая страница Vorlonjs

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

Легко, не правда ли?

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

  • тот, который собирает данные о клиенте
  • тот, который отображает его на приборной панели

Vorlon.js — это не только наш проект, но и ваш. Я уверен, что у вас будет много идей для плагинов, и мы будем рады интегрировать их в проект.

Не стесняйтесь, раскошелитесь на https://github.com/MicrosoftDX/Vorlonjs и отправьте нам запросы на получение ваших творений!

Вы можете найти полный образец на GitHub .

Если у вас есть какие-либо вопросы по поводу этой статьи или Vorlon.js, не стесняйтесь связаться со мной в Twitter .  

У Microsoft есть много бесплатного обучения по многим темам JavaScript с открытым исходным кодом, и мы стремимся создать намного больше с Microsoft Edge . Вот некоторые, чтобы проверить:

И некоторые бесплатные инструменты для начала работы: код Visual Studio , пробная версия Azure и средства межбраузерного тестирования — все это доступно для Mac, Linux или Windows.

Эта статья является частью серии технологий веб-разработки от Microsoft. Мы рады поделиться с вами Microsoft Edge и новым механизмом рендеринга EdgeHTML . Получите бесплатные виртуальные машины или проведите удаленное тестирование на устройстве Mac, iOS, Android или Windows @ http://dev.modern.ie/ .