master
hocili 2021-03-09 14:59:24 +08:00
commit 801eb88b11
16 changed files with 2547 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
node_modules
.DS_Store
dist
dist-ssr
*.local
.vscode
.idea

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# Vite Electron Typescript Template
[doc](https://hocili.blog/vite-electron-typescript.html)

13
index.html Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/render/main.ts"></script>
</body>
</html>

4
index.js Normal file
View File

@ -0,0 +1,4 @@
require('ts-node').register({
project:'./tsconfig.electron.json'
});
require('./src/main/app.ts')

34
package.json Normal file
View File

@ -0,0 +1,34 @@
{
"name": "vite-electron-typescript-template",
"version": "0.0.0",
"main": "dist/main/app.js",
"scripts": {
"dev": "vite",
"build": "vite build",
"serve": "vite preview",
"electron:dev": "NODE_ENV=development electron index.js",
"electron:build": "vite build && tsc -p tsconfig.electron.json --outDir dist/main && electron-builder"
},
"dependencies": {
"vue": "^3.0.5"
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.1.5",
"@vue/compiler-sfc": "^3.0.5",
"cross-env": "^7.0.3",
"electron": "^12.0.0",
"electron-builder": "^22.10.5",
"ts-node": "^9.1.1",
"typescript": "^4.2.3",
"vite": "^2.0.5"
},
"build": {
"appId": "your.id",
"mac": {
"category": "your.app.category.type"
},
"files": [
"dist/**/*"
]
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

33
src/main/app.ts Normal file
View File

@ -0,0 +1,33 @@
import { app, BrowserWindow } from 'electron'
function createWindow() {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
})
if (process.env.NODE_ENV === 'development') {
win.loadURL('http://localhost:3000/')
} else {
win.loadFile('dist/render/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()
}
})

27
src/render/App.vue Normal file
View File

@ -0,0 +1,27 @@
<template>
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Hello Vue 3 + TypeScript + Vite" />
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import HelloWorld from './components/HelloWorld.vue'
export default defineComponent({
name: 'App',
components: {
HelloWorld
}
})
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

BIN
src/render/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,65 @@
<template>
<h1>{{ msg }}</h1>
<p>
Recommended IDE setup:
<a href="https://code.visualstudio.com/" target="_blank">VSCode</a>
+
<a
href="https://marketplace.visualstudio.com/items?itemName=octref.vetur"
target="_blank"
>Vetur</a>
or
<a href="https://github.com/johnsoncodehk/volar" target="_blank">Volar</a>
(if using
<code>&lt;script setup&gt;</code>)
</p>
<p>See <code>README.md</code> for more information.</p>
<p>
<a href="https://vitejs.dev/guide/features.html" target="_blank">Vite Docs</a> |
<a href="https://v3.vuejs.org/" target="_blank">Vue 3 Docs</a>
</p>
<button @click="count++">count is: {{ count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test hot module replacement.
</p>
</template>
<script lang="ts">
import { ref, defineComponent } from 'vue'
export default defineComponent({
name: 'HelloWorld',
props: {
msg: {
type: String,
required: true
}
},
setup: () => {
const count = ref(0)
return { count }
}
})
</script>
<style scoped>
a {
color: #42b983;
}
label {
margin: 0 0.5em;
font-weight: bold;
}
code {
background-color: #eee;
padding: 2px 4px;
border-radius: 4px;
color: #304455;
}
</style>

4
src/render/main.ts Normal file
View File

@ -0,0 +1,4 @@
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

5
src/render/shims-vue.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
declare module '*.vue' {
import { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}

13
tsconfig.electron.json Normal file
View File

@ -0,0 +1,13 @@
{
"compilerOptions": {
"target": "esnext",
"module": "CommonJS",
"moduleResolution": "node",
"strict": true,
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": [
"src/main/app.ts"
]
}

16
tsconfig.json Normal file
View File

@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"strict": true,
"jsx": "preserve",
"sourceMap": true,
"resolveJsonModule": true,
"esModuleInterop": true,
"lib": ["esnext", "dom"],
"types": ["vite/client"]
},
"include": ["src/render/**/*.ts", "src/render/**/*.d.ts", "src/render/**/*.tsx", "src/render/**/*.vue"],
"exclude": ["src/app.ts"]
}

23
vite.config.ts Normal file
View File

@ -0,0 +1,23 @@
import { join } from 'path'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
const outDir = join(__dirname, 'dist/render')
const renderDir = join(__dirname, 'src/render')
const publicDir = join(__dirname, 'public')
// https://vitejs.dev/config/
export default defineConfig({
publicDir,
base: './',
plugins: [vue()],
build: {
outDir,
emptyOutDir: true,
},
resolve: {
alias: {
'@': renderDir,
}
},
})

2298
yarn.lock Normal file

File diff suppressed because it is too large Load Diff