/tiny-evt

:hamburger: Vite powered foundation for building secure Electron Apps with TypeScript and Vue

Primary LanguageTypeScriptMIT LicenseMIT

Awesome

tiny-evt

由 Vite 驱动,使用 TypeScript、Vue 开发 Electron 应用的项目基础代码

简洁易用,准备工作更少,运行、HMR、打包速度更快!遵循 安全建议、包含自动化测试构建

依赖列表

Dependence Category Required Version Information
vue-router 4.0.0-alpha.11
env-cmd dev 10.1.0
cypress dev 4.7.0 测试工具
spectron dev 11.0.0 测试工具
@vue/test-utils dev 2.0.0-alpha.6 测试工具
jest dev 26.0.1 测试工具
@vue/compiler-sfc dev true 3.0.0-beta.14 版本必须匹配 vite 中的 vue 版本
electron dev true 9.0.0
electron-builder dev true 22.6.0
vite dev true 0.20.2 包含 vue@3.0.0-beta.14esbuild

First Run

# 第一步
cd tiny-evt && npm install && cp configs/.env-cmdrc.json .

# 第二步,修改 ./.env-cmdrc.json 文件
"dist": {
  "CSC_IDENTITY_AUTO_DISCOVERY": false,
  "PUBLISH_BUILD": false
}

应用包含 GitHub Graphql API 调用,需填写 "GITHUB_TOKEN" 字段,如留空则使用 Mock 数据代替真实请求

运行应用

# 编译脚本
# scripts/dev-runner.ts ---> esbuild.build() ---> build/dev-runner.js

# 运行脚本( 环境变量,NODE_ENV=development )
# node build/dev-runner.js

# 脚本执行操作 - 启动本地服务器运行 Renderer Process ( Vue APP )
# renderer/**/* ---> Vite ---> dev-server @ localhost:3000

# 脚本执行操作 - 利用 Vite 中引入的 esbuild 编译打包 Main Process ( TypeScript APP )
# main/**/* ---> esbuild.build() ---> build/main.js、build/preload.js

# 脚本执行操作 - 运行 Electron 应用
# electron ---> build/main.js

# 开发版环境下,测试版本 Electron 应用的 main-window 指向本地 Vite-dev-server
# main-window @ TinyEvt @ development ---> localhost:3000

npm run dev

运行测试

/**
 * 测试类型:`Unit Testing`
 * 测试目标:`Components @ Vue App @ Renderer`
 * 测试工具:`Vue Test Utils`、`Jest`
 *
 * 编译脚本
 * scripts/dev-runner.ts ---> esbuild.build() ---> build/dev-runner.js
 *
 * 运行脚本( 环境变量 NODE_ENV=development、TEST=components )
 * node build/dev-runner.js
 *
 * 脚本执行操作 - 编译 Tests ( 利用既有 vite 配置,无缝支持解析 .vue 文件以及编译 TypeScript )
 * tests/vue/*.spec.ts ---> Vite.build() ---> tests/vue/build/*.js
 *
 * 脚本执行操作 - 启动 Jest 运行测试用例 ( tests/vue/build/*.js )
 */

npm run vtu
/**
 * 测试类型:`Integration Testing`
 * 测试目标:`Electron App`
 * 测试工具:`Spectron`、`Jest`
 *
 * 编译脚本
 * scripts/dev-runner.ts ---> esbuild.build() ---> build/dev-runner.js
 *
 * 运行脚本( 环境变量 NODE_ENV=development、TEST=spectron )
 * node build/dev-runner.js
 *
 * 脚本执行操作 - 启动本地服务器运行 Renderer Process ( Vue APP )
 * renderer/* ---> Vite ---> dev-server @ localhost:3000
 *
 * 脚本执行操作 - 编译打包 Main Process ( TypeScript APP )
 * main/* ---> esbuild.build() ---> build/main.js、build/preload.js
 *
 * 脚本执行操作 - 编译 Tests
 * tests/spectron/*.ts ---> esbuild.build() ---> tests/spectron/*.js
 *
 * 脚本执行操作 - 启动 Jest 调用 Spectron 运行 Electron App ( 测试应用启动文件指向 build/main.js ) 进行测试
 */

