# remote-control **Repository Path**: li_shifeng/remote-control ## Basic Information - **Project Name**: remote-control - **Description**: 极客时间 - Electron 开发实战 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: https://www.yuque.com/li_shifeng/glew8t/dnms1v - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-25 - **Last Updated**: 2021-06-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 搭建步骤 - `npm init -y` # 初始项目 - `git init` # 初始 git - `npm i -D electron` # 安装 electron - `create-react-app main` # 进入 app/renderer/src 目录创建一个 react 项目(注:需全局安装 create-react-app) - 配置渲染进程 package.json `{"start": "set BROWSER=none && react-scripts start"}` 启动应用时不打开浏览器 - `npm i -D concurrently wait-on` # concurrently: 用来并行多个命令的执行;wait-on: 等待资源准备好了才会触发后面的命令 - `cd app/renderer/src/main` # 进入渲染进程项目目录 `npm i -D customize-cra react-app-rewired` # 安装这两个模块,让你在不退出 cra eject 的情况下可以对内部做一些改动 - `npm i -S robotjs` # 安装 robotjs (注:需要先安装 Python 和 Visual Studio) - [安装 Python](https://www.python.org/downloads/windows) (注:需要勾上 Python Launcher 一块安装) - [安装 Visual Studio](https://visualstudio.microsoft.com/zh-hans/free-developer-offers) (注:需要勾选 “使用 C++ 的桌面开发” 一块安装) - `npm i -S vkey` # 作用:通过 keyCode 获取具体的按键 - `npm i -S ws` - `npm i -S about-window` - `npm i -D electron-builder electron-builder-squirrel-windows cross-env` # 目录结构 - 见 /directoryList.md 文件 # 启动项目 - `npm i` # 安装依赖 - `cd app/renderer/src/main` # 进入渲染进程项目目录 - `npm i` # 安装依赖 - `cd ../../../../` # 返回根目录 - `cd signal` # 进入 WebSocket 服务目录 - `npm i` # 安装依赖 - `cd ../` # 返回根目录 - `npm run start` # 启动项目 # 项目打包 ## 打包工具对比 | | electron-builder | electron-forge | | :----------: | :----------------------------------------------: | :--------------------------------------------------: | | 签名 | √√√ | √√√ | | 安装包类型 | √√√ | √√√ | | 原生模块编译 | √√√ | √√√ | | 定制化 | √√√ | √ | | 上手成本 | √√ | √ | | boilerplate | × | √√√ | | 跨平台构建 | Linux、Windows | × | | 社区活跃度 | √√√ | √√ | | 场景 | 打包和发布的完整解决方案
基本适用于所有场景 | 创建到发布的一体化解决方案
适合从 0 到 1 的项目 | ## 打包证书 - Mac: 开发者证书 - Windows: 去 “赛门铁克” 或 “WoSign” 上购买证书 ## 打包配置 ``` "build": { "appId": "com.geektime.mercurius", // 应用 id "productName": "Mercurius", // 应用名称 "files": "app", "asar": false, // 是否使用 asar 加密 "extraFiles": [ "app/renderer/**/src" ], "directories": { // 目录配置 "app": "dist", // 打包的代码目录 "buildResources": "resource", // 构建包的资源目录 "output": "release" // 存放产包的目录 }, "copyright": "Copyright © 2020 dragon", // 版权信息 "mac": { "target": [ // 包的格式 "dmg", "zip" ], "icon": "resources/icon.icns" // logo 地址 }, "dmg": { // dmg 配置 "background": "resources/background.png", // 背景图 "window": { // 安装窗口大小 "width": 540, "height": 380 }, "contents": [ // dmg 内容坐标 { "x": 410, "y": 180, "type": "link", "path": "/Applications" }, { "x": 130, "y": 180, "type": "file" } ], "iconSize": 128 // logo 大小 }, "win": { "icon": "resources/icon.ico", // logo 地址 "target": [ // 包格式 "squirrel", "nsis" ] }, "nsis": { // nsis 配置 "oneClick": false, // 一键安装 "language": "2052", // 安装语言代码 "perMachine": true, // 给机器上所有用户安装 "allowToChangeInstallationDirectory": true // 让用户选择安装目录 }, "squirrelWindows": { // squirrel 配置 "loadingGif": "resources/loading.gif", // 安装 loading 动画 "iconUrl": "https://raw.githubusercontent.com/dengyaolong/geektime-electron/master/img/icon.ico" // icon 的远端地址 } } ``` ## 打包 - `npm run pack:win` # 打 windows 包 - `npm run pack:mac` # 打 mac 包 # 软件更新 | 更新方式 | 手动更新 | 文件覆盖 | 自动更新 | 操作系统 | | :------: | :----------------------------------------------: | :------------------------------------: | :----------------------: | -------------------------- | | 优点 | 简单稳定 | 下载过程快 | 稳定、快、打扰少 | 统一、稳定 | | 缺点 | 过程繁琐、慢、影响使用、更新率低 | 慢、实现比较复杂、稳定性差、写文件失败 | 实现复杂 | 受应用商店局限 | | 适用场景 | 低频更新、用户粘性高、作为各种升级技术的降级方案 | 打补丁 | 高频更新软件、体验要求高 | 操作系统应用商店上架的软件 | # 经验 & 技巧 - 产品发布可使用 npm version patch/minor/major 管理升级版本号 - windows 下需要证书签名,否则可能被杀毒软件误杀 - mac 下如果没有证书签名,无法使用 electron 自动更新 # 注 - navigator.mediaDevices.getUserMedia() 需在 “file://协议” 或 “https://协议” 或 “http://localhost” 或 “http://127.0.0.1” 下使用,否则获取不到媒体流 - getUserMedia() 未指定视频流的源时,默认调用摄像头获取视频流,此时电脑需要有硬件摄像头 - 程序启动前要先把 signal 文件夹里的 socket 服务启动起来 - postbuild 钩子会在 build 执行完成之后执行 # 附 - `npm i -g mddir` # 全局安装 mddir 用于生成目录结构(使用:当前目录执行 mddir) - `npm i -g create-react-app` # 全局安装 create-react-app 用于创建 react 项目 - `npm list -g` # 查看全局安装的 npm 包 - `npm list -g --depth 1` # --depth 用于列出依赖包的层级(1 表示列出依赖包及依赖包的下一级) - `iconutil -c icns icons.iconset -o icon.icns` # 通过 iconutil 生成 icns