├── .vscode ├── settings.json └── launch.json ├── src ├── renderer │ ├── public │ │ └── renderer.js │ ├── assets │ │ └── yay.jpg │ ├── models │ │ └── global.js │ ├── pages │ │ ├── document.ejs │ │ └── index.js │ └── config │ │ └── config.js └── main │ └── main.js ├── .prettierrc ├── .prettierignore ├── .gitignore ├── .buildrc.js ├── package.json └── README.md /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true 3 | } -------------------------------------------------------------------------------- /src/renderer/public/renderer.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | window.electron = require('electron') 3 | -------------------------------------------------------------------------------- /src/renderer/assets/yay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/williamnie/umi-electron/HEAD/src/renderer/assets/yay.jpg -------------------------------------------------------------------------------- /src/renderer/models/global.js: -------------------------------------------------------------------------------- 1 | export default { 2 | state: { 3 | msg: 'Hello World', 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": true 6 | } -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | release/ 3 | .DS_Store 4 | .idea/ 5 | yarn-error.log 6 | npm-debug.log 7 | src/renderer/pages/.umi/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | src/renderer/pages/.umi 4 | src/renderer/pages/.umi-production 5 | release 6 | yarn-error.log 7 | yarn.lock 8 | .history 9 | .vscode 10 | -------------------------------------------------------------------------------- /src/renderer/pages/document.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | netPassClient 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/renderer/pages/index.js: -------------------------------------------------------------------------------- 1 | 2 | import React, { Component } from 'react'; 3 | import { connect } from 'dva'; 4 | class Index extends Component { 5 | constructor(props) { 6 | super(props); 7 | this.state = {}; 8 | } 9 | render() { 10 | return ( 11 |
12 |

{this.props.global.msg}

13 |
14 | ); 15 | } 16 | } 17 | 18 | export default connect(({ global }) => ({ global }))(Index) -------------------------------------------------------------------------------- /.buildrc.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require("path"); 3 | 4 | module.exports = { 5 | webpack: { 6 | alias: { 7 | "@": path.resolve(__dirname, "src/renderer"), 8 | components: path.resolve(__dirname, "src/renderer/components/"), 9 | acore: path.resolve(__dirname, "src/renderer/acore/"), 10 | pages: `${__dirname}/src/renderer/pages`, 11 | models: `${__dirname}/src/renderer/models`, 12 | services: `${__dirname}/src/renderer/services`, 13 | plugin: `${__dirname}/src/renderer/plugin`, 14 | utils: `${__dirname}/src/renderer/utils`, 15 | } 16 | } 17 | }; 18 | -------------------------------------------------------------------------------- /src/renderer/config/config.js: -------------------------------------------------------------------------------- 1 | const buildrc = require("../../../.buildrc.js"); 2 | 3 | export default { 4 | history: 'hash', 5 | outputPath: `../../dist/renderer`, 6 | publicPath: './', 7 | plugins: [ 8 | [ 9 | 'umi-plugin-react', 10 | { 11 | antd: true, 12 | dva: true, 13 | dynamicImport: true, 14 | title: 'Hello World', 15 | dll: true, 16 | // routes: { 17 | // exclude: [], 18 | // }, 19 | hardSource: false, 20 | routes: { 21 | exclude: [/components/], 22 | }, 23 | }, 24 | ], 25 | ], 26 | alias: buildrc.webpack.alias, 27 | treeShaking: true, 28 | ignoreMomentLocale: true, 29 | routes: [ 30 | { 31 | path: '/', 32 | component: './index', 33 | }, 34 | ], 35 | }; 36 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}/dist/main/main.js", 12 | "preLaunchTask": "tsc: build - tsconfig.json", 13 | "outFiles": [ 14 | "${workspaceFolder}/dist/**/*.js" 15 | ] 16 | }, 17 | { 18 | "name": "Debug Main Process", 19 | "type": "node", 20 | "request": "launch", 21 | "cwd": "${workspaceFolder}", 22 | "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", 23 | "windows": { 24 | "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" 25 | }, 26 | "args" : ["."] 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /src/main/main.js: -------------------------------------------------------------------------------- 1 | import { app, BrowserWindow } from 'electron'; 2 | import * as path from 'path'; 3 | import * as url from 'url'; 4 | 5 | let mainWindow = null; 6 | 7 | function createWindow() { 8 | mainWindow = new BrowserWindow({ 9 | height: 800, 10 | width: 1200, 11 | webPreferences: { 12 | nodeIntegration: true, 13 | // nodeIntegrationInWorker: true, 14 | preload: path.join(__dirname, './public/renderer.js') 15 | } 16 | }); 17 | 18 | if (process.env.NODE_ENV === 'development') { 19 | mainWindow.loadURL('http://localhost:8000/#/'); 20 | mainWindow.webContents.openDevTools(); 21 | } else { 22 | mainWindow.loadURL( 23 | url.format({ 24 | pathname: path.join(__dirname, './dist/renderer/index.html'), 25 | protocol: 'file:', 26 | slashes: true, 27 | }), 28 | ); 29 | } 30 | 31 | mainWindow.on('closed', () => { 32 | mainWindow = null; 33 | }); 34 | } 35 | 36 | app.on('ready', createWindow); 37 | 38 | app.on('window-all-closed', () => { 39 | if (process.platform !== 'darwin') { 40 | app.quit(); 41 | } 42 | }); 43 | 44 | app.on('activate', () => { 45 | if (mainWindow === null) { 46 | createWindow(); 47 | } 48 | }); 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "umi-electron", 3 | "version": "1.0.0", 4 | "description": "an example based on umijs + electron", 5 | "main": "./dist/main/main.js", 6 | "private": true, 7 | "build": { 8 | "productName": "electron", 9 | "files": [ 10 | "dist/", 11 | "node_modules/", 12 | "package.json" 13 | ], 14 | "mac": { 15 | "category": "your.app.category.type" 16 | }, 17 | "win": { 18 | "target": [ 19 | "nsis" 20 | ] 21 | }, 22 | "nsis": { 23 | "oneClick": false, 24 | "perMachine": true, 25 | "allowToChangeInstallationDirectory": true 26 | }, 27 | "directories": { 28 | "output": "release" 29 | }, 30 | "appId": "com.cn.littlestrong.demo", 31 | "asar": false 32 | }, 33 | "scripts": { 34 | "start": "npm run build-main-dev && run-electron ./dist/main/main.js", 35 | "start:main": "electron-webpack dev", 36 | "start:renderer": "cross-env APP_ROOT=src/renderer umi dev", 37 | "build-main-prod": "NODE_ENV=production webpack --config ./build/webpack.main.prod.config.js", 38 | "build-main-dev": "NODE_ENV=development webpack --config ./build/webpack.main.config.js", 39 | "build:renderer": "cross-env APP_ROOT=src/renderer umi build", 40 | "watch": "tsc -w", 41 | "lint": "tslint -c tslint.json -p tsconfig.json", 42 | "debug:main": "run-electron --inspect=5858 -w ./dist/main/main.js", 43 | "pack": "npm run build:renderer && npm run build-main-prod && electron-builder --dir", 44 | "exe": "electron-builder --win", 45 | "dist": "electron-builder", 46 | "prettier": "prettier --list-different \"./**/*.{ts,tsx,js,jsx,less}\"" 47 | }, 48 | "keywords": [ 49 | "Electron", 50 | "umi", 51 | "quick", 52 | "start", 53 | "tutorial", 54 | "demo" 55 | ], 56 | "devDependencies": { 57 | "axios": "^0.19.2", 58 | "classnames": "^2.2.6", 59 | "cross-env": "^5.1.1", 60 | "electron": "^8.0.0", 61 | "electron-builder": "^22.3.2", 62 | "electron-debug": "^3.0.1", 63 | "electron-webpack": "^2.7.4", 64 | "moment-locales-webpack-plugin": "^1.1.2", 65 | "prettier": "1.19.0", 66 | "prop-types": "^15.7.2", 67 | "query-string": "^6.10.1", 68 | "react": "^16.12.0", 69 | "react-dom": "^16.12.0", 70 | "react-helmet": "^5.2.1", 71 | "run-electron": "^1.0.0", 72 | "uglifyjs-webpack-plugin": "^2.2.0", 73 | "umi": "^2.8.16", 74 | "umi-plugin-dll": "^1.6.0", 75 | "umi-plugin-react": "^1.15.2", 76 | "webpack": "5.94.0", 77 | "webpack-cli": "^3.3.10", 78 | "webpack-merge": "^4.2.2" 79 | }, 80 | "dependencies": {}, 81 | "electronWebpack": { 82 | "main": { 83 | "sourceDirectory": "src/main" 84 | }, 85 | "renderer": { 86 | "sourceDirectory": null 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # umi-electron-javascript 2 | 3 | ### 一个基于umijs + electron + javascript的模板 4 | 5 | ## 主要特性 6 | - 支持整个应用的热重载 7 | 8 | ## 项目结构 9 | 10 | ```ssh 11 | . 12 | |-- build 13 | | |-- icon.icns // 打包后程序图标 MacOS 14 | | |-- icon.ico // 打包后程序图标 Windows 15 | | |-- webpack.base.config.js // electron-webpack 基础配置 16 | | |-- webpack.main.config.js // electron-webpack 开发配置 17 | | `-- webpack.main.prod.config.js // electron-webpack 正式配置 18 | |-- dist // 项目编译输出目录 19 | | |-- main // 主程序编译目录 20 | | `-- renderer // 页面编译目录 21 | |-- release // 打包输出目录 22 | |-- src // 开发目录 23 | | |-- main // 主程序目录 24 | | | `-- main.js // 主程序入口 25 | | `-- renderer // React项目页面 26 | | |-- assets 27 | | | `-- yay.jpg 28 | | |-- config 29 | | | |-- config.js // umijs配置 30 | | | `-- webpack.config.js // umijs-webpack配置 31 | | |-- models 32 | | | `-- global.js 33 | | |-- pages 34 | | `-- index.js 35 | | |-- public 36 | | `-- renderer.js // 如果需要引用node的api,需要在这个js里面提前引入 37 | | `-- global.js 38 | |-- package.json // 项目依赖以及打包配置 39 | `-- README.md // 项目说明文档 40 | ``` 41 | 42 | ## 环境搭建 43 | ### 安装 44 | 45 | 然后通过yarn下载依赖 46 | 47 | ```javascript 48 | $ yarn 49 | ``` 50 | 51 | ### 开发 52 | 53 | 首先通过以下命令启动渲染进程(默认端口:8000) 54 | 55 | ```javascript 56 | $ yarn start:renderer 57 | ``` 58 | 59 | 然后启动主进程 60 | 61 | ```javascript 62 | $ yarn start:main 63 | ``` 64 | 65 | ### 如何使用node的api 66 | 67 | 需要在 src/renderer/public/renderer.js中引入相关的api才可以 68 | 69 | ### 打包 70 | 71 | ```javascript 72 | $ npm run pack // 打包macOS 73 | $ npm run exe // 打包windows 74 | ``` 75 | 76 | 如果想把代码打包成一个dmg文件或者zip文件,可以执行以下命令 77 | 78 | ```javascript 79 | $ npm run dist 80 | ``` 81 | 82 | ### 打包配置说明 [`package.json`](./package.json) 83 | 84 | [electron-builder-参数参考](https://www.electron.build/configuration/configuration) 85 | 86 | [category-Mac分类参考](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8) 87 | 88 | ```js 89 | { 90 | ... 91 | "build": { 92 | "productName": "LittleStrong",// 程序名称 93 | "files": [ // 需要打包的文件 94 | "dist/", 95 | "node_modules/", 96 | "package.json" 97 | ], 98 | "mac": { // 打包mac版本 99 | "category": "your.app.category.type", // mac app分类 100 | "target": [ // 打包类型 101 | "dmg", 102 | "zip" 103 | ] 104 | }, 105 | "win": { // 打包windows版本 106 | "target": [ // 打包类型 107 | "nsis" 108 | ] 109 | }, 110 | "nsis": { 111 | "oneClick": false, 112 | "perMachine": true, 113 | "allowToChangeInstallationDirectory": true 114 | }, 115 | "directories": { // 打包后输出目录 116 | "output": "release" 117 | }, 118 | "appId": "com.cn.littlestrong.demo", // appstore包名 119 | "asar": false // 是否加密处理 120 | }, 121 | } 122 | ``` 123 | --------------------------------------------------------------------------------