Electron Forge集成React Typescript Vite完整步骤
本文介绍了使用ElectronForge创建跨平台桌面应用的全过程。首先通过npx命令初始化项目,选择TypeScript和Vite构建工具,配置了开发、测试和生产环境的脚本命令。然后集成React框架,添加相关依赖并配置TSX组件。针对开发中遇到的安全警告,通过动态配置CSP策略解决,区分开发和生产环境的不同安全要求。最后完善TypeScript配置,设置模块解析路径和严格类型检查。整个过程涵盖
目录
一、创建Electron Forge项目
官方文档:Getting Started | Electron Forge
npx create-electron-app@latest my-app
选择:typescript、vite、最新版本
"start": "electron-forge start",
"package": "electron-forge package",
"make": "electron-forge make",
项目自带了3个核心脚本命令,publish可以直接忽略掉(基本用不到),
start :启动项目;
package: 测试打包(开发阶段最常用)
特点:✅ 速度快(比 make 快 50%),适合开发中频繁验证;✅ 产物可直接运行(双击文件夹内的 exe/dmg 即可启动应用),无需安装;✅ 无安装引导、无桌面快捷方式、无卸载功能,仅自己测试用。
make: 生产打包(交付用户必用)
特点:✅ 会根据 electron-forge.config.js 中 makers 配置,生成对应平台的安装包(Windows=exe、Mac=dmg、Linux=deb);✅ 产物带完整的安装 / 卸载逻辑(如安装时创建桌面快捷方式、卸载时清理文件);✅ 是最终分发给用户的产物,适合对外交付。
package 和 make 命令均可打包生成 PC 端的安装包文件,但这类命令仅能为当前操作系统打包对应版本的安装包;若需同时完成 Windows、macOS、Linux 三大平台的安装包打包,原本需要配备三台对应系统的电脑,可通过虚拟机、云服务器、多设备部署或云打包平台这几种方式解决。
二、集成React
react核心依赖:
yarn add react react-dom
ts项目必装类型:
yarn add @types/react @types/react-dom --dev
在/src下创建App.tsx
export default function App() {
return (
<div style={{ padding: 20, fontFamily: 'Arial' }}>
<h1>✅ Electron + React + TypeScript 集成成功</h1>
<p>基于 Yarn 4.x + Electron Forge + Vite 构建</p>
<p>{import.meta.env.MODE}</p>
</div>
);
}
/src/render.tsx
/**
* This file will automatically be loaded by vite and run in the "renderer" context.
* To learn more about the differences between the "main" and the "renderer" context in
* Electron, visit:
*
* https://electronjs.org/docs/tutorial/process-model
*
* By default, Node.js integration in this file is disabled. When enabling Node.js integration
* in a renderer process, please be aware of potential security implications. You can read
* more about security risks here:
*
* https://electronjs.org/docs/tutorial/security
*
* To enable Node.js integration in this file, open up `main.ts` and enable the `nodeIntegration`
* flag:
*
* ```
* // Create the browser window.
* mainWindow = new BrowserWindow({
* width: 800,
* height: 600,
* webPreferences: {
* nodeIntegration: true
* }
* });
* ```
*/
import { createRoot } from 'react-dom/client';
import App from './App';
import { StrictMode } from 'react';
const rootElement = document.getElementById('root');
if (rootElement) {
const root = createRoot(rootElement);
root.render(
<StrictMode>
<App />
</StrictMode>
);
} else {
console.error('❌ 未找到 id 为 root 的 DOM 节点,请检查 HTML 模板');
}
在index.html里加入根节点
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>XLODA</title>
</head>
<body>
<div id="root"></div>
</body>
<script type="module" src="/src/renderer.tsx"></script>
</html>
yarn run start启动项目,发现启动正常,页面正常。到这里集成react成功。
三、安全相关Warning解决
启动项目后,你可能看到控制台会有这个warning。

