You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用Electron、NW.js实现React应用本地网络可访问及跨平台单文件打包

用Electron/NW.js托管React应用并实现局域网访问+跨平台打包

嘿,我来帮你一步步搞定这个需求!不管是开发阶段让React应用在局域网可访问,还是用Electron做离线桌面端并打包成跨平台安装包,都给你梳理清楚。

一、开发阶段:让npm start启动的React应用支持局域网访问

React默认的npm start用webpack-dev-server只监听localhost,局域网其他设备没法访问。你只需要改一下启动配置:

  • 如果是用create-react-app创建的项目,直接修改package.json里的start脚本:
    "scripts": {
      "start": "react-scripts start --host 0.0.0.0"
    }
    
    这样启动后,你可以用http://你的本地IP:3000(比如http://192.168.1.100:3000)在局域网其他设备的浏览器里访问。
  • 如果是自定义webpack配置,在devServer里设置host: '0.0.0.0'即可。

二、用Electron实现离线桌面应用+局域网访问

这部分核心是让Electron同时启动一个本地服务器(托管React静态文件)和桌面窗口,服务器监听所有网卡(0.0.0.0)来支持局域网访问。

步骤1:在React项目中集成Electron

  1. 安装依赖:

    npm install electron express --save-dev
    

    这里用express来托管React的静态文件,也可以用http-server这类轻量工具,看你偏好。

  2. 创建Electron主进程文件(比如main.js,放在React项目根目录):

    const { app, BrowserWindow } = require('electron');
    const express = require('express');
    const path = require('path');
    const http = require('http');
    
    // 配置服务器端口,可自定义
    const PORT = 3000;
    const expressApp = express();
    
    // 托管React build后的静态文件
    expressApp.use(express.static(path.join(__dirname, 'build')));
    
    // 处理React路由的刷新问题,所有请求返回index.html
    expressApp.get('*', (req, res) => {
      res.sendFile(path.join(__dirname, 'build', 'index.html'));
    });
    
    // 启动服务器,监听所有网卡(0.0.0.0)让局域网可访问
    const server = http.createServer(expressApp);
    server.listen(PORT, '0.0.0.0', () => {
      console.log(`服务器已启动:\n- 本机访问:http://localhost:${PORT}\n- 局域网访问:http://你的本地IP:${PORT}`);
    });
    
    // 创建Electron桌面窗口
    function createWindow() {
      const mainWindow = new BrowserWindow({
        width: 1000,
        height: 700,
        webPreferences: {
          // 安全配置:关闭node集成,开启上下文隔离
          nodeIntegration: false,
          contextIsolation: true
        }
      });
    
      // 加载本地服务器的React应用
      mainWindow.loadURL(`http://localhost:${PORT}`);
    
      // 可选:打开开发者工具
      // mainWindow.webContents.openDevTools();
    }
    
    // Electron生命周期处理
    app.whenReady().then(() => {
      createWindow();
    
      app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
      });
    });
    
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') app.quit();
    });
    
  3. 配置package.json:

    • 新增main字段指定Electron主文件:"main": "main.js"
    • 修改脚本,让它先build React再启动Electron:
      "scripts": {
        "start": "react-scripts start --host 0.0.0.0",
        "build": "react-scripts build",
        "electron-start": "npm run build && electron ."
      }
      

    现在运行npm run electron-start,就会先打包React,然后启动Electron窗口,同时服务器启动,局域网设备就能访问了。

三、NW.js的实现思路

NW.js的逻辑更简单,它可以直接加载本地HTML文件,同时你也能在NW.js的脚本里启动一个本地服务器。步骤大概是:

  • 把React build后的文件放到NW.js项目目录
  • 在package.json里配置mainbuild/index.html
  • 编写一个脚本启动服务器(同样监听0.0.0.0),让局域网可访问
    不过NW.js的生态现在不如Electron活跃,所以更推荐用Electron方案。

四、打包成跨平台安装包(Mac dmg/Windows exe)

electron-builder来打包,它支持一键生成多种格式的安装包,配置也很简单。

步骤1:安装依赖

npm install electron-builder --save-dev

步骤2:在package.json里添加打包配置

在package.json根节点新增build字段:

"build": {
  "appId": "com.yourcompany.yourappname",
  "productName": "你的应用名称",
  "directories": {
    "output": "dist"
  },
  "files": [
    "build/**/*",
    "main.js",
    "node_modules/**/*"
  ],
  "mac": {
    "target": "dmg",
    "icon": "build/icon.icns" // 可选,需要准备Mac格式的图标
  },
  "win": {
    "target": "nsis", // 生成exe安装包
    "icon": "build/icon.ico" // 可选,Windows格式图标
  }
}

步骤3:添加打包脚本

在package.json的scripts里新增:

"scripts": {
  // ...其他脚本
  "electron-pack": "npm run build && electron-builder"
}

运行npm run electron-pack,打包完成后会在dist目录生成Mac的dmg文件和Windows的exe安装包。

注意事项

  • 端口冲突:可以在代码里添加端口检测逻辑,自动切换可用端口,避免和其他程序冲突。
  • 安全问题:Electron的webPreferences一定要保持nodeIntegration: falsecontextIsolation: true,防止XSS攻击。
  • 离线可用性:因为我们托管的是React build后的静态文件,所以Electron运行时完全不需要联网,离线也能正常使用。

内容的提问来源于stack exchange,提问作者Felix Imafidon

火山引擎 最新活动