React+electron项目搭建 打包

一.搭建react+electron项目

1.创建一个react项目

create-react-app my-app

cd my-app

npm start

看下页面是否打开,是否运行正确。

注意:如果页面没有src文件夹,

第一种:卸载全局安装包:

npm uninstall -g create-react-app

yarn global remove create-react-app

然后 npm start,浏览器会打开页面。

如果第一种不行,用第二种

第二种:忽视掉本地的create-react-app已存在的版本进行项目的创建

npx --ignore-existing create-react-app my-app

2. 引入electron

npm install electron --save-dev

3. 配置

1):在package.json配置入口文件,具体如下:

“main”:”main.js”

修改启动命令:

2):main.js文件编写

const { app, BrowserWindow } = require('electron')
const path = require('path')
const pkg = require('./package.json');

let mainWindow

function createWindow() {
  mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    preload: path.join(__dirname, 'preload.js')
    }
 })

  // 加载应用----react 打包
  //mainWindow.loadURL(url.format({
  //pathname: path.join(__dirname, './build/index.html'),
  //protocol: 'file:',
  //slashes: true
  //}))
  // 加载应用----适用于 react 项目和开发阶段npm run electron
   mainWindow.loadURL('http://localhost:3000/');
  mainWindow.on('closed', function () {
    mainWindow = null
  })
}

app.on('ready', createWindow)

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', function () {
  if (mainWindow === null) createWindow()
})

启动:

npm start   npm run dev/electron  两个命令都执行时,浏览器打开页面,会打开桌面应用。

二.搭建react路由

npm install --save react-router-dom

src/Index.js

import React from 'react';
import ReactDOM from 'react-dom';
import ReactMap from './router/routerMap';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
  <div>
    <ReactMap />
  </div>
, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

src/router/routerMap.js
import React from 'react'
import { HashRouter as Router, Route } from 'react-router-dom'
import Login from '../pages/Login/Login'

class ReactMap extends React.Component {
  updateHandle() {
    console.log("每次router变化后触发")
  }
  render() {
    return (
      <Router history={this.props.history}>
        <Route exact path="" component={Login} />
      </Router>
    )
  }
}
export default ReactMap;

三.搭建redux

npm install --save react-redux

npm install --save redux

npm install --save redux-thunk

src/Index.js

import React from 'react';
import ReactDOM from 'react-dom';
import ReactMap from './router/routerMap';
import * as serviceWorker from './serviceWorker';
import { Provider } from 'react-redux'
import { createStore, applyMiddleware, compose } from 'redux'
import rootRedux from './redux'
import thunk from 'redux-thunk'
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose
const enhancer = composeEnhancers(applyMiddleware(thunk));
const store = createStore(
  rootRedux,
  enhancer
// applyMiddleware(thunk),
// window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)

ReactDOM.render(
  <div>
    <Provider store={store}>
    <ReactMap />
    </Provider>
  </div>
, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

src/redux/index.js

import { combineReducers } from 'redux'
import set from './set'
export default combineReducers({
  data: set
})

src/redux/set.js

const set = (state = [], action) => {
  switch (action.type) {
    case 'GET_LIST':
      return {
        ...state,
        list: action.list
      }
    case 'SET_USERNAME':
      return {
        ...state,
        userName: action.list
      }
    default: return state
  }
}

export default set

src/actions/index.js

export const getList = () => {
   return {
    type: 'GET_LIST',
    list: '1111'
  }
}

export const setUserName = (list) => {
  return {
    type: 'SET_USERNAME',
    list: list
  }
}

四.不抽离 webpack配置的方案antd(npm run build 后找不到图片路径,暂未解决)

cnpm install --save react-app-rewired customize-cra

cnpm install --save babel-plugin-import

1.配置less,less-loader

cnpm install --save less less-loader

2. 根目录新建config-overrides.js文件

const { override, fixBabelImports, addWebpackAlias, addLessLoader } = require('customize-cra')
const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir)
}

// addLessLoader 添加less的引用
// fixBabelImports 按需加载antd组件
// addWebpackAlias 路径别名配置
/* 路径别名配置 */
module.exports = override(
  addWebpackAlias({
    '@': resolve('src'),
    components: resolve('./src/components'),
    assets: resolve('./src/assets'),
    static: resolve('./src/static'),
    img: resolve('./src/static/img'),
    js: resolve('./src/static/js'),
    css: resolve('./src/static/css'),
  }),
  /* antd组件按需加载 */
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: true,
  }),
  addLessLoader({
    javascriptEnabled: true,
    modifyVars: { '@primary-color': '#1DA57A' },
  }),

);

3.  修改package.json文件,目录结构

4.  使用:页面引用less

import '@/static/css/index.less'

五.抽离 webpack配置的方案

npm run eject

运行后会出现config文件夹,在里面配置less 和路径别名配置

1.配置less,less-loader

cnpm install --save less less-loader

在webpack.config.js里面进行less的配置

2.配置路径别名

在webpack.config.js里面进行路径别名的配置

六.打包

1.打包的准备工作:

在package.json,里面加上”homepage”:”.”

在public里面加上main.js  和 package.json 和 preload.js

package.json

{
    "name":"crh_chat",
    "version":"1.0-test",
    "main":"main.js",
    "author": {
        "name":"YOURNAME"
    },
    "license": "MIT"
}

