Today I was pushed by some unseen force to check out Electron - the desktop platform that embeds Chrome for everything. Let me tell you - it is amazing! Not only you have just one browser to care about but it automatically runs on all sorts of platforms! Well, I am sold on the idea - how about you? If you're like me then keep reading.
Getting started
First we need a sort of web application. For obvious reasons I am choosing Vue.js (don't even get me started on Angular X or React - I could bitch about them forever). So Vue.js it is. Obviously we need a build system for it. And what better can we get than POI! So let's do a Vue.js app.
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (vue-electron)
version: (1.0.0)
description:
entry point: (index.js) main.js
test command: poi test
git repository:
keywords:
author:
license: (ISC)
About to write to .../vue-electron/package.json:
{
"name": "vue-electron",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "poi test"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
$ npm install --save-dev poi poi-class-component
Since this will be an Electron app we need the electron
package too:
$ npm install --save-dev electron
Now we're all set to create our app. In the src
folder let's create 2 files: index.js
and App.vue
src/index.js
import App from './App.vue'
new App({ el: '#app' })
src/App.vue
<template>
<h1>{{ message }}</h1>
</template>
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
@Component
export default class App extends Vue {
message = "Hello, world!"
}
</script>
<style>
h1 {
background-color: green;
}
</style>
Easy, right? Now here comes the hard part: embedding the application in Electron. I mean, it's not really hard if you know how :). There is a good documentation for both Electron and POI on how do to it but nowhere is there one place that shows the whole solution. So there you have it.
poi.config.js
module.exports = {
entry: './src/index',
webpack(config) {
config.target = 'electron-renderer'
return config
},
homepage: './',
}
main.js
const electron = require('electron')
const isDev = require('electron-is-dev')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
const path = require('path')
const url = require('url')
let mainWindow
function createWindow () {
mainWindow = new BrowserWindow({width: 800, height: 600})
const entryDev = 'http://localhost:4000'
const entryProd = url.format({
pathname: path.join(__dirname, 'dist/index.html'),
protocol: 'file:',
slashes: true
})
mainWindow.loadURL(isDev ? entryDev : entryProd)
if (isDev) mainWindow.webContents.openDevTools()
mainWindow.on('closed', function () {
mainWindow = null
})
}
app.on('ready', createWindow)
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})
Now we need a few things to be able to run it. First there needs to be a way of starting the web application and then the Electron container hosting our app. We'll do that by using the concurrently
module and by adding a start
script to our package.json
. While we're at it let's also install electron-is-dev
package used in the main.js
script:
$ npm install --save-dev concurrently
$ npm install --save electron-is-dev
Since the electron-is-dev
package will be part of our Electron app and will not be bundled with the rest of the app then it needs to be added as a regular, transitive, dependency.
Now the promised start
script. Remember, that goes into the "scripts"
section in your package.json
"start": "concurrently \"poi\" \"sleep 10 && electron .\""
Please note the sleep 10
before starting electron. That is to give the initial bundler run enough time to start serving our app.
And that is it! Your Vue.js app runs in Electron! And yes, it does hot reloading! Isn't that cool? Well... How about giving your app to other people? You wouldn't do that this way as you do in development, would you? We need some bundling techniques. Luckily for us there is a package called electron-packager
that has our backs covered.
Bundling
Let's start by installing the electron-packager
module:
$ npm install --save-dev electron-packager
With that covered let's add a few more scripts:
"build": "npm run clean && npm run compile && npm run package",
"clean": "rm -rf dist $npm_package_name-*",
"compile": "poi build --no-clear",
"package": "electron-packager . --ignore=\"src|poi.config.js|.gitignore\""
I think they are pretty self explanatory. Now from the console when you start the npm run build
command it will first remove all leftovers, then build the client application using POI and then package the application for your platform. If you would like to additionally package your app for a different operating system then you can always start the package target with additional parameters, like so:
$ npm run package -- --platform=win32 --arch=all
And that is it! Electron is super cool - go check it out! And as a reward for getting to those last words here's a link to a GitHub repository that has a ready-made working example: https://github.com/padcom/vue-electron-example. Besides the mentioned settings it also contains ESLint integration that I described in my previous post.
Happy coding!
1 comment:
OMG THANK YOUUU For some reason i couldn't make my project compile and build your template helped me A LOT
Post a Comment