咱们知道若是须要electron和vue.js开发,能够经过electron-vue直接建立一个带vue的electron的项目,那么今天咱们来说讲electron如何与react全家桶结合。html
源码地址:https://github.com/wenchangshou2/electrol-react-redux.gitvue
Yarn是facebook推出的一个更加靠近的的包管理工具。node
mac下安装react
brew install yarn
Linux下安装git
在ubuntu中默认的包仓库是没有yarn的包的,咱们须要:es6
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
在咱们导入证书和源以后,能够经过下列的命令直接安装github
sudo apt-get update && sudo apt-get install yarn
create-react-app是一个建立react项目的工具,经过这个工具能够快速建立一个初始的react项目。web
yarn global add create-react-app
create-react-app app cd app
yarn add electron yarn add electron-builder -D
yarn global add foreman
yarn install
eslint配置你的代码的规范,配合atom或者vs code,可以实时的观测你的代码风格是否符合规范。shell
touch .eslintrc.jsonnpm
{ "env": { "browser": true, "commonjs": true, "es6": true, "jest": true }, "parserOptions": { "ecmaFeatures": { "jsx": true }, "sourceType": "module" }, "rules": { "no-const-assign": "warn", "no-this-before-super": "warn", "no-undef": "warn", "no-continue": "off", "no-unreachable": "warn", "no-unused-vars": "warn", "constructor-super": "warn", "valid-typeof": "warn", "space-before-function-paren":"off", "function-paren-newline":"off", "no-plusplus":"off", "quotes": [ 2, "single" ] }, "parser": "babel-eslint", "extends": "airbnb", "plugins": [ "react", "jsx-a11y", "import" ] }
同时咱们须要安装ESLint的相应的插件
yarn add eslint eslint-config-airbnb eslint-plugin-jsx-a11y eslint-plugin-import eslint-plugin-react eslint-plugin-import
在通过上面的操做以后,咱们须要对package.json进行修改来适配electron
咱们暂时将内容修改为下面的内容
{ "name": "qiniu-upload", "version": "0.1.0", "private": true, "homepage": "./", "main": "src/electron-starter.js", "dependencies": { "electron": "^1.8.4", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", "eslint-plugin-import": "^2.10.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.7.0", "prop-types": "^15.6.1", "react": "^16.3.0", "react-dom": "^16.3.0", "react-scripts": "1.1.1", }, "scripts": { "start": "nf start -p 3000", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject", "electron": "electron .", "electron-start": " node src/electron-wait-react", "react-start": "react-scripts start", "pack": "build --dir", "dist": "npm run build && build", "postinstall": "install-app-deps" }, "devDependencies": { "electron-builder": "^20.8.1" }, "build": { "appId": "com.electron.electron-with-create-react-app", "win": { "iconUrl": "https://cdn2.iconfinder.com/data/icons/designer-skills/128/react-256.png" }, "directories": { "buildResources": "public" } } }
上面的版本可能随时在变,不用太介意,用最新的版本就能够
上面的咱们将本来的start改为了react-start,对于其余的没有作任何的改变,如今还须要添加electron的处理内容
"homepage": "./", "main": "src/electron-starter.js",
和
"build": { "appId": "com.electron.electron-with-create-react-app", "win": { "iconUrl": "https://cdn2.iconfinder.com/data/icons/designer-skills/128/react-256.png" }, "directories": { "buildResources": "public" } }
修改以后最终的文件内容:
{ "name": "qiniu-upload", "version": "0.1.0", "private": true, "homepage": "./", "main": "src/electron-starter.js", "dependencies": { "electron": "^1.8.4", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", "eslint-plugin-import": "^2.10.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.7.0", "prop-types": "^15.6.1", "react": "^16.3.0", "react-dom": "^16.3.0", "react-redux": "^5.0.7", "react-scripts": "1.1.1", "redux": "^3.7.2" }, "scripts": { "start": "nf start -p 3000", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject", "electron": "electron .", "electron-start": " node src/electron-wait-react", "react-start": "react-scripts start", "pack": "build --dir", "dist": "npm run build && build", "postinstall": "install-app-deps" }, "devDependencies": { "electron-builder": "^20.8.1" }, "build": { "appId": "com.electron.electron-with-create-react-app", "win": { "iconUrl": "https://cdn2.iconfinder.com/data/icons/designer-skills/128/react-256.png" }, "directories": { "buildResources": "public" } } }
如今咱们还须要在项目的根目录下面建立一个名为Procfile的文件,其内容以下:
react: npm run react-start electron: npm run electron-start
如今咱们还须要完成src/electron-start.js以及src/start-react.js文件
src/electron-start.js
const electron = require('electron'); const { app, BrowserWindow } = electron; const path = require('path'); const url = require('url'); let mainWindow; function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600 }); const startUrl = process.env.ELECTRON_START_URL || url.format({ pathname: path.join(__dirname, '/../build/index.html'), protocol: 'file:', slashes: true, }); mainWindow.loadURL(startUrl); mainWindow.webContents.openDevTools(); mainWindow.on('closed', () => { mainWindow = null; }); } app.on('ready', createWindow); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { if (mainWindow === null) { createWindow(); } });
src/start-react.js
const net = require('net'); const childProcess = require('child_process'); const port = process.env.PORT ? process.env.PORT - 100 : 3000; process.env.ELECTRON_START_URL = `http://localhost:${port}`; const client = new net.Socket(); let startedElectron = false; const tryConnection = () => { client.connect({ port }, () => { client.end(); if (!startedElectron) { console.log('starting electron'); startedElectron = true; const { exec } = childProcess; exec('npm run electron'); } }); }; tryConnection(); client.on('error', () => { setTimeout(tryConnection, 1000); });
如今咱们运行
yarn start
如今你发现了react将以本地应用程序的方式运行。
上面的是一个初级的demo,咱们如今须要继续整合react redux,来实现一个官方的Todo功能
咱们下节内容来实现整合