Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cross Platform Apps with Cordova, Electron and Angular

Cross Platform Apps with Cordova, Electron and Angular

Angular is a very powerful and popular platform for writing modern applications with Typescript for the web. However, with most Angular applications comes the point where you want to make the application available not only on the web but also on other platforms such as mobile systems and the desktop. A new implementation for each system can be very complex. In this talk Fabian Gosebrink shows how to develop an angular application in a way that it can be ported to mobile systems with Cordova and to the desktop with Electron. The native functions of the platforms are also addressed so that in the end a code base for all platforms can be used.

Fabian Gosebrink

September 24, 2020
Tweet

More Decks by Fabian Gosebrink

Other Decks in Technology

Transcript

  1. Cr -Platfor -App
    Electro , Cordov
    & Angular
    wit

    View Slide

  2. Cr Platfor

    View Slide

  3. Ma

    View Slide

  4. Ma
    Window

    View Slide

  5. Ma
    Window
    Lin

    View Slide

  6. Mobil

    View Slide

  7. Mobil
    Desktop

    View Slide

  8. Mobil
    Desktop
    Web

    View Slide

  9. s
    muc
    mor ...

    View Slide

  10. Jav scrip

    View Slide

  11. T scrip

    View Slide

  12. View Slide

  13. View Slide

  14. Server
    Clien

    View Slide

  15. Server
    Clien

    View Slide

  16. Server
    Clien
    HTTP WS

    View Slide

  17. View Slide

  18. Cordov

    View Slide

  19. Apache Cordova is an open-
    source mobile development
    framework. It allows you to use
    standard web technologies -
    HTML5, CSS3, and JavaScript for
    cross-platform development.
    "
    "

    View Slide

  20. View Slide

  21. $ npm install cordova -

    View Slide

  22. $ cordova create myFirstAp

    View Slide

  23. ├── www
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── .gitignore
    ├── config.xml
    └── package.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    View Slide

  24. ├── www
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── .gitignore
    ├── config.xml
    └── package.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ├── www
    1
    │ ├── css
    2
    │ │ └── index.cs
    3
    │ ├── img
    4
    │ │ └── logo.png
    5
    │ ├── js
    6
    │ │ └── index.js
    7
    │ └── index.html
    8
    ├── .gitignore
    9
    ├── config.xml
    10
    └── package.json
    11

    View Slide

  25. ├── www
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── .gitignore
    ├── config.xml
    └── package.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ├── www
    1
    │ ├── css
    2
    │ │ └── index.cs
    3
    │ ├── img
    4
    │ │ └── logo.png
    5
    │ ├── js
    6
    │ │ └── index.js
    7
    │ └── index.html
    8
    ├── .gitignore
    9
    ├── config.xml
    10
    └── package.json
    11
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── www
    1
    2
    3
    4
    5
    6
    7
    8
    ├── .gitignore
    9
    ├── config.xml
    10
    └── package.json
    11

    View Slide

  26. ├── www
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── .gitignore
    ├── config.xml
    └── package.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ├── www
    1
    │ ├── css
    2
    │ │ └── index.cs
    3
    │ ├── img
    4
    │ │ └── logo.png
    5
    │ ├── js
    6
    │ │ └── index.js
    7
    │ └── index.html
    8
    ├── .gitignore
    9
    ├── config.xml
    10
    └── package.json
    11
    │ ├── css
    │ │ └── index.cs
    │ ├── img
    │ │ └── logo.png
    │ ├── js
    │ │ └── index.js
    │ └── index.html
    ├── www
    1
    2
    3
    4
    5
    6
    7
    8
    ├── .gitignore
    9
    ├── config.xml
    10
    └── package.json
    11
    ├── config.xml
    ├── www
    1
    │ ├── css
    2
    │ │ └── index.cs
    3
    │ ├── img
    4
    │ │ └── logo.png
    5
    │ ├── js
    6
    │ │ └── index.js
    7
    │ └── index.html
    8
    ├── .gitignore
    9
    10
    └── package.json
    11

    View Slide



  27. Gatherr
    Gatherr - Demo Application

    Offering Solutions Software























    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36

    View Slide

  28. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29

    View Slide

  29. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29

    View Slide

  30. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29

    View Slide

  31. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29



    g p g
    Offering Solutions Software
    6

    7

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18
    19
    20
    21
    22

    23
    24

    25
    26

    27

    28

    29

    30

    31

    32
    33

    34

    View Slide

  32. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29




    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18
    19
    20
    21
    22

    23
    24

    25
    26

    27

    28

    29


    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22
    23
    24

    25
    26

    27

    28

    29

    30

    31

    32
    33

    34

    35

    36

    View Slide

  33. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29




    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18
    19
    20
    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22
    23
    24

    25
    26

    27

    28

    29


    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24
    25
    26

    27

    28

    29

    30

    31

    32
    33

    34

    35

    36

    View Slide

  34. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29




    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18
    19
    20
    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22
    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24
    25
    26

    27

    28

    29







    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26
    27
    28
    29
    30
    31
    32
    33

    34

    35

    36

    View Slide

  35. Gatherr
    Gatherr - Demo Application


    1

    2
    3
    4
    5
    6
    7
    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9
    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29







    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11
    12
    13
    14
    15
    16
    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29




    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18
    19
    20
    21
    22

    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22
    23
    24

    25
    26

    27

    28

    29


    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24
    25
    26

    27

    28

    29




    1

    2
    Gatherr
    3
    Gatherr - Demo Application
    4

    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26
    27
    28
    29



    8
    9

    10
    11

    12

    13

    14

    15

    16

    17
    18

    19

    20

    21
    22

    23
    24

    25
    26

    27

    28

    29

    30

    31

    32
    33
    34
    35

    36

    View Slide

  36. $ cordova plugin add cordova-plugin-came

    View Slide

  37. cordova platform add androi
    cordova platform add ios
    cordova build
    1
    2
    3
    4

    View Slide

  38. cordova platform add androi
    cordova platform add ios
    cordova build
    1
    2
    3
    4
    cordova platform add androi
    1
    cordova platform add ios
    2
    3
    cordova build
    4

    View Slide

  39. cordova platform add androi
    cordova platform add ios
    cordova build
    1
    2
    3
    4
    cordova platform add androi
    1
    cordova platform add ios
    2
    3
    cordova build
    4
    cordova platform add ios
    cordova platform add androi
    1
    2
    3
    cordova build
    4

    View Slide

  40. cordova platform add androi
    cordova platform add ios
    cordova build
    1
    2
    3
    4
    cordova platform add androi
    1
    cordova platform add ios
    2
    3
    cordova build
    4
    cordova platform add ios
    cordova platform add androi
    1
    2
    3
    cordova build
    4 cordova build
    cordova platform add androi
    1
    cordova platform add ios
    2
    3
    4

    View Slide

  41. View Slide

  42. View Slide

  43. View Slide

  44. View Slide

  45. View Slide

  46. Dem

    View Slide

  47. Electro

    View Slide

  48. Electron is a tool for building Cross-
    Platform Desktop Apps with
    Javascript, Html and CSS
    "
    "

    View Slide

  49. View Slide

  50. View Slide

  51. Chromiu

    View Slide

  52. View Slide

  53. View Slide

  54. an man mor ...

    View Slide

  55. $ npm install electron -

    View Slide

  56. ├── index.html
    ├── index.js
    └── package.json

    View Slide

  57. {
    "name": "your-app",
    "version": "0.1.0",
    "main": "index.js",
    "scripts": {
    "start": "electron ."
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8

    View Slide

  58. {
    "name": "your-app",
    "version": "0.1.0",
    "main": "index.js",
    "scripts": {
    "start": "electron ."
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    "main": "index.js",
    {
    1
    "name": "your-app",
    2
    "version": "0.1.0",
    3
    4
    "scripts": {
    5
    "start": "electron ."
    6
    }
    7
    }
    8

    View Slide

  59. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    View Slide

  60. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17

    View Slide

  61. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    const { app, BrowserWindow } = require('electron'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    app.whenReady().then(createWindow);
    17

    View Slide

  62. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    const { app, BrowserWindow } = require('electron'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    app.whenReady().then(createWindow);
    17
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17

    View Slide

  63. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    const { app, BrowserWindow } = require('electron'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    app.whenReady().then(createWindow);
    17
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    win.loadFile('index.html');
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17

    View Slide

  64. const { app, BrowserWindow } = require('electron'
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    app.whenReady().then(createWindow);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    createWindow = () => {
    // Create the browser window.
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    // and load the index.html of the app.
    win.loadFile('index.html');
    };
    const { app, BrowserWindow } = require('electron'
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    app.whenReady().then(createWindow);
    17
    const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
    nodeIntegration: true,
    },
    });
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17
    win.loadFile('index.html');
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    14
    };
    15
    16
    app.whenReady().then(createWindow);
    17 app.whenReady().then(createWindow);
    const { app, BrowserWindow } = require('electron'
    1
    2
    createWindow = () => {
    3
    // Create the browser window.
    4
    const win = new BrowserWindow({
    5
    width: 800,
    6
    height: 600,
    7
    webPreferences: {
    8
    nodeIntegration: true,
    9
    },
    10
    });
    11
    12
    // and load the index.html of the app.
    13
    win.loadFile('index.html');
    14
    };
    15
    16
    17

    View Slide





  65. Hello World!


    Hello World!


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    View Slide

  66. $ electron .

    View Slide

  67. View Slide

  68. View Slide

  69. Process
    Mai

    View Slide

  70. Process
    Renderer

    View Slide

  71. View Slide

  72. View Slide

  73. View Slide

  74. ├── assets
    │ ...
    ├── 6.2c6c97b8608a85a82adc.js
    ├── common.42c8477e0640407ae045.js
    ├── favicon.ico
    ├── icon.ico
    ├── index.html
    ├── index.js
    ├── main.8bb24261aa275d6a43db.js
    ├── package.json
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    ├── polyfills.ef4ae634e106e395892c.js
    ├── runtime.061b6e0597d9fe17b937.js
    ├── scripts.82aad45f2fad02beee3c.js
    ├── styles.f503a9ab21b5d570c8af.css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    View Slide

  75. ├── assets
    │ ...
    ├── 6.2c6c97b8608a85a82adc.js
    ├── common.42c8477e0640407ae045.js
    ├── favicon.ico
    ├── icon.ico
    ├── index.html
    ├── index.js
    ├── main.8bb24261aa275d6a43db.js
    ├── package.json
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    ├── polyfills.ef4ae634e106e395892c.js
    ├── runtime.061b6e0597d9fe17b937.js
    ├── scripts.82aad45f2fad02beee3c.js
    ├── styles.f503a9ab21b5d570c8af.css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ├── assets
    │ ...
    ├── 6.2c6c97b8608a85a82adc.js
    ├── common.42c8477e0640407ae045.js
    ├── favicon.ico
    ├── index.html
    ├── main.8bb24261aa275d6a43db.js
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    ├── polyfills.ef4ae634e106e395892c.js
    ├── runtime.061b6e0597d9fe17b937.js
    ├── scripts.82aad45f2fad02beee3c.js
    ├── styles.f503a9ab21b5d570c8af.css
    1
    2
    3
    4
    5
    ├── icon.ico
    6
    7
    ├── index.js
    8
    9
    ├── package.json
    10
    11
    12
    13
    14
    15

    View Slide

  76. ├── assets
    │ ...
    ├── 6.2c6c97b8608a85a82adc.js
    ├── common.42c8477e0640407ae045.js
    ├── favicon.ico
    ├── icon.ico
    ├── index.html
    ├── index.js
    ├── main.8bb24261aa275d6a43db.js
    ├── package.json
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    ├── polyfills.ef4ae634e106e395892c.js
    ├── runtime.061b6e0597d9fe17b937.js
    ├── scripts.82aad45f2fad02beee3c.js
    ├── styles.f503a9ab21b5d570c8af.css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ├── assets
    │ ...
    ├── 6.2c6c97b8608a85a82adc.js
    ├── common.42c8477e0640407ae045.js
    ├── favicon.ico
    ├── index.html
    ├── main.8bb24261aa275d6a43db.js
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    ├── polyfills.ef4ae634e106e395892c.js
    ├── runtime.061b6e0597d9fe17b937.js
    ├── scripts.82aad45f2fad02beee3c.js
    ├── styles.f503a9ab21b5d570c8af.css
    1
    2
    3
    4
    5
    ├── icon.ico
    6
    7
    ├── index.js
    8
    9
    ├── package.json
    10
    11
    12
    13
    14
    15
    ├── icon.ico
    ├── index.js
    ├── package.json
    ├── assets
    1
    │ ...
    2
    ├── 6.2c6c97b8608a85a82adc.js
    3
    ├── common.42c8477e0640407ae045.js
    4
    ├── favicon.ico
    5
    6
    ├── index.html
    7
    8
    ├── main.8bb24261aa275d6a43db.js
    9
    10
    ├── polyfills-es5.739d51467cc1d8efbfae.js
    11
    ├── polyfills.ef4ae634e106e395892c.js
    12
    ├── runtime.061b6e0597d9fe17b937.js
    13
    ├── scripts.82aad45f2fad02beee3c.js
    14
    ├── styles.f503a9ab21b5d570c8af.css
    15

    View Slide

  77. View Slide

  78. Communicatio

    View Slide

  79. Communicatio
    IPC

    View Slide

  80. mai proces
    const { ipcMain } = require('electron')
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    ipcMain.on('synchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
    })
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    View Slide

  81. mai proces
    const { ipcMain } = require('electron')
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    ipcMain.on('synchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
    })
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const { ipcMain } = require('electron')
    1
    2
    ipcMain.on('asynchronous-message', (event, arg) =>
    3
    console.log(arg) // prints "ping"
    4
    event.reply('asynchronous-reply', 'pong')
    5
    })
    6
    7
    ipcMain.on('synchronous-message', (event, arg) =>
    8
    console.log(arg) // prints "ping"
    9
    event.returnValue = 'pong'
    10
    })
    11

    View Slide

  82. mai proces
    const { ipcMain } = require('electron')
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    ipcMain.on('synchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
    })
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const { ipcMain } = require('electron')
    1
    2
    ipcMain.on('asynchronous-message', (event, arg) =>
    3
    console.log(arg) // prints "ping"
    4
    event.reply('asynchronous-reply', 'pong')
    5
    })
    6
    7
    ipcMain.on('synchronous-message', (event, arg) =>
    8
    console.log(arg) // prints "ping"
    9
    event.returnValue = 'pong'
    10
    })
    11
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    const { ipcMain } = require('electron')
    1
    2
    3
    4
    5
    6
    7
    ipcMain.on('synchronous-message', (event, arg) =>
    8
    console.log(arg) // prints "ping"
    9
    event.returnValue = 'pong'
    10
    })
    11

    View Slide

  83. mai proces
    const { ipcMain } = require('electron')
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    ipcMain.on('synchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
    })
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const { ipcMain } = require('electron')
    1
    2
    ipcMain.on('asynchronous-message', (event, arg) =>
    3
    console.log(arg) // prints "ping"
    4
    event.reply('asynchronous-reply', 'pong')
    5
    })
    6
    7
    ipcMain.on('synchronous-message', (event, arg) =>
    8
    console.log(arg) // prints "ping"
    9
    event.returnValue = 'pong'
    10
    })
    11
    ipcMain.on('asynchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.reply('asynchronous-reply', 'pong')
    })
    const { ipcMain } = require('electron')
    1
    2
    3
    4
    5
    6
    7
    ipcMain.on('synchronous-message', (event, arg) =>
    8
    console.log(arg) // prints "ping"
    9
    event.returnValue = 'pong'
    10
    })
    11
    ipcMain.on('synchronous-message', (event, arg) =>
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
    })
    const { ipcMain } = require('electron')
    1
    2
    ipcMain.on('asynchronous-message', (event, arg) =>
    3
    console.log(arg) // prints "ping"
    4
    event.reply('asynchronous-reply', 'pong')
    5
    })
    6
    7
    8
    9
    10
    11

    View Slide

  84. renderer proces
    const { ipcRenderer } = require('electron');
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
    })
    ipcRenderer.send('asynchronous-message', 'ping')
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    View Slide

  85. renderer proces
    const { ipcRenderer } = require('electron');
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
    })
    ipcRenderer.send('asynchronous-message', 'ping')
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const { ipcRenderer } = require('electron');
    1
    2
    // prints "pong"
    3
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    4
    5
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    6
    console.log(arg) // prints "pong"
    7
    })
    8
    9
    ipcRenderer.send('asynchronous-message', 'ping')
    10

    View Slide

  86. renderer proces
    const { ipcRenderer } = require('electron');
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
    })
    ipcRenderer.send('asynchronous-message', 'ping')
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const { ipcRenderer } = require('electron');
    1
    2
    // prints "pong"
    3
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    4
    5
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    6
    console.log(arg) // prints "pong"
    7
    })
    8
    9
    ipcRenderer.send('asynchronous-message', 'ping')
    10
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    const { ipcRenderer } = require('electron');
    1
    2
    3
    4
    5
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    6
    console.log(arg) // prints "pong"
    7
    })
    8
    9
    ipcRenderer.send('asynchronous-message', 'ping')
    10

    View Slide

  87. renderer proces
    const { ipcRenderer } = require('electron');
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
    })
    ipcRenderer.send('asynchronous-message', 'ping')
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const { ipcRenderer } = require('electron');
    1
    2
    // prints "pong"
    3
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    4
    5
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    6
    console.log(arg) // prints "pong"
    7
    })
    8
    9
    ipcRenderer.send('asynchronous-message', 'ping')
    10
    // prints "pong"
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    const { ipcRenderer } = require('electron');
    1
    2
    3
    4
    5
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    6
    console.log(arg) // prints "pong"
    7
    })
    8
    9
    ipcRenderer.send('asynchronous-message', 'ping')
    10
    ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
    })
    ipcRenderer.send('asynchronous-message', 'ping')
    const { ipcRenderer } = require('electron');
    1
    2
    // prints "pong"
    3
    console.log(ipcRenderer.sendSync('synchronous-message', 'ping'
    4
    5
    6
    7
    8
    9
    10

    View Slide

  88. mai proces
    var os = require('os')
    var cpus = os.cpus();
    1
    2
    3

    View Slide

  89. mai proces
    var os = require('os')
    var cpus = os.cpus();
    1
    2
    3
    var os = require('os')
    1
    2
    var cpus = os.cpus();
    3

    View Slide

  90. mai proces
    var os = require('os')
    var cpus = os.cpus();
    1
    2
    3
    var os = require('os')
    1
    2
    var cpus = os.cpus();
    3 var cpus = os.cpus();
    var os = require('os')
    1
    2
    3

    View Slide

  91. mai proces
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    View Slide

  92. mai proces
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    View Slide

  93. mai proces
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cpuValues.getCPUUsage(percentage => {
    });
    let startSendCpuValues = () => {
    1
    setInterval(() => {
    2
    3
    if (mainWindow) {
    4
    mainWindow.webContents.send(
    5
    'newCpuValue',
    6
    (percentage * 100).toFixed(2)
    7
    );
    8
    }
    9
    10
    }, 1000);
    11
    };
    12

    View Slide

  94. mai proces
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let startSendCpuValues = () => {
    setInterval(() => {
    cpuValues.getCPUUsage(percentage => {
    if (mainWindow) {
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    }
    });
    }, 1000);
    };
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cpuValues.getCPUUsage(percentage => {
    });
    let startSendCpuValues = () => {
    1
    setInterval(() => {
    2
    3
    if (mainWindow) {
    4
    mainWindow.webContents.send(
    5
    'newCpuValue',
    6
    (percentage * 100).toFixed(2)
    7
    );
    8
    }
    9
    10
    }, 1000);
    11
    };
    12
    mainWindow.webContents.send(
    'newCpuValue',
    (percentage * 100).toFixed(2)
    );
    let startSendCpuValues = () => {
    1
    setInterval(() => {
    2
    cpuValues.getCPUUsage(percentage => {
    3
    if (mainWindow) {
    4
    5
    6
    7
    8
    }
    9
    });
    10
    }, 1000);
    11
    };
    12

    View Slide

  95. renderer proces
    @Injectable({ providedIn: 'root' })
    export class CpuValueService {
    private onNewCpuValue = new Subject();
    get newCpuValue(){
    return this.onNewCpuValue.asObservable();
    }
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    View Slide

  96. renderer proces
    @Injectable({ providedIn: 'root' })
    export class CpuValueService {
    private onNewCpuValue = new Subject();
    get newCpuValue(){
    return this.onNewCpuValue.asObservable();
    }
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    @Injectable({ providedIn: root })
    1
    export class CpuValueService {
    2
    private onNewCpuValue = new Subject();
    3
    4
    get newCpuValue(){
    5
    return this.onNewCpuValue.asObservable();
    6
    }
    7
    8
    9
    10
    11
    12
    13
    14
    private registerCpuEvent() {
    15
    if (this.electronService.ipcRenderer) {
    16
    this.electronService.ipcRenderer.on(
    17
    'newCpuValue',
    18
    (event: any, data: any) => {
    19
    this.onNewCpuValue.next(data);
    20
    }
    21

    View Slide

  97. renderer proces
    @Injectable({ providedIn: 'root' })
    export class CpuValueService {
    private onNewCpuValue = new Subject();
    get newCpuValue(){
    return this.onNewCpuValue.asObservable();
    }
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    @Injectable({ providedIn: 'root' })
    1
    export class CpuValueService {
    2
    private onNewCpuValue = new Subject();
    3
    4
    get newCpuValue(){
    5
    return this.onNewCpuValue.asObservable();
    6
    }
    7
    8
    9
    10
    11
    12
    13
    14
    private registerCpuEvent() {
    15
    if (this.electronService.ipcRenderer) {
    16
    this.electronService.ipcRenderer.on(
    17
    'newCpuValue',
    18
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    (event: any, data: any) => {
    this.onNewCpuValue.next(data);
    }
    );
    }
    }
    }
    7
    8
    constructor(private electronService: ElectronService) {
    9
    if (environment.desktop) {
    10
    this.registerCpuEvent();
    11
    }
    12
    }
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    }
    25

    View Slide

  98. renderer proces
    @Injectable({ providedIn: 'root' })
    export class CpuValueService {
    private onNewCpuValue = new Subject();
    get newCpuValue(){
    return this.onNewCpuValue.asObservable();
    }
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    constructor(private electronService: ElectronService) {
    if (environment.desktop) {
    this.registerCpuEvent();
    }
    }
    @Injectable({ providedIn: 'root' })
    1
    export class CpuValueService {
    2
    private onNewCpuValue = new Subject();
    3
    4
    get newCpuValue(){
    5
    return this.onNewCpuValue.asObservable();
    6
    }
    7
    8
    9
    10
    11
    12
    13
    14
    private registerCpuEvent() {
    15
    if (this.electronService.ipcRenderer) {
    16
    this.electronService.ipcRenderer.on(
    17
    'newCpuValue',
    18
    private registerCpuEvent() {
    if (this.electronService.ipcRenderer) {
    this.electronService.ipcRenderer.on(
    'newCpuValue',
    @Injectable({ providedIn: 'root' })
    1
    export class CpuValueService {
    2
    private onNewCpuValue = new Subject();
    3
    4
    get newCpuValue(){
    5
    return this.onNewCpuValue.asObservable();
    6
    }
    7
    8
    constructor(private electronService: ElectronService) {
    9
    if (environment.desktop) {
    10
    this.registerCpuEvent();
    11
    }
    12
    }
    13
    14
    15
    16
    17
    18
    private onNewCpuValue = new Subject();
    get newCpuValue(){
    return this.onNewCpuValue.asObservable();
    }
    @Injectable({ providedIn: 'root' })
    1
    export class CpuValueService {
    2
    3
    4
    5
    6
    7
    8
    constructor(private electronService: ElectronService) {
    9
    if (environment.desktop) {
    10
    this.registerCpuEvent();
    11
    }
    12
    }
    13
    14
    private registerCpuEvent() {
    15
    if (this.electronService.ipcRenderer) {
    16
    this.electronService.ipcRenderer.on(
    17
    'newCpuValue',
    18

    View Slide

  99. $ npm install electron-packager

    View Slide

  100. $ electron-packager .temp/deskto

    View Slide

  101. $ electron-packager .temp/desktop --platform=linux, wi

    View Slide

  102. Automatic Updates
    Crash Reports
    Content Tracing
    Installation Packages

    View Slide

  103. View Slide

  104. Dem

    View Slide

  105. What about variation points?
    "
    "

    View Slide

  106. View Slide

  107. Dependenc Injectio

    View Slide

  108. @Injectable({
    providedIn: 'root',
    })
    export abstract class AbstractCameraService {
    abstract getPhoto(...): Observable;
    }
    1
    2
    3
    4
    5
    6

    View Slide

  109. @Injectable({
    providedIn: 'root',
    useFactory: cameraFactory,
    deps: [PlatformInformationService],
    })
    export abstract class AbstractCameraService {
    abstract getPhoto(...): Observable;
    }
    1
    2
    3
    4
    5
    6
    7
    8

    View Slide

  110. export function cameraFactory(
    platformInformationService: PlatformInformationService
    ): AbstractCameraService {
    return platformInformationService.isMobile
    ? new MobileCameraService()
    : new DesktopCameraService();
    }
    @Injectable({
    providedIn: 'root',
    useFactory: cameraFactory,
    deps: [PlatformInformationService],
    })
    export abstract class AbstractCameraService {
    abstract getPhoto(...): Observable;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    View Slide

  111. import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    @Component({ ... })
    export class ProfileDetailsComponent {
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    pictureClicked() {
    this.cameraService.getPhoto()
    .subscribe((result: Photo) => {
    // ...
    });
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    View Slide

  112. import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    @Component({ ... })
    export class ProfileDetailsComponent {
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    pictureClicked() {
    this.cameraService.getPhoto()
    .subscribe((result: Photo) => {
    // ...
    });
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    1
    2
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    constructor(
    8
    private cameraService: AbstractCameraService
    9
    ) {}
    10
    11
    pictureClicked() {
    12
    this.cameraService.getPhoto()
    13
    .subscribe((result: Photo) => {
    14
    // ...
    15
    });
    16
    }
    17
    }
    18

    View Slide

  113. import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    @Component({ ... })
    export class ProfileDetailsComponent {
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    pictureClicked() {
    this.cameraService.getPhoto()
    .subscribe((result: Photo) => {
    // ...
    });
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    1
    2
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    constructor(
    8
    private cameraService: AbstractCameraService
    9
    ) {}
    10
    11
    pictureClicked() {
    12
    this.cameraService.getPhoto()
    13
    .subscribe((result: Photo) => {
    14
    // ...
    15
    });
    16
    }
    17
    }
    18
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    import {
    1
    AbstractCameraService, Photo
    2
    } from '@workspace/features/camera';
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    8
    9
    10
    11
    pictureClicked() {
    12
    this.cameraService.getPhoto()
    13
    .subscribe((result: Photo) => {
    14
    // ...
    15
    });
    16
    }
    17
    }
    18

    View Slide

  114. import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    @Component({ ... })
    export class ProfileDetailsComponent {
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    pictureClicked() {
    this.cameraService.getPhoto()
    .subscribe((result: Photo) => {
    // ...
    });
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import {
    AbstractCameraService, Photo
    } from '@workspace/features/camera';
    1
    2
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    constructor(
    8
    private cameraService: AbstractCameraService
    9
    ) {}
    10
    11
    pictureClicked() {
    12
    this.cameraService.getPhoto()
    13
    .subscribe((result: Photo) => {
    14
    // ...
    15
    });
    16
    }
    17
    }
    18
    constructor(
    private cameraService: AbstractCameraService
    ) {}
    import {
    1
    AbstractCameraService, Photo
    2
    } from '@workspace/features/camera';
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    8
    9
    10
    11
    pictureClicked() {
    12
    this.cameraService.getPhoto()
    13
    .subscribe((result: Photo) => {
    14
    // ...
    15
    });
    16
    }
    17
    }
    18
    pictureClicked() {
    this.cameraService.getPhoto()
    .subscribe((result: Photo) => {
    // ...
    });
    }
    import {
    1
    AbstractCameraService, Photo
    2
    } from '@workspace/features/camera';
    3
    4
    @Component({ ... })
    5
    export class ProfileDetailsComponent {
    6
    7
    constructor(
    8
    private cameraService: AbstractCameraService
    9
    ) {}
    10
    11
    12
    13
    14
    15
    16
    17
    }
    18

    View Slide

  115. View Slide

  116. Securit

    View Slide

  117. Mobil
    Desktop
    Web

    View Slide

  118. OAut 2
    OIDC

    View Slide

  119. https://bit.ly/3mMHyKY

    View Slide

  120. Alternative

    View Slide

  121. View Slide

  122. Progressiv
    Web
    App

    View Slide

  123. View Slide

  124. Progressiv
    Web
    App

    View Slide

  125. Cr -Platfor -App
    Electro , Cordov
    & Angular
    wit

    View Slide

  126. View Slide

  127. an yo !

    View Slide