Десктопные приложения

на веб-технологиях

by @nedudi @html5by



Почему браузера может быть мало?

Почему браузера может быть мало?

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

Есть какие-то решения …

Есть
достойные
решения!

ссылка на сайт

ссылка на сайт

От node-webkit
к nw.js

@ Roger Wang


2011 - Начало проекта Node-webkit

Node? WebKit?

Основная идея

Десктопные приложения

Почему V8 называется V8?

1902

2015

Единый контекст

    var fs = require('fs');
    fs.watchFile('access.log', function(a){
      document.getElementById('log').innerHTML =
      fs.readFileSync('access.log', {encoding:'utf8'});
    });

Как они это сделали?

Как они это сделали?


  1. Единый event loop
  2. Единый контекст


Здесь можно почитать подрбнее

Начинаем погружение!

nwjs.io

package.json

"name": "dummydemo",
"version": "0.0.1",
"main": "index.html",
"window": {"width": 400,"height": 400},
"dependencies": {
  "moment": "2.10.2",
  "handlebars": "^2.0.0"
}

index.html

<div class="hello">
  Привет, NW.JS!
</div>

… добавим немного CSS и запустим

$ nw app

package.json

    ...
    "window": {
      "toolbar": false
    }
    ...

package.json

    ...
    "window": {
      "toolbar": false,
      "frame": false
    }
    ...

package.json

    ...
    "window": {
      "toolbar": false,
      "frame": false,
      "transparent": true
    }
    ...

package.json

    ...
    "window": {
       "kiosk": true
    }
    ...

package.json

    ...
    "window": {
       "show": false
    }
    ...

Элементы интерфейса ОС

            var gui = require('nw.gui');
            gui.Window.get(); //окно
            gui.Shell(); //оболочка
            gui.Tray // трей
            gui.Menu // менюшки
            gui.Clipboard // буффер обмена
            gui.Shortcut // сочетания клавиш
            // ...и другие элементы

Контекстные меню

var menu = new gui.Menu();
// Добавить пунктов меню или разделителей
menu.append(new gui.MenuItem({label: 'Ничего'}));
menu.append(new gui.MenuItem({type: 'separator'}));
// .. и повесить на них обработчики
menu.append(new gui.MenuItem({
  label: 'Сказать "Привет!"',
  click: function() {alert('Привет!');}
}));

Оконные меню

var menubar = new gui.Menu({ type: 'menubar'});
// Подменю
menubar.append(new gui.MenuItem({ label: 'Главное'}));
menubar.append(new gui.MenuItem({ label: 'О нас',   
  submenu: menu
}));
//Получить текущее окно и подключить к нему верхнее меню
gui.Window.get().menu = menubar;

Трей (менюбар)

var tray = new gui.Tray({ 
  title: 'Привет', 
  icon: 'icon.png' 
});

var menu = new gui.Menu();
// .. наполняем меню пунктами
tray.menu = menu;

Сочетания
клавиш


var shortcut = new gui.Shortcut({
  key : "Ctrl+Shift+A",
  active : function() {...},
  failed : function(msg) {...}
});
// регистрируем сочетание клавиш в системе
gui.App.registerGlobalHotKey(shortcut);

Буффер
обмена

var clipboard = gui.Clipboard.get();
// получить значение
var text = clipboard.get('text');
// установить значение
clipboard.set('Привет', 'text');
// очистить буффер
clipboard.clear();

Хранение
данных

Локальные ресурсы приложения

App.dataPath

где <name>- это поле, заданное в package.json

Базы данных и хранилища

Отладка

$ nw --remote-debugging-port=1234 app

http://localhost:1234

Livereload

Сборка

node-webkit-builder

$ npm i -g node-webkit-builder

$ nwbuild ./

$ nwbuild ./ -p win32,win64,osx32,osx64,linux32,linux64

nw.js vs Electron

Отличия

  1. Точка входа (html vs js)
  2. Разный принцип построения билдов.
  3. Измененный vs оригинальный Хромиум
  4. Контекст

Подробнее с точки зрения разработчиков Electron

Хорошие примеры

… и еще очень много приложений

здесь

Выводы

Почему nw.js и веб-технологии
для десктопных приложений?

Вопросы?

Блог html5.by

Твиттер @html5by и @nedudi

Статья html5.by/blog/nwjs

Слайды html5.by/slides/nwjs

Группа ВК vk.com/html5by

Группа FB facebook.com/html5by

Десктопные приложения

на веб-технологиях

by @nedudi @html5by