{"id":682,"date":"2018-01-01T02:46:38","date_gmt":"2018-01-01T00:46:38","guid":{"rendered":"http:\/\/leonidassavvides.com\/blog\/?p=682"},"modified":"2018-01-01T02:46:38","modified_gmt":"2018-01-01T00:46:38","slug":"the-most-basic-example-hello-world-to-convert-an-html5-web-app-to-desktop-binary-app-w10-macos-linux","status":"publish","type":"post","link":"https:\/\/www.leonidassavvides.com\/blog\/2018\/01\/the-most-basic-example-hello-world-to-convert-an-html5-web-app-to-desktop-binary-app-w10-macos-linux\/","title":{"rendered":"The most basic example (&#8220;Hello World!&#8221;) to convert an HTML5 web app to desktop (binary) app [W10, MacOS, Linux]"},"content":{"rendered":"<div style=\"margin-top: 0px; margin-bottom: 0px;\" class=\"sharethis-inline-share-buttons\" ><\/div><h2 style=\"text-align: center;\">The most basic example (&#8220;Hello World!&#8221;) to convert an HTML5 web app to desktop (binary) app [W10, MacOS, Linux]<\/h2>\n<p style=\"text-align: center;\">=================================================<\/p>\n<p>I. In this tutorial I will use in the first part<strong>(Part 1) Electron Framework<\/strong> &#8211; <a href=\"http:\/\/electron.atom.io\">http:\/\/electron.atom.io<\/a><br \/>\nII. And in the second part<strong>(Part 2)\u00a0<\/strong> I will use the <strong>NW.js (Node.js Library)<\/strong> for this &#8211; <a href=\"http:\/\/docs.nwjs.io\/en\/\">http:\/\/docs.nwjs.io\/en\/latest<\/a><\/p>\n<p>Note: Also in the third way<strong>\u00a0<\/strong>is to\u00a0use Cordova to build a Windows 10 desktop app &#8211;\u00a0<a href=\"https:\/\/cordova.apache.org\">https:\/\/cordova.apache.org<\/a> [used also for building iOS &amp; Android Apps &amp; Windows Phone 10 Apps]. this will Not discussed here &#8230;.\u00a0\u00a0<a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/guide\/platforms\/win8\/index.html\">https:\/\/cordova.apache.org\/docs\/en\/latest\/guide\/platforms\/win8\/index.html<\/a>\u00a0.<\/p>\n<p>The result will be almost the same a Desktop compiled Binary App for each platform.<\/p>\n<p>A MAIN DISADVANTAGE is that &#8220;The downside of the Electron approach is that each app comes with a copy of two large software frameworks, Node.js and Chromium. The latter is technically a web browser engine, but as the web platform has expanded, the humble browser has turned into a sprawling software layer large enough to be an operating system of its own.&#8221;\u00a0 &#8230;\u00a0<a href=\"https:\/\/medium.com\/dailyjs\/put-your-electron-app-on-a-diet-with-electrino-c7ffdf1d6297\">https:\/\/medium.com\/dailyjs\/put-your-electron-app-on-a-diet-with-electrino-c7ffdf1d6297<\/a><\/p>\n<p>So a hello world app &#8211; minimal size &#8211; may be 115MB-200MB the same as one big app &#8230; ( source code minimal app be 2KB and source code for big app be 10MB &#8211; but the software frameworks make them the same relatively). Developers already have started to look for solutions as the link just above shows one &#8230; electrino&#8230;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>General Steps<\/h3>\n<p>We proceed\u00a0step by step how to:<br \/>\nConvert &#8220;hello world&#8221;(index.html local web page file), or http:\/\/www.google.com or other remote page, into a desktop binary app, in other words to a chromium independent window (without top bar controls like address bar or back &amp; fwd buttons.<\/p>\n<p>We start by installing Node.js if is Not yet installed in the computer&#8230; follow\u00a0<a href=\"https:\/\/nodejs.org\/en\/download\/\">https:\/\/nodejs.org\/en\/download\/<\/a><\/p>\n<p>Also if you are in Windows 10 install Git Bash CLI [if Not yet installed] by installing Git from <a href=\"https:\/\/git-scm.com\/download\/win\">https:\/\/git-scm.com\/download\/win<\/a><\/p>\n<p>For Linux \/ Mac, as for Git Bash CLI windows you can use the Terminal CLI app.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>(Part 1) Electron Framework<\/strong><\/h3>\n<p>Make a folder structure as <strong>Documents\/desktop-apps\/electron<\/strong> &#8211; open File Explorer and right click <strong>&#8230;\/&#8230;\/electron<\/strong> and choose Git Bash Here and confirm Node.js installed by [npm comes with Node.js]<\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron<\/p>\n<p>$ <strong>node -v<\/strong><\/p>\n<p><strong>v6.10.2<\/strong><\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron<\/p>\n<p>$ <strong>npm -v<\/strong><\/p>\n<p><strong>3.10.10<\/strong><\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron<\/p>\n<p>$<\/p>\n<p>==============================================<\/p>\n<p>Generate a binary App using Electron from Hello World! Web App<\/p>\n<p>Generally, an Electron app is structured like this (at minimum):\u00a0 \/\/ more structure <a href=\"https:\/\/s3.eu-central-1.amazonaws.com\/electronapp\/your-app.rar\">in Source Code<\/a><\/p>\n<pre lang=\"text\"><code><strong>...\/articles\/desktop-apps\/electron\/<span style=\"text-decoration: underline;\">your-app\/<\/span><\/strong>\n\u251c\u2500\u2500 package.json\n\u251c\u2500\u2500 main.js\n\u2514\u2500\u2500 index.html<\/code><\/pre>\n<pre lang=\"text\"><span style=\"text-decoration: underline;\"><strong><code>package.json<\/code><\/strong><\/span><\/pre>\n<pre>{\n \"name\": \"your-app\",\n \"version\": \"0.0.1\",\n \"main\": \"main.js\",\n \"scripts\": {\n \"start\": \"electron .\",\n \"dist\": \"build\"\n },\n \"author\": \"LSE\",\n \"build\": {\n \"appId\": \"com.example.helloworld\"\n },\n \"devDependencies\": {\n \"electron\": \"~1.7.8\",\n \"electron-builder\": \"^17.1.2\"\n }\n}<\/pre>\n<pre lang=\"text\"><span style=\"text-decoration: underline;\"><strong><code>index.html<\/code><\/strong><\/span><\/pre>\n<pre>&lt;!DOCTYPE html&gt;\n&lt;<span class=\"pl-ent\">html<\/span>&gt;\n  &lt;<span class=\"pl-ent\">head<\/span>&gt;\n    &lt;<span class=\"pl-ent\">meta<\/span> <span class=\"pl-e\">charset<\/span>=<span class=\"pl-s\"><span class=\"pl-pds\">\"<\/span>UTF-8<span class=\"pl-pds\">\"<\/span><\/span>&gt;\n    &lt;<span class=\"pl-ent\">title<\/span>&gt;Hello World!&lt;\/<span class=\"pl-ent\">title<\/span>&gt;\n  &lt;\/<span class=\"pl-ent\">head<\/span>&gt;\n  &lt;<span class=\"pl-ent\">body<\/span>&gt;\n    &lt;<span class=\"pl-ent\">h1<\/span>&gt;Hello World!&lt;\/<span class=\"pl-ent\">h1<\/span>&gt;\n    We are using node &lt;<span class=\"pl-ent\">script<\/span>&gt;<span class=\"pl-s1\"><span class=\"pl-c1\">document<\/span>.<span class=\"pl-c1\">write<\/span>(<span class=\"pl-c1\">process<\/span>.<span class=\"pl-smi\">versions<\/span>.<span class=\"pl-smi\">node<\/span>)<\/span><span class=\"pl-s1\">&lt;<\/span>\/<span class=\"pl-ent\">script<\/span>&gt;,\n    Chrome &lt;<span class=\"pl-ent\">script<\/span>&gt;<span class=\"pl-s1\"><span class=\"pl-c1\">document<\/span>.<span class=\"pl-c1\">write<\/span>(<span class=\"pl-c1\">process<\/span>.<span class=\"pl-smi\">versions<\/span>.<span class=\"pl-smi\">chrome<\/span>)<\/span><span class=\"pl-s1\">&lt;<\/span>\/<span class=\"pl-ent\">script<\/span>&gt;,\n    and Electron &lt;<span class=\"pl-ent\">script<\/span>&gt;<span class=\"pl-s1\"><span class=\"pl-c1\">document<\/span>.<span class=\"pl-c1\">write<\/span>(<span class=\"pl-c1\">process<\/span>.<span class=\"pl-smi\">versions<\/span>.<span class=\"pl-smi\">electron<\/span>)<\/span><span class=\"pl-s1\">&lt;<\/span>\/<span class=\"pl-ent\">script<\/span>&gt;. \n &lt;br\/&gt;\n &lt;br\/&gt;\n &lt;br\/&gt;\n &lt;br\/&gt;\n &lt;img src=\"img\/mickey-mouse-icon.png\"&gt;\n  &lt;\/<span class=\"pl-ent\">body<\/span>&gt;\n&lt;\/<span class=\"pl-ent\">html<\/span>&gt;<\/pre>\n<pre>\u00a0\n\n<span style=\"text-decoration: underline;\"><strong>main.js<\/strong><\/span><\/pre>\n<pre><span class=\"pl-k\">const<\/span> {<span class=\"pl-c1\">app<\/span>, <span class=\"pl-c1\">BrowserWindow<\/span>} <span class=\"pl-k\">=<\/span> <span class=\"pl-c1\">require<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>electron<span class=\"pl-pds\">'<\/span><\/span>);\n<span class=\"pl-k\">const<\/span> <span class=\"pl-c1\">path<\/span> <span class=\"pl-k\">=<\/span> <span class=\"pl-c1\">require<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>path<span class=\"pl-pds\">'<\/span><\/span>);\n<span class=\"pl-k\">const<\/span> <span class=\"pl-c1\">url<\/span> <span class=\"pl-k\">=<\/span> <span class=\"pl-c1\">require<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>url<span class=\"pl-pds\">'<\/span><\/span>);\n\n<span class=\"pl-c\">\/\/ Keep a global reference of the window object, if you don't, the window will<\/span>\n<span class=\"pl-c\">\/\/ be closed automatically when the JavaScript object is garbage collected.<\/span>\n<span class=\"pl-k\">let<\/span> win;\n\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">createWindow<\/span> () {\n  <span class=\"pl-c\">\/\/ Create the browser window.<\/span>\n  win <span class=\"pl-k\">=<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-en\">BrowserWindow<\/span>({\n                           width<span class=\"pl-k\">:<\/span> 10<span class=\"pl-c1\">00<\/span>, \n                           height<span class=\"pl-k\">:<\/span> 7<span class=\"pl-c1\">00,\n<\/span>                           frame: true,   \/\/ put <strong>false<\/strong> for get a chromium windows completely frame-less\n                           icon: path.join(__dirname, \"img\/favicon.ico\")\n                           });\n\n  <span class=\"pl-c\">\/\/ and load the index.html of the app.<\/span>\n  <span class=\"pl-smi\">win<\/span>.<span class=\"pl-en\">loadURL<\/span>(<span class=\"pl-smi\">url<\/span>.<span class=\"pl-en\">format<\/span>({\n    pathname<span class=\"pl-k\">:<\/span> <span class=\"pl-smi\">path<\/span>.<span class=\"pl-c1\">join<\/span>(<span class=\"pl-c1\">__dirname<\/span>, <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>index.html<span class=\"pl-pds\">'<\/span><\/span>),\n    protocol<span class=\"pl-k\">:<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>file:<span class=\"pl-pds\">'<\/span><\/span>,\n    slashes<span class=\"pl-k\">:<\/span> <span class=\"pl-c1\">true<\/span>\n  }));\n \n \/\/ Or use this and comment above for load url\n \/\/ win.loadURL(\"http:\/\/google.com\");\n  <span class=\"pl-c\">\/\/ Open the DevTools.<\/span>\n  <span class=\"pl-smi\">win<\/span>.<span class=\"pl-smi\">webContents<\/span>.<span class=\"pl-en\">openDevTools<\/span>();\n\n  <span class=\"pl-c\">\/\/ Emitted when the window is closed.<\/span>\n  <span class=\"pl-smi\">win<\/span>.<span class=\"pl-en\">on<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>closed<span class=\"pl-pds\">'<\/span><\/span>, () <span class=\"pl-k\">=&gt;<\/span> {\n    <span class=\"pl-c\">\/\/ Dereference the window object, usually you would store windows<\/span>\n    <span class=\"pl-c\">\/\/ in an array if your app supports multi windows, this is the time<\/span>\n    <span class=\"pl-c\">\/\/ when you should delete the corresponding element.<\/span>\n    win <span class=\"pl-k\">=<\/span> <span class=\"pl-c1\">null;<\/span>\n  });\n}\n\n<span class=\"pl-c\">\/\/ This method will be called when Electron has finished<\/span>\n<span class=\"pl-c\">\/\/ initialization and is ready to create browser windows.<\/span>\n<span class=\"pl-c\">\/\/ Some APIs can only be used after this event occurs.<\/span>\n<span class=\"pl-smi\">app<\/span>.<span class=\"pl-en\">on<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>ready<span class=\"pl-pds\">'<\/span><\/span>, createWindow);\n\n<span class=\"pl-c\">\/\/ Quit when all windows are closed.<\/span>\n<span class=\"pl-smi\">app<\/span>.<span class=\"pl-en\">on<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>window-all-closed<span class=\"pl-pds\">'<\/span><\/span>, () <span class=\"pl-k\">=&gt;<\/span> {\n  <span class=\"pl-c\">\/\/ On macOS it is common for applications and their menu bar<\/span>\n  <span class=\"pl-c\">\/\/ to stay active until the user quits explicitly with Cmd + Q<\/span>\n  <span class=\"pl-k\">if<\/span> (<span class=\"pl-c1\">process<\/span>.<span class=\"pl-c1\">platform<\/span> <span class=\"pl-k\">!==<\/span> <span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>darwin<span class=\"pl-pds\">'<\/span><\/span>) {\n    <span class=\"pl-smi\">app<\/span>.<span class=\"pl-en\">quit<\/span>();\n  }\n});\n\n<span class=\"pl-smi\">app<\/span>.<span class=\"pl-en\">on<\/span>(<span class=\"pl-s\"><span class=\"pl-pds\">'<\/span>activate<span class=\"pl-pds\">'<\/span><\/span>, () <span class=\"pl-k\">=&gt;<\/span> {\n  <span class=\"pl-c\">\/\/ On macOS it's common to re-create a window in the app when the<\/span>\n  <span class=\"pl-c\">\/\/ dock icon is clicked and there are no other windows open.<\/span>\n  <span class=\"pl-k\">if<\/span> (win <span class=\"pl-k\">===<\/span> <span class=\"pl-c1\">null<\/span>) {\n    <span class=\"pl-en\">createWindow<\/span>();\n  }\n});\n\n<span class=\"pl-c\">\/\/ In this file you can include the rest of your app's specific main process<\/span>\n<span class=\"pl-c\">\/\/ code. You can also put them in separate files and require them here.<\/span><\/pre>\n<pre>====\nend of electron code\n\nLSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron\/your-app\n$ <strong>ls<\/strong>\n<strong>index.html main.js package.json<\/strong>\nLSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron\/your-app\n$ <strong>npm install   # type only this and press enter to install dependencies<\/strong>\n&gt; electron@1.7.10 postinstall T:\\articles\\desktop-apps\\electron\\your-app\\node_modules\\electron\n&gt; node install.js\n....\n....\nLSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron\/your-app\n$<strong> npm start   # type only this and press enter to run app - in this stage a desktop app appear in your screen with Hello World!<\/strong>\n&gt; your-app@0.0.1 start T:\\articles\\desktop-apps\\electron\\your-app\n&gt; electron .\n\nClose app by press Ctrl + C in the CLI Terminal or by press \"X\" on the right upper corner of the app.\n\n\n<strong>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron\/your-app<\/strong>\n<strong>$ npm run dist<\/strong>\n&gt; your-app@0.0.1 dist T:\\articles\\desktop-apps\\electron\\your-app\n&gt; build\nWarning: description is missed in the package.json (T:\\articles\\desktop-apps\\electron\\your-app\\package.json)\nNo native production dependencies\nPackaging for win32 x64 using electron 1.7.10 to dist\\win-unpacked\nWarning: Application icon is not set, default Electron icon will be used\nBuilding NSIS installer\n Packaging NSIS installer for arch x64\n<strong>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/electron\/your-app<\/strong>\n<strong>$<\/strong>\n\n\n\/\/ here in this stage we get : \nT:\\articles\\desktop-apps\\electron\\your-app\\dist\\win-unpacked   \/\/ Run-able Windows app\nT:\\articles\\desktop-apps\\electron\\your-app\\dist\\               \/\/ Install-able Windows app\n\n\n<a href=\"https:\/\/www.leonidassavvides.com\/blog1\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-large wp-image-693\" src=\"http:\/\/92.205.59.115\/~leonidassavvides\/blog\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43-1024x722.png\" alt=\"2017-12-31_22-54-43\" width=\"1024\" height=\"722\" srcset=\"https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43-1024x722.png 1024w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43-300x212.png 300w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43-768x541.png 768w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/12\/2017-12-31_22-54-43.png 1485w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n=============================\n<a href=\"https:\/\/s3.eu-central-1.amazonaws.com\/electronapp\/your-app.rar\">source code here Electron\n<\/a><\/pre>\n<p><a href=\"https:\/\/nodejs.org\/api\/os.html\">https:\/\/nodejs.org\/api\/os.html<\/a>\u00a0 \u00a0 \/\/\u00a0 &lt;&lt;&lt;\u00a0 you can find with Node.js the screenshot&#8217;s[the PC running App on system info] info here OS Node.js API &lt;&lt;&lt;<\/p>\n<h3><\/h3>\n<h3>Part 2 &#8211; NW.js Library<\/h3>\n<p>Get binary App using NW.js from web app<\/p>\n<p><strong>Step 1.<\/strong>\u00a0Create\u00a0<code>package.json<\/code>:<\/p>\n<div class=\"codehilite\">\n<pre><span class=\"p\">{\n \"name\": \"helloworld\",\n \"main\": \"index.html\",\n \"version\": \"1.0.1\",\n \"description\": \"\",\n \"scripts\": {\n\n \"start\": \"nw .\",\n \"test\": \"echo 'Error: no test specified' &amp;&amp; exit 1\",\n \"package\": \"nwb nwbuild -v 0.27.3-sdk .\/ -o .\/dist --output-format=ZIP\",\n \"package:run\": \"nwb nwbuild -v 0.27.3-sdk .\/ -o .\/dist -p linux64,win32,osx64 -r -- --enable-transparent-visuals --disable-gpu\"\n\n },\n \"devDependencies\": {\n \"nw\": \"^0.27.3-sdk\",\n \"nwjs-builder\": \"^1.14.0\"\n }\n}\n\n<\/span><\/pre>\n<\/div>\n<p>main.js<\/p>\n<pre><span class=\"c1\">\/\/ initialize your app<\/span>\n<span class=\"c1\">\/\/ and ...<\/span>\n<span class=\"nx\">nw<\/span><span class=\"p\">.<\/span><span class=\"nx\">Window<\/span><span class=\"p\">.<\/span><span class=\"nx\">open<\/span><span class=\"p\">(<\/span><span class=\"s1\">'index.html'<\/span><span class=\"p\">,<\/span> <span class=\"p\">{},<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">win<\/span><span class=\"p\">)<\/span> <span class=\"p\">{});<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Step 2.<\/strong>\u00a0Create\u00a0<code>index.html<\/code>:<\/p>\n<div class=\"codehilite\">\n<pre><span class=\"cp\">&lt;!DOCTYPE html&gt;<\/span>\n<span class=\"p\">&lt;<\/span><span class=\"nt\">html<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">&lt;<\/span><span class=\"nt\">head<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">title<\/span><span class=\"p\">&gt;<\/span>Hello World!<span class=\"p\">&lt;\/<\/span><span class=\"nt\">title<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">&lt;\/<\/span><span class=\"nt\">head<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">&lt;<\/span><span class=\"nt\">body<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>Hello World!<span class=\"p\">&lt;\/<\/span><span class=\"nt\">h1<\/span><span class=\"p\">&gt;<\/span>\n  <span class=\"p\">&lt;\/<\/span><span class=\"nt\">body<\/span><span class=\"p\">&gt;<\/span>\n<span class=\"p\">&lt;\/<\/span><span class=\"nt\">html<\/span><span class=\"p\">&gt;<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>Step 3.<\/strong>\u00a0Run your app<\/p>\n<div class=\"codehilite\"><\/div>\n<div class=\"admonition tip\">LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$\u00a0<strong>npm install<\/strong>\/\/ NOTES &#8211; if you do Not know latest versions in these lines:<\/p>\n<pre><span class=\"p\"> \"devDependencies\": {\n \"nw\": \"^0.27.3-sdk\",\n \"nwjs-builder\": \"^1.14.0\"\n }<\/span><\/pre>\n<p>\/\/ you do Not include them and proceed as follows<\/p>\n<\/div>\n<div class=\"codehilite\">\n<pre>$ <strong>npm view nw dist-tags<\/strong><\/pre>\n<\/div>\n<div class=\"admonition tip\">\n<p>{ latest: &#8216;0.27.3&#8217;,<br \/>\nalphasdk: &#8216;0.13.0-alpha4sdk&#8217;,<br \/>\nalpha5sdk: &#8216;0.13.0-alpha5sdk&#8217;,<br \/>\nalpha6sdk: &#8216;0.13.0-alpha6sdk&#8217;,<br \/>\nalpha7sdk: &#8216;0.13.0-alpha7sdk&#8217;,<br \/>\nsdk: &#8216;<span style=\"color: #ff0000;\"><strong>0.27.3-sdk<\/strong><\/span>&#8216; }<\/p>\n<\/div>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$ <strong>npm install nw@<span style=\"color: #ff0000;\">0.27.3-sdk<\/span> &#8211;save-dev<\/strong><\/p>\n<p>\/\/ Till here you can run app by running:<\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$ <strong>npm start<\/strong><\/p>\n<p>To build app you run\/install the(by default &#8211; latest version):<br \/>\nLSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$ <strong>npm i -D nwjs-builder<\/strong><\/p>\n<p>\/\/ equivalent to: <strong>npm install nwjs-builder &#8211;save-dev<\/strong><\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$ <strong>npm run package<\/strong><\/p>\n<p>&gt; helloworld@1.0.1 package T:\\articles\\desktop-apps\\nwjs\\app-nwjs<br \/>\n&gt; nwb nwbuild -v 0.27.3-sdk .\/ -o .\/dist &#8211;output-format=ZIP<\/p>\n<p>{ version: &#8216;v0.27.3&#8217;,<br \/>\nflavor: &#8216;sdk&#8217;,<br \/>\ntargets: [ [ &#8216;win32&#8217;, &#8216;x64&#8217; ] ],<br \/>\npath: &#8216;.\/&#8217; }<\/p>\n<p>0: Read package.json<br \/>\n1: Prepare build directory at dist\\helloworld-win-x64<br \/>\n2: Copy binary from C:\\Users\\User\\.nwjs-builder\\caches\\binary-nwjs-sdk-v0.27.3-win-x64<br \/>\n3: Edit Windows executable<br \/>\n4: Make working directory<br \/>\n5: Copy included files to C:\\Users\\User\\AppData\\Local\\Temp\\d-11806-6336-7fj1i6.kkjkvgqfr<br \/>\n6: Compress application<br \/>\n7: Combine executable at dist\\helloworld-win-x64\\nw.exe<br \/>\n8: Rename application to helloworld.exe<br \/>\n9: Zip to dist\\helloworld-win-x64.zip<br \/>\n10: Clean up dist\\helloworld-win-x64<\/p>\n<p>LSE@PC7 MINGW64 \/t\/articles\/desktop-apps\/nwjs\/app-nwjs<br \/>\n$ <strong>npm start<\/strong><br \/>\n=============================<br \/>\n<a href=\"https:\/\/s3.eu-central-1.amazonaws.com\/electronapp\/app-nwjs.rar\">source code here NW.js<\/a><\/p>\n<p><a href=\"https:\/\/nodejs.org\/api\/os.html\">https:\/\/nodejs.org\/api\/os.html<\/a>\u00a0 \u00a0 \/\/\u00a0 &lt;&lt;&lt;\u00a0 you can find with Node.js the screenshot&#8217;s info here &lt;&lt;&lt;<\/p>\n<p><a href=\"https:\/\/www.leonidassavvides.com\/blog1\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-large wp-image-705\" src=\"http:\/\/92.205.59.115\/~leonidassavvides\/blog\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38-1024x996.png\" alt=\"2018-01-06_20-57-38\" width=\"1024\" height=\"996\" srcset=\"https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38-1024x996.png 1024w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38-300x292.png 300w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38-768x747.png 768w, https:\/\/www.leonidassavvides.com\/blog\/wp-content\/uploads\/2018\/01\/2018-01-06_20-57-38.png 1245w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><b>Note &#8211; Cordova Hybrid\u00a0Mobile Platform<\/b><\/h3>\n<p>Get binary Desktop\/Mobile App using Cordova from web app<\/p>\n<p><a href=\"https:\/\/cordova.apache.org\/docs\/en\/latest\/guide\/platforms\/win8\/index.html\">https:\/\/cordova.apache.org\/docs\/en\/latest\/guide\/platforms\/win8\/index.html<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Author<br \/>\nLeonidas Savvides<br \/>\nWeb\/Mobile\/Desktop Developer<br \/>\nWww.LeonidasSavvides.com<br \/>\nTwitter @lwdlse<br \/>\nLsepolis123@gmail.com<\/p>\n<p>Leonidas is a Freelance Full Stack Web Developer and Hybrid Mobile\/Desktop App Developer. He likes involved in new trends like ES6\/ES7\/ES8, Electron\/NW.js and Cordova platforms, PHP 7 and Frameworks like jQuery Mobile, Ionic 2, Angular, React or CodeIgniter\/CakePHP etc. He rarely finds free time, and almost always is programming or practicing\/reading\/watching\/learning new technologies, in programming using Web Technologies.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The most basic example (&#8220;Hello World!&#8221;) to convert an HTML5 web app to desktop (binary) app [W10, MacOS, Linux] ================================================= I. In this tutorial I will use in the first part(Part 1) Electron Framework &#8211; http:\/\/electron.atom.io II. And in the second part(Part 2)\u00a0 I will use the NW.js (Node.js Library) for this &#8211; http:\/\/docs.nwjs.io\/en\/latest Note: &hellip; <a href=\"https:\/\/www.leonidassavvides.com\/blog\/2018\/01\/the-most-basic-example-hello-world-to-convert-an-html5-web-app-to-desktop-binary-app-w10-macos-linux\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;The most basic example (&#8220;Hello World!&#8221;) to convert an HTML5 web app to desktop (binary) app [W10, MacOS, Linux]&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[43],"tags":[],"class_list":["post-682","post","type-post","status-publish","format-standard","hentry","category-tech"],"_links":{"self":[{"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/posts\/682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/comments?post=682"}],"version-history":[{"count":0,"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/posts\/682\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/media?parent=682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/categories?post=682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leonidassavvides.com\/blog\/wp-json\/wp\/v2\/tags?post=682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}