Розробка десктоп-застосунку на NW.js

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка десктоп-застосунку на NW.js
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка десктоп-приложення на NW.js

NW.js (раніше node-webkit) — фреймворк для десктоп-приложень, який об'єднує Node.js та Chromium в одному процесі. На відміну від Electron, де main та renderer розділені, в NW.js Node.js API доступно прямо у DOM-контексті сторінки. Це спрощує деякі сценарії, але створює інші проблеми з безпекою.

Ключова відмінність від Electron

У Electron: renderer → IPC → main → Node.js API. У NW.js: renderer напрямку викликає require('fs'), require('path') тощо.

// У NW.js це працює прямо в браузерному коді
const fs = require('fs');
const os = require('os');

document.getElementById('hostname').textContent = os.hostname();
fs.readFile('/etc/hosts', 'utf8', (err, data) => {
  document.getElementById('hosts').textContent = data;
});

Для невеликих утилітарних приложень це дійсно зручніше. Для складних приложень — складніше міркувати про безпеку.

Створення проекта

npm init -y
npm install nw --save-dev  # або nw-builder для production-сборок
{
  "name": "my-nw-app",
  "main": "index.html",
  "window": {
    "title": "My Application",
    "width": 1200,
    "height": 800,
    "min_width": 800,
    "min_height": 600,
    "icon": "icons/icon.png",
    "frame": true,
    "resizable": true
  },
  "nodejs": true,
  "node-remote": "",
  "chromium-args": "--enable-features=WebRTC-H264WithOpenH264FFmpeg"
}

Поле main у package.json — точка входу, тут це HTML-файл, а не JS.

Структура проекта

my-app/
├── package.json     # конфігурація NW.js
├── index.html       # головне вікно
├── js/
│   ├── app.js       # логіка приложения
│   └── native.js    # Node.js інтеграція
├── css/
│   └── style.css
└── icons/
    └── icon.png

Приклад: файловий менеджер

<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>File Browser</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div id="toolbar">
    <button id="btn-open">Відкрити папку</button>
    <span id="current-path"></span>
  </div>
  <div id="file-list"></div>
  <script src="js/app.js"></script>
</body>
</html>
// js/app.js — Node.js API прямо в renderer
const fs = require('fs');
const path = require('path');
const { dialog } = nw;

let currentPath = require('os').homedir();

function renderFiles(dirPath) {
  document.getElementById('current-path').textContent = dirPath;
  const list = document.getElementById('file-list');
  list.innerHTML = '';

  try {
    const entries = fs.readdirSync(dirPath, { withFileTypes: true });
    entries.forEach(entry => {
      const item = document.createElement('div');
      item.className = `file-item ${entry.isDirectory() ? 'dir' : 'file'}`;
      item.textContent = entry.name;
      list.appendChild(item);
    });
  } catch (err) {
    list.innerHTML = `<div class="error">${err.message}</div>`;
  }
}

document.getElementById('btn-open').addEventListener('click', () => {
  const input = document.createElement('input');
  input.type = 'file';
  input.setAttribute('nwdirectory', ''); // NW.js розширення для вибору папки
  input.addEventListener('change', () => {
    currentPath = input.value;
    renderFiles(currentPath);
  });
  input.click();
});

renderFiles(currentPath);

Сборка дистрибутива

npm install nw-builder --save-dev
// build.js
const NwBuilder = require('nw-builder');

const nw = new NwBuilder({
  files: ['./src/**/**', './package.json'],
  version: '0.89.0',
  platforms: ['win64', 'osx64', 'linux64'],
  buildDir: './release',
  macIcns: './icons/icon.icns',
  winIco: './icons/icon.ico'
});

nw.build().then(() => {
  console.log('Build complete');
}).catch(console.error);

Версії NW.js: Normal vs SDK

NW.js доступний у двох версіях:

  • Normal — для production, без DevTools за замовчуванням, менший розмір
  • SDK — з DevTools, для розробки та відлагодження

Коли NW.js має смисл

Розглядайте NW.js для: портування існуючого веб-приложення без переробки архітектури, швидких внутрішніх інструментів де security model менш критична, проектів де команда раніше працювала з node-webkit.

Для нових production-приложень Electron або Tauri мають більш активне сообщество, кращу документацію та більш передбачувану модель безпеки.