前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Electron开发时热加载

Electron开发时热加载

作者头像
码客说
发布2021-09-22 11:11:44
2.8K0
发布2021-09-22 11:11:44
举报
文章被收录于专栏:码客码客

electron-reloader

代码语言:javascript
复制
npm install electron-reloader --save-dev

添加下面代码到main.js的最下面

代码语言:javascript
复制
const {app} = require("electron");
const isDevelopment = !app.isPackaged;
if (isDevelopment) {
  try {
    require('electron-reloader')(module);
  } catch (err) {
  }
}

electron-reload(推荐)

添加依赖

代码语言:javascript
复制
npm install electron-reload --save-dev

添加下面代码到main.js的最下面

代码语言:javascript
复制
const {app} = require("electron");
const isDevelopment = !app.isPackaged;
if (isDevelopment) {
    require('electron-reload')(path.join(__dirname, "build"));
}

这个插件跟上面的区别在于我们可以指定自动刷新所监听的文件夹

gulp+electron-connect

gulp官方文档:https://www.gulpjs.com.cn/docs/getting-started/quick-start/

添加依赖及配置

安装模块

代码语言:javascript
复制
npm install gulp --save-dev
npm install electron-connect -save-dev

项目根目录添加gulpfile.js文件

代码语言:javascript
复制
const gulp = require('gulp');
const electron = require('electron-connect').server.create();

gulp.task('watch:electron', function () {
    electron.start();
    gulp.watch(['./src/**/*.{js,vue}'], function (done){
        const exec = require('child_process').exec;
        const cmdStr = 'npm run webpack';
        exec(cmdStr, (err, stdout, stderr) => {
            if (err){
                console.log(err);
                console.warn(new Date(),'Webpack命令执行失败');
            } else {
                console.log(stdout);
                console.warn(new Date(),'Webpack命令执行成功');
            }
            done();
        });
    });
    gulp.watch(['./main.js'], function (done){
        electron.restart();
        done();
    });
    gulp.watch(['./build/**/*.{js,css}', './v_login.html'], function (done){
        electron.reload();
        done();
    });
});

添加启动项

修改package.json文件

在文件中添加脚本命令

代码语言:javascript
复制
"scripts": {
    "hot": ".\\node_modules\\.bin\\gulp watch:electron",
},

添加客户端(注意二选一)

客户端可以在主进程或渲染进程中添加,但是注意不要同时在主进程和渲染进程添加。

如果在主进程添加

代码语言:javascript
复制
const isDevelopment = !app.isPackaged;
if (isDevelopment) {
    const net = require('net');
    const sock = new net.Socket();
    sock.setTimeout(200);
    sock.on('connect', () => {
        console.log("connect");
        sock.destroy();
        require('electron-connect').client.create(win);
    }).on('timeout', (e) => {
        console.log("timeout");
    }).on('error', (e) => {
        console.log("error");
    }).connect(30080, "127.0.0.1");
}

为什么要判断端口通不通呢?

这个组件的是通过websocket建立服务端和客户端的连接的,但是它没有监听error事件,如果我们不开启服务端,只是单纯的运行项目,不好意思它就连不上服务端就报错了!

如果在渲染进程中添加

代码语言:javascript
复制
<script>require('electron-connect').client.create()</script>

官方是这么说的

Do you want to use this tool for only develop environment ? You can remove the <script> block in your gulpfile using gulp-useref. 所以推荐在主进程中添加,判断时候是开发环境来实现是否调用创建客户端的代码。

运行

使用npm run hot即可运行项目

代码语言:javascript
复制
npm run hot

经测试

修改主进程文件,会自动重启窗体; 修改HTML/CSS文件,会自动刷新页面;

gulp+electron-reload(推荐)

相比直接使用electron-reload,这个增加了监听源代码变化自动webpack的功能。

安装依赖

代码语言:javascript
复制
npm install gulp --save-dev
npm install electron-reload --save-dev

添加下面代码到main.js的最下面

代码语言:javascript
复制
const {app} = require("electron");
const isDevelopment = !app.isPackaged;
if (isDevelopment) {
    require('electron-reload')(path.join(__dirname, "build"));
}

项目根目录添加gulpfile.js文件

代码语言:javascript
复制
const gulp = require('gulp');

gulp.task('watch:electron', function () {
    gulp.watch(['./src/**/*.{js,vue}'], function (done){
        const exec = require('child_process').exec;
        const cmdStr = 'npm run webpack';
        exec(cmdStr, (err, stdout, stderr) => {
            if (err){
                console.log(err);
                console.warn(new Date(),'Webpack命令执行失败');
            } else {
                console.log(stdout);
                console.warn(new Date(),'Webpack命令执行成功');
            }
            done();
        });
    });
});

修改package.json文件

在文件中添加脚本命令

代码语言:javascript
复制
"scripts": {
    "start": "webpack --mode development && cross-env ELECTRON_DISABLE_SECURITY_WARNINGS=true electron .",
    "hot": ".\\node_modules\\.bin\\gulp watch:electron",
},

运行项目

代码语言:javascript
复制
npm run start
npm run hot

我们分别运行项目的启动和自动webpack的脚本

这样的好处

需要热加载的时候我们再启动npm run hot 不同逐个添加要更新的窗口

当然我们也可以在gulp中启动electron,可以使用electron-connect或自己实现

自己实现的效果不是特别好,比如显示的log会在弹出的命令框中,停止项目,窗口依旧不会关闭,所以还是推荐使用electron-connect

启动Electron的示例代码:

代码语言:javascript
复制
function start_electron() {
    if (process.platform.match(/^win.*/)) {
        const cmd = `start cmd /c electron "${__dirname}/main.js"`;
        child_process.exec(cmd);
    } else if (process.platform.match(/^linux.*/)) {
        const cmd = `bash -c 'electron "${__dirname}/main.js"'`;
        child_process.exec(cmd); // Linux可以使用"pkill -ef electron"命令
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • electron-reloader
  • electron-reload(推荐)
  • gulp+electron-connect
  • gulp+electron-reload(推荐)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档