Electron, Vite, Vue, TypeScript를 사용한 데스크톱 애플리케이션 개발 가이드. 프로젝트 설정, 개발 모드, 프로덕션 빌드 및 통합 방법을 단계별로 설명한다.
현대적인 웹 기술을 사용하여 데스크톱 애플리케이션을 개발하는 것은 개발자들에게 많은 이점을 제공한다.
Electron, Vite, Vue, TypeScript를 사용하여 데스크톱 애플리케이션을 개발하는 방법에 대해 알아보자.
Electron은 크로스 플랫폼 데스크톱 애플리케이션을 개발하기 위한 프레임워크이다. Chromium과 Node.js를 사용하여 웹 기술로 데스크톱 애플리케이션을 개발할 수 있다. Electron 애플리케이션은 메인 프로세스와 렌더러 프로세스로 나뉜다.
먼저 Vite와 Vue, TypeScript를 사용하여 프로젝트를 초기화한다.
yarn create @vitejs/app my-electron-app --template vue-ts
cd my-electron-app
yarn install
yarn add electron electron-builder @types/node --dev
Electron의 메인 프로세스와 렌더러 프로세스를 설정한다.
import { app, BrowserWindow, ipcMain, dialog } from 'electron';
import * as path from 'path';
import * as fs from 'fs';
import * as dicomParser from 'dicom-parser';
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
enableRemoteModule: false,
},
});
mainWindow.loadURL('http://localhost:3000');
}
app.on('ready', createWindow);
ipcMain.handle('open-file', async () => {
const { canceled, filePaths } = await dialog.showOpenDialog({
properties: ['openFile'],
filters: [{ name: 'DICOM Files', extensions: ['dcm'] }],
});
if (canceled) {
return null;
} else {
const filePath = filePaths[0];
const data = fs.readFileSync(filePath);
const dicomData = dicomParser.parseDicom(data);
return dicomData;
}
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
import { contextBridge, ipcRenderer } from 'electron';
contextBridge.exposeInMainWorld('electron', {
openFile: () => ipcRenderer.invoke('open-file'),
});
<template>
<div id="app">
<button @click="openFile">Open DICOM File</button>
<div v-if="dicomData">
<!-- DICOM 데이터를 화면에 표시 -->
<pre>{{ dicomData }}</pre>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
export default defineComponent({
setup() {
const dicomData = ref<string | null>(null);
const openFile = async () => {
const fileData = await (window as any).electron.openFile();
dicomData.value = fileData;
};
return {
dicomData,
openFile,
};
},
});
</script>
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [vue()],
build: {
outDir: 'dist',
},
});
// 개발 서버 실행
yarn dev
// electron 실행
yarn electron