Electron Forge集成React Typescript完整步骤

目录

[一、创建Electron Forge项目](#一、创建Electron Forge项目)

二、集成React

三、安全相关Warning解决

四、Typescript相关配置


一、创建Electron Forge项目

官方文档:Getting Started | Electron Forge

bash 复制代码
npx create-electron-app@latest my-app

选择:typescript、vite、最新版本

bash 复制代码
"start": "electron-forge start",    
"package": "electron-forge package",
"make": "electron-forge make",

项目自带了3个核心脚本命令,publish可以直接忽略掉(基本用不到),

start :启动项目;

package: 测试打包(开发阶段最常用)

特点:✅ 速度快(比 make 快 50%),适合开发中频繁验证;✅ 产物可直接运行(双击文件夹内的 exe/dmg 即可启动应用),无需安装;✅ 无安装引导、无桌面快捷方式、无卸载功能,仅自己测试用。

make: 生产打包(交付用户必用)

特点:✅ 会根据 electron-forge.config.jsmakers 配置,生成对应平台的安装包(Windows=exe、Mac=dmg、Linux=deb);✅ 产物带完整的安装 / 卸载逻辑(如安装时创建桌面快捷方式、卸载时清理文件);✅ 是最终分发给用户的产物,适合对外交付。

package 和 make 命令均可打包生成 PC 端的安装包文件,但这类命令仅能为当前操作系统打包对应版本的安装包;若需同时完成 Windows、macOS、Linux 三大平台的安装包打包,原本需要配备三台对应系统的电脑,可通过虚拟机、云服务器、多设备部署或云打包平台这几种方式解决。

二、集成React

react核心依赖:

bash 复制代码
yarn add react react-dom

ts项目必装类型:

bash 复制代码
yarn add @types/react @types/react-dom --dev

在/src下创建App.tsx

javascript 复制代码
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>{process.env.NODE_ENV}</p>
    </div>
  );
}

在项目根目录下创建index.tsx

javascript 复制代码
import { createRoot } from 'react-dom/client';
import App from './src/App';

const rootElement = document.getElementById('root');
if (rootElement) {
  const root = createRoot(rootElement);
  root.render(<App />);
}

在index.html里加入根节点,配置render为自己的index.tsx的路径

html 复制代码
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>XLODA</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
  <script type="module" src="/index.tsx"></script>
</html>

yarn run start启动项目,发现启动正常,页面正常。到这里集成react成功。

三、安全相关Warning解决

启动项目后,你可能看到控制台会有这个warning。

解决方案如下:

在index.html中加入

html 复制代码
<meta
      http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self';"
    />

完整版:

html 复制代码
<!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'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self';"
    />
  </head>
  <body>
    <div id="root"></div>
  </body>
  <script type="module" src="/index.tsx"></script>
</html>

但这个设置可能会影响vite在开发环境的热刷新,生产环境下正常。

所以我们需要对vite进行配置:

引入插件:

bash 复制代码
yarn add @vitejs/plugin-react@^4.2.1 --dev

vite.renderer.config.ts修改如下:

javascript 复制代码
// https://vitejs.dev/config
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig(({ mode }) => {
  const isProd = mode === 'production';
  // 核心:开发/生产差异化 CSP 规则
  const cspPolicy = isProd
    ? // 生产环境:严格规则(无 unsafe 项,彻底消除警告)
      `default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; object-src 'none'; base-uri 'self';`
    : // 开发环境:放宽规则(保证 React 热更新/本地调试)
      `default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self' http://localhost:* ws://localhost:*; object-src 'none'; base-uri 'self';`;

  return {
    plugins: [react()],
    // Vite 4.x 原生支持的写法,直接替换 HTML 中的占位符
    transformIndexHtml: (html: string) => html.replace('<%= cspPolicy %>', cspPolicy)
  };
});

这样测试环境用测试环境自己的,生产环境有生产环境的安全配置,安全相关warning完美解决。

四、Typescript相关配置

tsconfig.json的配置:

javascript 复制代码
{
  "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" }
  }
}

最终完成electron项目的初始化!

相关推荐
郭老二9 小时前
【前端】vue3:编译步骤
前端
不在逃避q10 小时前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁10 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One98511 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易11 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师12 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户0595401744612 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈12 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen13 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒13 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端