electron +react + ts +antd 开发环境搭建

发布一下 0 0

一、更新npm到最新版本、并安装淘宝镜像

# 更新到最新版本npm install -g npm# 安装淘宝镜像npm install -g cnpm --registry=https://registry.npm.taobao.org# 配置淘宝镜像npm config set registry https://registry.npm.taobao.org# 查看配置npm config get registry# 查看版本npm  -vcnpm  -v

二、安装yarn

# 安装yarncnpm install -g yarn# 查看版本yarn -v

三、装一下react脚手架 create-react-app

cnpm install --global create-react-app

四、创建react+typescripe项目

npx create-react-app im-react --typescript# 进入项目目录cd im-react

五、安装 react-app-rewired及cross-env

 cnpm i -D react-app-rewired cross-env   . 在根目录下,创建 REACT-APP-REWIRED 配置文件 CONFIG-OVERRIDES.JS 用于扩展 WEBPACK 配置

6. 在根目录下,创建 REACT-APP-REWIRED 配置文件 CONFIG-OVERRIDES.JS 用于扩展 WEBPACK 配置

六、在根目录下、创建react-app-rewired配置文件、config-ocerrides.js

module.exports = (config, env) => {// 为了方便使用 electron 以及 node.js 相关的 api// 需要将 target 设置为 electron-renderer// 设置了 target 之后,原生浏览器的环境将无法运行此 react 项目(因为不支持 node.js 相关的 api),会抛出 Uncaught ReferenceError: require is not defined 异常// 需要在 electron 的环境才能运行(因为支持 node.js 相关的 api)// 这一步的操作, 都是为了能与 electron 进行更好的集成config.target = 'electron-renderer';return config;};

七、安装electron环境

cnpm i -D electron

八、在根目录下、创建electron入口文件;在package.json中加入 "MAIN": "./MAIN.JS"

/main.jsconst { app, BrowserWindow } = require('electron');const path = require('path');const url = require('url');// 创建浏览器窗口let mainWindow = null;const createWindow = () => {let mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,// preload: path.join(__dirname, 'preload.js')}});/*** loadURL 分为两种情况* 1.开发环境,指向 react 的开发环境地址* 2.生产环境,指向 react build 后的 index.html*/const startUrl =process.env.NODE_ENV === 'development'? 'http://localhost:3000': path.join(__dirname, "/build/index.html");mainWindow.loadURL(startUrl);// 打开开发者工具 mainWindow.webContents.openDevTools() mainWindow.on('closed', function () { mainWindow = null;});};app.on('ready', createWindow);app.on('window-all-closed', function () {// 在 macOS 上,除非用户用 Cmd + Q 确定地退出,// 否则绝大部分应用及其菜单栏会保持**。if (process.platform !== 'darwin') app.quit();});app.on('activate', function () {// 在macOS上,当单击dock图标并且没有其他窗口打开时,// 通常在应用程序中重新创建一个窗口。if (mainWindow === null) createWindow();});

九、在package.json修改相关脚本

"scripts": {  "start": "cross-env BROWSER=none react-app-rewired start",  "build": "react-app-rewired build",  "test": "react-app-rewired test --env=jsdom",  "eject": "react-scripts eject",  "start-electron": "cross-env NODE_ENV=development electron .",  "start-electron-prod": "electron ."},

十、安装antd、babel-plugin-import、customize-cra

# 安装antdcnpm install antd# 或yarn add antd# 安装babel-plugin-importcnpm install babel-plugin-import# 或yarn add babel-plugin-import --dev# 安装customize-cracnpm install customize-cra --save-dev# 或yarn add customize-cra

十一、安装react-router-dom

# 安装react-router-domcnpm install react-router-dom --save-dev# 安装@types/react-router-domcnpm install @types/react-router-dom

十二、在src/views下、新建read-txt.tsx

import React from 'react';import { remote } from 'electron';import fs from 'fs';interface Props {  }interface State {	txtFileData: string;}export default class ReadTxt extends React.Component<Props, State> {  constructor(props: Props) {  super(props);this.state = {  txtFileData: ''  };}/*** 弹出文件选择框,选择 .txt 文件* 将选中的 .txt 内容展示到页面*/public readTxtFileData = async () => {	const result = await remote.dialog.showOpenDialog({	title: '请选择 .txt 文件',	filters: [    {      name: 'txt',      extensions: ['txt']    }	]});fs.readFile(result.filePaths[0], 'utf-8', (err, data) => {    if (err) {      console.error(err);    } else {      this.setState({        txtFileData: data.replace(/\n|\r\n/g, '<br/>')      });    }});};public render = (): JSX.Element => {  return (    <section style={{padding:20}}>    <button onClick={this.readTxtFileData}>读取一个txt文件的内容</button>    <div dangerouslySetInnerHTML={{ __html: this.state.txtFileData }} />    <a type="link" href="/">返回到App页面</a>    </section>  );};}

13. 在根目录下,新建ROUTER.TSX,并引入当前已经有的两个页面:APP,READ-TXT

十三、在根目录下、新建router.tsx

import React from 'react';import { HashRouter, Route, Switch } from 'react-router-dom';import App from "./App";import ReadTxt from "./views/read-txt"export default class Router extends React.Component {public render = (): JSX.Element => {    return (        <HashRouter>            <Switch>              <Route exact path={'/'} component={App} />              <Route exact path={'/readTxt'} component={ReadTxt} />            </Switch>        </HashRouter>    ); }}

十四、修改src下的 index.tsx

import React from 'react';import ReactDOM from 'react-dom';import './index.css';// import App from './App';import * as serviceWorker from './serviceWorker';import Router from './router';  ReactDOM.render(    <React.StrictMode>    <Router />    </React.StrictMode>,    document.getElementById('root')  );serviceWorker.unregister();

十五、修改app.tsx

import React from 'react';import { DatePicker } from 'antd';const { MonthPicker, RangePicker, WeekPicker } = DatePicker;export default class IndexPage extends React.Component {  public onChange(date: any, dateString: any) {    console.log(date, dateString);  }  public render = (): JSX.Element => {    return (    // <Calendar onPanelChange={this.onPanelChange} />        <div style={{padding:20}}>        <DatePicker onChange={this.onChange} />        <br />        <MonthPicker onChange={this.onChange} placeholder="Select month" />        <br />        <WeekPicker onChange={this.onChange} placeholder="Select week" />        <br />        <a type="link" href="/#/readTxt">跳转到ReadTXT</a>        </div>    )  }}

十六、修改config-overrides.js

// react-app-rewired是react社区开源的一个修改CRA配置的工具,// 用于扩展Create React App的Webpack配置,// 而customize-cra提供了一组用于自定义利用react-app-rewired核心功能的Create React App v2配置,// 可以通过config-overrides.js文件来对webpack配置进行扩展  const {    override,    fixBabelImports,    addWebpackAlias  } = require('customize-cra');  const path = require("path");  module.exports = override(  //按需加载antd  fixBabelImports('import', {    libraryName: 'antd',    libraryDirectory: 'es',    style: 'css', // true是less,如果不用less style的值可以写'css'  }),  //别名配置  addWebpackAlias({    ["@"]: path.resolve(__dirname, "./src"),    ["@views"]: path.resolve(__dirname, "./src/views"),    ["@components"]: path.resolve(__dirname, "./src/components")    }),  (config) => {  // 为了方便使用 electron 以及 node.js 相关的 api  // 需要将 target 设置为 electron-renderer  // 设置了 target 之后,原生浏览器的环境将无法运行此 react 项目(因为不支持 node.js 相关的 api),会抛出 Uncaught ReferenceError: require is not defined 异常  // 需要在 electron 的环境才能运行(因为支持 node.js 相关的 api)  // 这一步的操作, 都是为了能与 electron 进行更好的集成  config.target = 'electron-renderer';    return config;  });

十七、打开两个命令行窗口,一个命令行窗口跑 react 项目:npm run start,另一个命令行窗口跑 electron 项目:npm run start-electron。注意,必须启动两个。

版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除

本文地址:http://0561fc.cn/113906.html