main.js

如果需要引用一些模块就加入preload: path.join(__dirname, 'preload.js'),不用可以注释掉这段

const electron = require('electron');
const path = require('path');
// 控制应用生命周期的模块
const { app } = electron;
// 创建本地浏览器窗口的模块
const { BrowserWindow } = electron;

// 指向窗口对象的一个全局引用,如果没有这个引用,那么当该javascript对象被垃圾回收的
// 时候该窗口将会自动关闭
let win;

function createWindow() {
  // 创建一个新的浏览器窗口
  win = new BrowserWindow({
  width: 1920,
  height: 1080,
  autoHideMenuBar: true,
  webPreferences: {
      preload: path.join(__dirname, 'preload.js')
  }
  });

  // 并且装载应用的index.html页面
  win.loadURL(`file://${__dirname}/index.html`);

  // 打开开发工具页面
  //win.webContents.openDevTools();
  // 当窗口关闭时调用的方法
  win.on('closed', () => {
    // 解除窗口对象的引用,通常而言如果应用支持多个窗口的话,你会在一个数组里
    // 存放窗口对象,在窗口关闭的时候应当删除相应的元素。
    win = null;
  });
}

// 当Electron完成初始化并且已经创建了浏览器窗口,则该方法将会被调用。
// 有些API只能在该事件发生后才能被使用。
app.on('ready', createWindow);
/* var mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
}); */

// 当所有的窗口被关闭后退出应用
app.on('window-all-closed', () => {
  // 对于OS X系统,应用和相应的菜单栏会一直激活直到用户通过Cmd + Q显式退出
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  // 对于OS X系统,当dock图标被点击后会重新创建一个app窗口,并且不会有其他
  // 窗口打开
  if (win === null) {
    createWindow();
  }

});

preload.js 这里引入了electron,需要用的时候,window.electron

global.electron = require('electron')

window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  } 

  for (const type of ['chrome', 'node', 'electron']) {
    replaceText(`${type}-version`, process.versions[type])
  }
})

有两个地方需要preload.js 外面那个是开发时要用的,public里面是打包后需要用到的。

2.npm run build

成功后会出现build文件夹,双击index.html在浏览器打开,可以正常运行

3.npm run package

在pacakge.json里面的scripts配置

"package": "electron-packager ./build package0514 --win --out package/ --arch=x64 --app-version=1.1.0 --electron-version=8.0.0"

然后 npm run package

成功后页面会生成一个package文件,里面有我们打包好的文件

(0)

相关推荐

  • 简单的 useState 实现

    简单的 useState 实现 本文写于 2020 年 10 月 21 日 以下是一段非常简单的 React 代码: const App = () => { const [n, setN] = ...

  • 《深入浅出React和Redux》(2) - Redux

    ### Redux是Flux理念的一种实现. 关于Flux理念可以通过类比MVC模式来做简单理解. MVC模式中,用户请求先到达Controller,由Controller调用Model获得数据,然后 ...

  • react & dva 去掉地址栏的#号

    去掉地址栏的#号 使用react 配合dva 搭建的项目,项目运行之后,默认的地址栏是会有一个#号的,很烦,不想见到它,处理方式如下: 下载插件:history cnpm i history --sa ...

  • react+taro-JYwebApp模板集成方案项目搭建【1】

    本章节: 讲述基于react+taro-JYwebApp,项目的基础搭建.本主题讲述了react+taro-JYwebApp .webapp模板-集成方案,从零到一的手写搭建全过程. 该项目不仅是一个 ...

  • webpack 5 带来的全新改变

    安装 webpack-dev-server npm install webpack-dev-server -D 在 webpack配置文件中配置服务: devServer:{ port: 8080, ...

  • react 读书笔记

    来源掘金小册 - react实战:设计模式和最佳实践 react设计思想 属性展开 - 保留当前组件需要的props,并且使其他的props传递下去 var obj = {a: 1, b: 2, c: ...

  • Web 性能优化: 使用 Webpack 分离数据的正确方法

    WEB前端开发社区 昨天 制定向用户提供文件的最佳方式可能是一项棘手的工作. 有很多不同的场景,不同的技术,不同的术语. 在这篇文章中,我希望给你所有你需要的东西,这样你就可以: 了解哪种文件分割策略 ...

  • 使用create-react-app搭建TypeScript React Ant Design开发环境

    要创建一个支持TypeScript的Create React App项目,可以运行: npx create-react-app my-app --template typescript# oryarn ...

  • 使用开源微前端框架 Luigi 创建一个基于微前端架构的工程

    官网地址 微前端通常被称为"前端微服务". 它们允许您将大型单体前端分解为独立的.可扩展的.可以协同工作的独立部分. 微前端架构对于复杂的产品或拥有众多团队的公司尤其有用,可以帮助 ...

  • 安装react-redux后编译报错

    安装了react-redux后,npm start报下面错误 Failed to compile. ./node_modules/_react-redux@7.2.0@react-redux/es/c ...

  • react-app-rewired

    介绍 create-creact-app项目,如果需要手动修改配置,需先npm run eject弹出配置,这个过程是不可逆的 推荐使用第三方工具进行修改 这里介绍使用react-app-rewire ...