데스크탑 앱을 만들기 위해서 Electron에 관심을 가지던 중, Electron과 Vue3를 사용해 앱을 만들어 보고 싶어졌다. 앱을 만들기 전에 Electron과 Vue3 개발 환경을 구성해 보자.
참고로 Node 버전은 14 이상에서 진행한다.
Vue 프로젝트를 vue cli 로 구성하고 electron 구성을 추가하는 순서로 진행한다. 이 글에서 사용하는 vue cli 버전은 4.5.14
이다.
$ vue -V
$ @vue/cli 4.5.14
$ vue create vue-electron
Manually select feeatures
를 선택한다.
아래 항목을 선택하고 Enter를 누른다.
vue는 3.x 버전을 선택한다.
Use class-style component syntax?
는 No를 선택한다.
Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)?
는 Yes를 선택한다.
Use history mode for router?
는 Yes를 선택한다.
Pick a linter / formatter config
는 ESLint와 Prettier를 선택한다.
Pick additional lint features
에서 파일 저장시 linting을 하도록 Lint on save를 선택한다.
각 도구의 설정 파일을 package.json 한 곳에 몰아 넣지 말고 각각 따로 만들 수 있게 In dedicated config files
를 선택한다.
나중에 같은 설정을 반복해서 사용할 수 있도록 설정을 저장해 놓는다.
vue 프로젝트가 생성된다.
vue 프로젝트가 생성되면 프로젝트 폴더로 이동한다.
$ cd vue-electron
electron-builder를 사용해서 electron 개발 환경을 구성한다. Vue는 CLI용 electron-builder 플러그인을 제공한다. 프로젝트 폴더에서 아래와 같이 vue cli를 사용해 electron-builder를 추가한다.
$ vue add electron-builder
프로젝트에 필요한 Electron 버전을 선택한다.
요즘 대세는 [tailwindcss]()! tailwindcss를 추가하자. tailwindcss도 vue cli용 플러그인을 제공한다.
$ vue add tailwind
tailwind css 구성 파일을 minimal 로 선택한다.
유명하진 않지만 sl(script-list)을 사용하면 package.json이 제공하는 스크립트 명령어를 편하게 볼 수 있다.
아래 명령어를 실행하면 electron + vue3 앱이 실행된다.
$ npm run electron:serve
앱 빌드는 npm run electron:build
로 할 수 있다. 인증서 등이 필요하므로 자세한 내용은 Electron Builder 문서를 참고한다.
preload.js 를 아래와 같이 설정하면 preload.js
파일을 찾을 수 없다는 오류가 발생한다.
async function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
preload: path.resolve(__dirname, 'preload.js'),
},
});
...
}
문제의 원인은 electron 배포 폴더에 preload.js 파일이 없기 때문이다. preload.js 파일이 src 폴더에 있을 때, 아래와 같이 vue.config.js를 설정하면 이슈가 해결된다.
module.exports = {
pluginOptions: {
electronBuilder: {
preload: 'src/preload.js',
},
},
};
dist_electron
폴더에 preload.js
파일이 따로 있는 것을 확인할 수 있다.
.vscode/settings.json
에 아래 내용을 추가한다.
{
...,
"editor.defaultFormatter": "octref.vetur",
"vetur.format.defaultFormatter.html": "prettier",
"vetur.format.defaultFormatter.css": "prettier",
"vetur.format.defaultFormatter.postcss": "prettier",
"vetur.format.defaultFormatter.scss": "prettier",
"vetur.format.defaultFormatter.less": "prettier",
"vetur.format.defaultFormatter.stylus": "stylus-supremacy",
"vetur.format.defaultFormatter.js": "prettier",
"vetur.format.defaultFormatter.ts": "prettier"
}
index.html 파일에 스타일을 지정해 주면 문제는 간단히 해결된다. 단, overflow: hidden
을 주면 스크롤이 동작하지 않는다. 그래서 ::-webkit-scrollbar
의 display를 none으로 처리하여 보이지 않게 하면, 스크롤바를 숨기면서 스크롤이 동작하도록 할 수 있다.
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>My Electron App</title>
<style>
::-webkit-scrollbar {
display: none;
}
</style>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>