SQLite и NW.js — пошаговая инструкция для создания крепкой дружбы

в 11:01, , рубрики: javascript, node.js, sqlite, sqlite3, нативные модули

Привет, Хабр и его обитатели! Захотелось изваять нечто на HTML и JS, чтобы было десктопное и удобное. Что для этого нужно? Правильно. Node.js и NW.js или Electron. Поглядев на слабые попытки холивара NW vs Electron и почитав документацию и того и другого было принято решение для начала пощупать NW.js.

Но вот ведь засада. Выполнение npm i sqlite3 устанавливает только те библиотеки, которые могут исполняться при непосредственном запуске через node. А если попытаться подключить скрипт в html и запустить этот html в NW.js, то ничего у нас не выйдет. Гугл сотоварищи выдает только один рецепт включения sqlite в проект на nw.js, да и тот приходится вытаскивать из кэша. Да и устарел он уже. Посему было потрачено пару дней на изучение проблематики и поиск рабочего решения. Прошу под кат.

Итак. Для начала была собрана машина «из того что было» и установлена Windows 7 x32 с пакетом .NET 4.7.1 (потребуется для Visual C++). Почему 32 бита? Решил начать с малого. Хотя, как оказалось, создание модуля под x64 не требует исполнения на x64 системе.

Затем был поставлен Node.js версии 10.8.0 Хотя на момент окончания экспериментов уже появилась 10.9.0. Но тут я решил послушать знающих людей:

SQLite и NW.js — пошаговая инструкция для создания крепкой дружбы - 1

Поразмышляв, решил, что делаю все-таки для LTS, хотя не совсем понятно, где у них у всех LTS, а где нет. Предположил, что non-LTS — это беты, альфы и ночные сборки.

Хотя, как любой недоучка сделал все наполовину и следующую рекомендацию на выполнил:

Рекомендация из документации для LTS-releases

On Windows, you need to replace the file
<npm-path>node_modulesnode-gypsrcwin_delay_load_hook.cc with the one at github.com/nwjs/nw.js/blob/nw18/tools/win_delay_load_hook.cc before installing modules with node-gyp or npm.

Ну не нашел я этот файл у себя на компе. Наверное, потому что не ставил node-gyp.

Для ноды ставим (крайне необходимо делать из командной строки с правами администратора)

npm i -g nw-gyp

Собственно говоря, замена node-gyp

nw-gyp is a hack on node-gyp to support NW.js specific headers and libraries.

Далее — качаем Visual Studio Community Edition (текущая ссылка легко находится в любимом поисковике) — на момент написания статьи текущая версия 2017. Что для нас немаловажно — она содержит в себе Build Tools 2015 — пока нативные модули в ноде собираются только с этой версией и более свежих не поддерживают. Скачиваем инсталлятор, запускаем и ставим одну галочку в закладке «Отдельные компоненты» — Набор инструментов VC++ 2015.3 v14.00 (v140) для ПК

SQLite и NW.js — пошаговая инструкция для создания крепкой дружбы - 2

Добавившийся Windows 8.1 SDK также необходим, поэтому устанавливаем все три пункта. Установка в данном виде приводит к скачке 2,89 гигабайт всякого нужного.

Едем дальше — качаем змейку. Причем версии 2.7. Устанавливаем, по умолчанию в C:Python27.
А теперь — внимание! Засада.

Инсталлятор по умолчанию считает, что необязательно добавлять в PATH расположение питончика, поэтому устраняем это недоразумение на этапе установки

SQLite и NW.js — пошаговая инструкция для создания крепкой дружбы - 3

Похожая засада преследует многих разработчиков при сборке самых разных модулей для ноды. А все потому, что мелкомягкая корпорация также не считает нужным прописывать пути к своим творениям. Гитхаб просто завален ошибками сборки из-за того, что после установки в PATH не попадают пути к сборочным инструментам. Исправляем и это недоразумение — правим переменную среды, чтобы она позволяла сборке пройти если и не очень гладко, то хотя бы без ошибок. Вот что получилось у меня (разбил на строки для лучшего восприятия)

>echo %PATH%
C:Python27;
C:Python27Scripts;
C:Windowssystem32;
C:Windows;
C:WindowsSystem32Wbem;
C:WindowsSystem32WindowsPowerShellv1.0;
C:Program Filesnodejs;
C:UsersDenAppDataRoamingnpm;
C:Program FilesMicrosoft Visual Studio2017CommunityMSBuild15.0Bin;
C:Program FilesMSBuildMicrosoft.Cppv4.0v140;


Выделенное жирным шрифтом — то, что необходимо добавить вручную. Естественно, убедившись, что эти пути существуют.

Обязательный пункт — перезагрузка.

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

c:
md app
cd app
npm init
npm install sqlite3 --build-from-source --runtime=node-webkit --target_arch=ia32 --target=0.32.1 --msvs_version=2015

для x64 меняем --target_arch=x64.

Ну собственно и всё. Если все сделано правильно, то сборка проходит с некоторым количеством сообщений типа

..srcdatabase.cc(672): warning C4996: 'Nan::MakeCallback': объявлен deprecate [C:appnode_modulessqlite3buildnode_sqlite3.vcxproj]
C:appnode_modulesnannan.h(929): note: см. объявление "Nan::MakeCallback"
c:appnode_modulesnannan_new.h(208): warning C4244: аргумент: преобразование "sqlite3_int64" в "double", возможна потеря данных (компилируется исходный файл ..srcdatabase.cc) [C:appnode_modulessqlite3buildnode_sqlite3.vcxproj]

но в итоге модуль собирается и располагается в
C:/app/node_modules/sqlite3/lib/binding/node-webkit-v0.32.1-win32-ia32node_sqlite3.node

Нюанс сборки — при каждой сборке папка node_modules/sqlite3/lib удаляется сборщиком. Поэтому, если есть необходимость собрать два модуля (для каждой архитектуры) — сохраняйте промежуточный результат.

Спасибо за внимание, напоследок результат эксперимента:

Собранные модули для NW.js 0.32.1 ia32 && x64 на гуглоДиске

Автор: marsdenden

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js