解决方案如下:
/src/main.ts替换:
index.html加标签,生产环境和测试环境都能很好的适配!
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://cdn.deepseek.com; font-src 'self' data:; connect-src 'self'; media-src 'self'; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'self'"
/>
完整版:
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>XLODA</title>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://cdn.deepseek.com; font-src 'self' data:; connect-src 'self'; media-src 'self'; object-src 'none'; frame-src 'none'; base-uri 'self'; form-action 'self'"
/>
</head>
<body>
<div id="root"></div>
</body>
<script type="module" src="/src/renderer.tsx"></script>
</html>
安全相关warning完美解决。
四、Typescript相关配置
tsconfig.json的配置:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"noImplicitAny": true,
"sourceMap": true,
"baseUrl": ".",
"paths": { "@/*": ["./src/*"] },
"resolveJsonModule": true,
"strict": true,
"types": ["vite/client"],
"isolatedModules": true,
"verbatimModuleSyntax": true
},
"include": ["**/*.ts", "**/*.tsx"],
"exclude": ["node_modules", "dist", "out"],
"ts-node": {
"compilerOptions": { "module": "CommonJS" }
}
}
.eslintrc.js
module.exports = {
root: true,
env: {
browser: true,
es2021: true,
node: true
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended' // 必须放在最后,关闭冲突规则
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true
},
ecmaVersion: 'latest',
sourceType: 'module'
},
plugins: ['react', '@typescript-eslint'],
settings: {
react: {
version: 'detect'
}
},
rules: {
// === 匹配你的 Prettier 偏好 ===
semi: ['error', 'always'], // ✓ 改为有分号
'comma-dangle': ['error', 'never'], // 无尾随逗号
'arrow-parens': ['error', 'as-needed'], // 箭头函数括号精简
// === React 规则 ===
'react/react-in-jsx-scope': 'off', // React 17+ 不需要引入
'react/prop-types': 'off', // TypeScript 项目不需要
// === 代码质量 ===
'no-console': 'warn',
'dot-notation': 'error',
'no-unused-vars': 'off', // 使用 TypeScript 的规则
'@typescript-eslint/no-unused-vars': ['error'],
// === 简化规则 ===
quotes: ['error', 'single'], // 单引号
'jsx-quotes': ['error', 'prefer-double'], // JSX 双引号
'no-useless-escape': 'off',
'@typescript-eslint/no-empty-function': 'off'
}
};
Prettier可以按需加入,官方文档:Install · Prettier
你可能需要加入的依赖
# 安装 react 相关插件
yarn add eslint-plugin-react eslint-plugin-react-hooks --dev
# 安装 prettier 相关插件(配置中用到了 plugin:prettier/recommended)
yarn add eslint-plugin-prettier eslint-config-prettier --dev
执行脚本:
"lint": "eslint src/**/*.{ts,tsx} ./*.{ts,tsx} --ignore-path .eslintignore",
.eslintignore文件你可以自定义。
五、Vite配置
vite.renderer.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig(() => {
return {
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
},
plugins: [react()],
root: path.resolve(__dirname, './'), // 指向项目根目录
publicDir: 'public',
// 适配 Electron 开发环境的 Vite 服务配置(避免端口/主机冲突)
server: {
host: 'localhost',
port: 5173,
strictPort: true,
// 禁用 CORS 预检,避免 Electron 加载资源时跨域拦截
cors: true
}
};
});
六、图片注意事项
使用本地图片时一定要用导入的方式,否则打包出来图片可能无法正常显示(开发环境正常,打包后就有问题)。
图片正确的使用方式:
import FAVICON from '@/assets/images/logos/favicon.png';
import PRIMARY from '@/assets/images/logos/logo-primary.png';
import WHITE from '@/assets/images/logos/logo-white.png';
export const LOGOS = {
FAVICON,
PRIMARY,
WHITE
};
最终完成electron项目的初始化!
更多推荐
所有评论(0)