前言
    本文将介绍如何从零开始搭建electron+react+typescript+webpack环境。

    在这里,我们不使用create-react-app等脚手架。

    为什么呢?

    因为脚手架意味着重,意味着很多用不到的东西,意味着你不知道自己装了些什么东西。同时,也不利于我们学习,我们可以在开始只搭一个最基础的架子,以后用到什么东西,再往里面添加。

    初始化工程
    创建工程

    mkdir myapp && cd myapp
    初始化

    npm init
    依赖安装

    安装webpack

    npm i -D webpack@4.36.1
    安装React和Types中React的声明文件

    npm i —S react@16.8.6 react-dom@16.8.6 @types/react@16.8.23 @types/react-dom@16.8.4
    安装TypeScript,ts-loader和source-map-loader

    npm i -D typescript@3.5.3 ts-loader@6.0.4 source-map-loader@0.2.4
    ts-loader可以让Webpack使用TypeScript的标准配置文件tsconfig.json编译TypeScript代码。

    source-map-loader 允许webpack保持跨库的 source maps 数据连续性,从而保持调试的简易性。

    添加TypeScript配置文件
    我们想将TypeScript文件整合到一起 - 这包括我们写的源码和必要的声明文件。

    我们需要创建一个tsconfig.json文件,它包含了输入文件列表以及编译选项。 在工程根目录下新建文件tsconfig.json文件,添加以下内容:

    {
    “compilerOptions”: {
    “outDir”: “./dist/“,
    “sourceMap”: true,
    “noImplicitAny”: true,
    “module”: “commonjs”,
    “target”: “es5”,
    “jsx”: “react”
    },
    “include”: [
    “./src/*/
    ],
    “exclude”: [
    “node_modules”,
    “dist”
    ]
    }
    详细介绍可参考官方文档:

    https://www.tslang.cn/docs/handbook/tsconfig-json.html

    写点什么
    好了,目前为止,我们可以写点什么了。

    添加目录:

    mkdir src && cd src
    mkdir components && cd components
    在components目录下添加Hello.tsx文件,代码如下:

    import * as React from ‘react’;

    export interface Props {
    name: string;
    enthusiasmLevel?: number;
    }

    export default class Hello extends React.Component {
    render() {
    const { name, enthusiasmLevel = 1 } = this.props;

    1. if (enthusiasmLevel <= 0) {<br /> throw new Error('You could be a little more enthusiastic. :D');<br /> }
    2. return (<br /> <div className="hello"><br /> <div className="greeting"><br /> Hello {name + getExclamationMarks(enthusiasmLevel)}<br /> </div><br /> </div><br /> );<br /> }<br />}

    function getExclamationMarks(numChars: number) {
    return Array(numChars + 1).join(‘!’);
    }
    在src目录下增加index.tsx文件,代码如下:

    import as React from “react”;
    import
    as ReactDOM from “react-dom”;

    import Hello from “./components/Hello”;

    ReactDOM.render(
    ,
    document.getElementById(‘root’) as HTMLElement
    );

    增加index.html文件,用来显示我们的组件,代码如下:

    <!DOCTYPE html>








    添加Webpack配置文件
    我们在根目录下创建webpack.common.config.js文件,并添加如下内容:

    module.exports = {
    entry: “./src/index.tsx”,
    output: {
    filename: “bundle.js”,
    path: __dirname + “/dist”
    },

    devtool: “source-map”,

    resolve: {
    extensions: [“.ts”, “.tsx”, “.js”, “.json”]
    },

    module: {
    rules: [
    { test: /.tsx?$/, loader: “ts-loader” },

      { enforce: "pre", test: /\.js$/, loader: "source-map-loader" }<br />    ]<br />  },
    

    plugins: [
    ],
    };

    具体配置这里就不讲了,大家可以参考官方文档:

    https://www.webpackjs.com/concepts/

    好了,到这里React,TypeScript和Webpack已经配置好了,大家可以执行如下命令尝试一下:

    webpack —config webpack.common.config.js
    然后打开index.html就可以看到我们写的页面了。

    如果成功了,我们就继续往下看吧,接下来将介绍Electron的配置。

    添加main.tsx文件
    在根目录下添加main.tsx文件,用来初始化和配置Electron,代码如下:

    import { app, BrowserWindow, Menu, MenuItem, dialog } from’electron’;

    let mainWindow: BrowserWindow = null;
    let createWindow = function() {
    mainWindow = new BrowserWindow({
    width:800,
    height:600,
    webPreferences: {
    // nodeIntegration: true
    }
    // fullscreenable:false,
    // maximizable:false
    })
    mainWindow.webContents.openDevTools()
    mainWindow.loadFile(‘index.html’)
    mainWindow.on(‘closed’, function() {
    mainWindow = null
    })
    }
    app.on(‘ready’, createWindow)
    app.on(‘window-all-closed’, ()=>{
    if (process.platform !== ‘darwin’) {
    app.quit()
    }
    })

    app.on(‘activate’, ()=>{
    if (mainWindow === null) {
    createWindow()
    }
    })
    代码详细信息可参考官方文档:

    https://electronjs.org/docs/tutorial/first-app#electron-development-in-a-nutshell

    修改tsconfig.json配置
    将新增的main.tsx文件加入include配置中,修改完毕如下:

    {
    “compilerOptions”: {
    “outDir”: “./dist/“,
    “sourceMap”: true,
    “noImplicitAny”: true,
    “module”: “commonjs”,
    “target”: “es5”,
    “jsx”: “react”
    },
    “include”: [
    “./src/*/“,
    “main.tsx”
    ],
    “exclude”: [
    “node_modules”,
    “dist”
    ]
    }
    修改package.json配置
    1.由于main.tsx文件需要编译后才能使用,我们应该将main配置项指向编译后的目录。

    2.增加prestart配置,集成webpack指令。

    3.增加start配置,用来启动Electron。

    修改后如下:

    {
    “name”: “myapp”,
    “version”: “1.0.0”,
    “description”: “”,
    “main”: “./dist/main.js”,
    “scripts”: {
    “test”: “echo \”Error: no test specified\” && exit 1”,
    “prestart”: “webpack —config webpack.common.config.js”,
    “start”: “electron .”
    },
    “author”: “”,
    “license”: “ISC”,
    “devDependencies”: {
    “electron”: “^5.0.7”,
    “source-map-loader”: “^0.2.4”,
    “ts-loader”: “^6.0.4”,
    “typescript”: “^3.5.3”,
    “webpack”: “^4.36.1”,
    “webpack-cli”: “^3.3.6”
    },
    “dependencies”: {
    “@types/react”: “^16.8.23”,
    “@types/react-dom”: “^16.8.4”,
    “react”: “^16.8.6”,
    “react-dom”: “^16.8.6”
    }
    }

    git https://gitee.com/b_opensource/electron-app