반응형
기본적으로 공식 싸이트에서 하라는 대로 먼저 해본다.

https://www.electronjs.org/docs/tutorial/quick-start
여기 가서 순서대로 해본다.

 lionel.j  ~
     nvm list
->     v14.15.1
default -> lts/* (-> v14.15.1)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v14.15.1) (default)
stable -> 14.15 (-> v14.15.1) (default)
lts/* -> lts/fermium (-> v14.15.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.23.0 (-> N/A)
lts/erbium -> v12.20.0 (-> N/A)
lts/fermium -> v14.15.1

 lionel.j  ~
     node -v
v14.15.1

 lionel.j  ~
     npm -v
6.14.8

 lionel.j  ~
     nvm current
v14.15.1


기본 electron app 의 구조는
my-electron-app/
├── package.json
├── main.js
└── index.html

이렇다.


작업 디렉토리를 만든다.
 lionel.j  ~/Dev/node
     mkdir my-electron-app && cd my-electron-app

npm init을 해주면 기본 packge.json 파일이 구성 된다.
 lionel.j  ~/Dev/node/my-electron-app
     npm init -y
Wrote to /Users/lionel.j/Dev/node/my-electron-app/package.json:

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

일렉트론 개발 구성을 한다.
node_modules폴더가 생성되고 그 안에는 electron모듈 설치된 것을 확인할 수 있다. 그리고 다시 package.json을 열어보면 devDependencies에 electron가 추가된 것을 볼 수 있다. 이는 electron를 설치할 때 --save-dev옵션을 추었기에 추가가 된 것이다.


 lionel.j  ~/Dev/node/my-electron-app
     npm i --save-dev electron

> core-js@3.8.1 postinstall /Users/lionel.j/Dev/node/my-electron-app/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"


> electron@11.1.0 postinstall /Users/lionel.j/Dev/node/my-electron-app/node_modules/electron
> node install.js

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN my-electron-app@1.0.0 No description
npm WARN my-electron-app@1.0.0 No repository field.

+ electron@11.1.0
added 89 packages from 99 contributors and audited 89 packages in 5.026s

6 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

그러면 이렇게 만들어 진다.
 lionel.j  ~/Dev/node/my-electron-app
     ls -al
total 64
drwxr-xr-x   5 lionel.j  staff    160 12 15 10:19 .
drwxr-xr-x   7 lionel.j  staff    224 12 15 10:19 ..
drwxr-xr-x  88 lionel.j  staff   2816 12 15 10:19 node_modules
-rw-r--r--   1 lionel.j  staff  27969 12 15 10:19 package-lock.json
-rw-r--r--   1 lionel.j  staff    283 12 15 10:19 package.json


파일 두개를 만든다.

index.js 파일
내용은 이렇게.
----------------------------------------------------
const { app, BrowserWindow } = require('electron')

function createWindow () {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  win.loadFile('index.html')
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})
----------------------------------------------------



다음 하나는 index.html
----------------------------------------------------
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
</head>
<body style="background: white;">
    <h1>Hello World!</h1>
    <p>
        We are using node <script>document.write(process.versions.node)</script>,
        Chrome <script>document.write(process.versions.chrome)</script>,
        and Electron <script>document.write(process.versions.electron)</script>.
    </p>
</body>
</html>
----------------------------------------------------


그리고나서 package.json 을 다음과 같이 고친다.
 lionel.j  ~/Dev/node/my-electron-app
     cat package.json
----------------------------------------------------
{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
     "start": "electron ."
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^11.1.0"
  }
}
----------------------------------------------------

그리고 나서 npm start 하면 앱이 실행 됨

 lionel.j  ~/Dev/node/my-electron-app
     npm start

> my-electron-app@1.0.0 start /Users/lionel.j/Dev/node/my-electron-app
> electron .


앱을 배포하고 싶을때는

$ npx @electron-forge/cli import
$ npm run make
이렇게 하면

// Example for MacOS
out/
├── out/make/zip/darwin/x64/my-electron-app-darwin-x64-1.0.0.zip
├── ...
└── out/my-electron-app-darwin-x64/my-electron-app.app/Contents/MacOS/my-electron-app

이렇게 생긴다.



그런데 그냥 이렇게 만들면 썡으로 다 해야되서 vue 나 react 같은거를 붙인 boilerplate 를 쓰는것 같다.
인터넷을 찾아보니 vue 를 많이 써서 이걸로 해보려고 한다.

https://github.com/SimulatedGREG/electron-vue


문서는 여기서 참고한다.
https://simulatedgreg.gitbooks.io/electron-vue/content/ko/


# Install vue-cli and scaffold boilerplate  우선 vue-cli를 global 로 설치한다.
npm install -g vue-cli

# 그 다음으로 vue init simulatedgreg/electron-vue my-project 명령을 실행한다.
# 그러면 프로젝트 세팅사항에 대해 물어보는데 적당히 골라서 써준다.

 lionel.j  ~/Dev/node/vue-app-1
     vue init simulatedgreg/electron-vue my-project

? Application Name my-prj1
? Application Id net.hybridego.test1
? Application Version 0.0.1
? Project description An electron-vue project
? Use Sass / Scss? Yes
? Select which Vue plugins to install axios, vue-electron, vue-router, vuex, vuex-electron
? Use linting with ESLint? Yes
? Which ESLint config would you like to use? Standard
? Set up unit testing with Karma + Mocha? Yes
? Set up end-to-end testing with Spectron + Mocha? Yes
? What build tool would you like to use? builder
? author lionel.j <l.j@kakaoenterprise.com>

   vue-cli · Generated "my-project".

---

All set. Welcome to your new electron-vue project!

Make sure to check out the documentation for this boilerplate at
https://simulatedgreg.gitbooks.io/electron-vue/content/.

Next Steps:

  $ cd my-project
  $ yarn (or `npm install`)
  $ yarn run dev (or `npm run dev`)


이렇게 나오면 하라는대로 한다.
# Install dependencies and run your app
cd my-project
yarn # or npm install
yarn run dev # or npm run dev

yarn 이 없으면 npm으로 하던지 아니면 yarn 을 설치한다.
$ brew install yarn

리눅스에서는 cmdtest 를 깔으라고 하는데 그렇게 하면 안되고
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - 
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update && sudo apt install yarn 

이렇게 하던가 아니면 npm으로 설치 한다.
$ sudo npm install -g yarn


설치가 다 되었으면 계속한다.    

원래는 
yarn run dev
를 하면 앱이 딱 떠야 하는데 무슨 에러가 난다.


  ERROR in Template execution failed: ReferenceError: process is not defined

  ERROR in   ReferenceError: process is not defined

    - index.ejs:11 eval
      [.]/[html-webpack-plugin]/lib/loader.js!./src/index.ejs:11:2

    - index.ejs:16 module.exports
      [.]/[html-webpack-plugin]/lib/loader.js!./src/index.ejs:16:3

    - index.js:284
      [my-project]/[html-webpack-plugin]/index.js:284:18

    - runMicrotasks

    - task_queues.js:93 processTicksAndRejections
      internal/process/task_queues.js:93:5

여기 나온대로 수정을 해보자.
 https://github.com/SimulatedGREG/electron-vue/issues/871


이 파일 하나를 고치면 된다.
.electron-vue/webpack.renderer.config.js
이걸 열고 HtmlWebpackPlugin 로 검색하면

이런 부분이 나오는데 

  plugins: [
    new VueLoaderPlugin(),
    new MiniCssExtractPlugin({filename: 'styles.css'}),
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.resolve(__dirname, '../src/index.ejs'),
      <<=== 요기다가 추가
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true
      },
      nodeModules: process.env.NODE_ENV !== 'production'
        ? path.resolve(__dirname, '../node_modules')
        : false
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoEmitOnErrorsPlugin()
  ],


  이렇게 바꿉니다.
      new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.resolve(__dirname, '../src/index.ejs'),
      -----여기부터
      templateParameters(compilation, assets, options){
        return {
          compilation: compilation,
          webpack: compilation.getStats().toJson(),
          webpackConfig: compilation.options,
          htmlWebpackPlugin: {
            files: assets,
            options: options
          },
          process,
        };
      },
      -----여기까지 추가
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true
      },
그리고 다시 실행하면 된다.

$ yarn run dev


실행 파일로 만들려면

$ yarn run build 하면 된다.

아니면 electron-builder 같은걸 써도 된다.

electron-builder로 빌드하기 (https://www.electron.build/)

다음 명령어로 설치한다.
yarn add electron-builder --dev

package.json 에다가 build 옵션을 설정한다.

대략 

"build": {
    "asar": false,
    "appId": "com.project",
    "productName": "Project",
    "win": {
      "target": [
        {
          "target": "nsis",
          "arch": [
            "x64",
            "ia32"
          ]
        }
      ],
      "icon": "./resources/installer/Icon.ico"
    },
    "nsis": {
      "oneClick": true,
      "perMachine": false,
      "installerIcon": "resources/installer/Icon.ico",
      "createDesktopShortcut": true
    }
  }

  다른 옵션들도 있으니 찾아서 설정해본다.

  기본으로 electron-vue boilerplate 에서 build 옵션들이 설정되어 있다. 

  빌드 하려면 다음의 명령을 실행하면 된다.

  ./node_modules/.bin/electron-builder build

 ✘ lionel.j  ~/Dev/node/vue-app-1/my-project
     ./node_modules/.bin/electron-builder build
  • electron-builder  version=22.9.1 os=19.6.0
  • loaded configuration  file=package.json ("build" field)
  • writing effective config  file=build/builder-effective-config.yaml
  • packaging       platform=darwin arch=x64 electron=2.0.18 appOutDir=build/mac
  • skipped macOS application code signing  reason=cannot find valid "Developer ID Application" identity or custom non-Apple code signing certificate, see https://electron.buidmg 파일과 zip 파일까지 다 만들어준다.ld/code-signing allIdentities=
                                                   0 identities found

                                                Valid identities only
                                                   0 valid identities found
  • building        target=macOS zip arch=x64 file=build/my-prj1-0.0.1-mac.zip
  • building        target=DMG arch=x64 file=build/my-prj1-0.0.1.dmg
  • building block map  blockMapFile=build/my-prj1-0.0.1.dmg.blockmap
  • building embedded block map  file=build/my-prj1-0.0.1-mac.zip

결과물은 my-project/build/mac/my-prj1.app 에 생기고
dmg 파일과 zip 파일까지 다 만들어준다.



yarn add serialport

하면 package.json 에 

  "dependencies": {
    "axios": "^0.18.0",
    "serialport": "^9.0.3",
    "vue": "^2.5.16",
    "vue-electron": "^1.0.6",
    "vue-router": "^3.0.1",
    "vuex": "^3.0.1",
    "vuex-electron": "^1.0.0"
  },

이렇게 추가 된다.

bootstrap 추가한다. 이 세개는 무슨 차이일까?
yarn add bootstrap
yarn add bootstrap --dev
yarn add bootstrap --save-dev


하다보니 renderer 쪽에서는 console.log 가 출력이 안된다. 찾아보니 이런걸 써야 나온다고 한다.
yarn add electron-log

쓸때는 
const log = require('electron-log')

log.info('this is info')
log.warn('this is warn')
log.error('this is error')
log.verbose('this is verbose')
log.debug('this is debug')
log.silly('this is silly')

이렇게 하면 된다.
반응형

'Programing 미분류' 카테고리의 다른 글

Mac 에서 node 완전히 삭제하기 - nvm으로 재설치  (0) 2020.12.15
NVS (Node Version Switcher)  (0) 2020.12.10
MagicMirror 설치하기  (0) 2020.12.01
Posted by Real_G