npm run spectron
/**
 * 测试类型:`End-to-End Testing`
 * 测试目标:`Vue App @ Renderer`
 * 测试工具:`Cypress`
 *
 * 编译脚本
 * scripts/dev-runner.ts ---> esbuild.build() ---> build/dev-runner.js
 *
 * 运行脚本( 环境变量 NODE_ENV=development、TEST=cypress )
 * node build/dev-runner.js
 *
 * 脚本执行操作 - 启动本地服务器运行 Renderer Process ( Vue APP )
 * renderer/* ---> Vite ---> dev-server @ localhost:3000
 *
 * 脚本执行操作 - 启动 Cypress 测试( tests/cypress/integration/*.spec.ts,测试页面指向 localhost:3000 )
 *
 * 测试及构建环境下 Cypress 的使用方式存在区别:process.env.CI ? cypress run : cypress open
 */

npm run cypress

应用打包

# 编译脚本
# scripts/app-builder.ts ---> esbuild.build() ---> build/app-builder.js

# 运行脚本
# node build/app-builder.js

# 脚本执行操作 - 编译打包 Renderer Process ( Vue APP )
# renderer/**/* ---> Vite.build() ---> build/renderer/

# 脚本执行操作 - 编译打包 Main Process ( TypeScript APP )
# main/**/* ---> esbuild.build() ---> build/main.js、build/preload.js

# 脚本执行操作 - 打包创建应用
# package.json ---> electron-builder ---> dist/~app.asar/package.json
# build/**/*( dev-runner.js、app-builder.js 除外 )---> electron-builder ---> dist/~app.asar/build/
# main/resources/**/* ---> electron-builder ---> dist/~app.asar/build/resources/
# dist/mac/**/* ---> electron-builder ---> dist/TinyEvt.dmg

# 以可分发格式打包后的 Electron 应用指向 Vue 应用打包后的本地文件
# main-window @ TinyEvt( packaged,DMG 格式 )---> app.asar/build/renderer/index.html

# 注意:本机环境下执行打包操作时,默认忽略 `Code Signing` 以及 `publish` 操作

npm run dist

GitHub Workflow

# Build & Release

# 1. 更新 `package.json` 中的版本号,例如从 `v1.2.2` 变更至 `v1.2.3`
# 2. `git commit -am v1.2.3`
# 3. `git tag v1.2.3`,使用指定的命名格式 `v*.*.*`
# 4. `git push && git push --tags`
# 5. 指定格式标签的推送事件会触发 GitHub Actions 自动创建 Release v1.2.3、打包生成不同平台格式的应用并发布
# Build & Release - Code Signing @ macOS runner

# 1. 导出与应用相关的所有证书至单个文件 `certs.p12`,并设置强密码
# 2. 运行命令 `base64 -i certs.p12 -o encoded.txt` 对导出文件进行编码
# 3. 在项目仓库的 `Secrets` 设置项中添加 `mac_certs`( 即 `encoded.txt` 的内容 )
# 4. 在项目仓库的 `Secrets` 设置项中添加 `mac_certs_password`( 即导出证书时设置的密码 )
# 5. 在 `.github/workflows/build-release.yml` 中添加 `CSC_LINK`, `CSC_KEY_PASSWORD` 环境变量配置

# .github/workflows/build-release.yml
# - name: Build App and publish
#   env: |
#     CSC_LINK: ${{ secrets.CSC_LINK }}
#     CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}

Sponsor

// 非职业前端,出于研究以及自用目的创建此项目
// 请调用以下函数来判断是否要赞助此项目:

enum Comment {
    NotBad = '还不错',
    DidHelped = '确实有所帮助',
    Sorry = '毫无感觉'
}

function makeDecision (comment: Comment, willingToSponsor: boolean) {
  if (( comment === Comment.NotBad || comment === Comment.DidHelped ) && willingToSponsor ) {
    console.log('请点击当前页面顶部的 “Sponsor” 按钮')
  } else {
    console.log('能理解')
  }
}