实现f5效果_【前端技术】如何优雅的释放F5(基于whistle的livereload)

本文介绍了whistle插件如何通过监听文件变化自动刷新页面,对比F5键的便捷性,并探讨了基于node的fs模块和WebSocket实现原理。通过实例展示如何安装、配置和使用whistle.livereload插件,提升前端开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

84acca7e93a4f6c61867684ab9fd9968.png

插件功能:用于根据指定目录文件变化自动刷新指定页面的 whistle 插件。

whistle​github.com

下文主要介绍livereload原理,直接查看插件安装和使用请看第五步

一、需求背景:

前端页面联调时,F5作为web开发常用刷新调试驱动键,已经深深刻在每个开发的心中。还在为修改页面不停的手动刷新而烦恼么?还在寻找其他F5替代方案么?如何优雅的释放F5,请看下文~。

41254c460d31adb8f44fe1038787e01d.png

二、目标拆解:

假如我们自己来开发一种替代F5的文件刷新方案,可以从三个目标来分析:

36900e6c10cad3263da87f4a42393176.png

1)文件修改监听——目标是刷新页面,但页面刷新的前提是代码的变动修改,捕捉文件修改事件成为我们优先解决的问题;

2)页面刷新——页面刷新很简单,但是如何通知到页面进行刷新呢;

3)修改通知——这个是我们需要解决的重点;

三、解决方案(whistle插件采用fs而非gulp,此处借gulp简单介绍下原理):

有了问题和目标,思考下每个问题的解决方案:

772e7b55ac6785f24bfedf939d29425c.png

1)文件修改监听——

a、gulp非常nice的自动化构建工具

官网:https://www.gulpjs.com.cn/

b、node的fs模块(livereload插件通过fs模块实现监控)

c、其他

2)页面刷新——js方法,location.reload(x);

3)修改通知——开启本地svr,浏览器长链接监听(常用的观察者模式);

基于node svr+websock服务

四、开发实战:

方案已经枚举好,接下来就是开发实践:

(一)环境准备和代码实现(代码可在附件下载):

1)项目目录下,安装需要的js模块

npm i -s gulp
npm i -s ws

2)服务端代码编写

const WebSocket = require('ws');
const port = 8080;
function startSvr() {
    console.log("start svr port:"+port);
    var wss = new WebSocket.Server({
        port: port
    });
    var connection = {};
    wss.on('connection', function(ws) {
        console.log("ws 已经连接");
        ws.on('message', function(message) {
            console.log("收到message:"+message);
            msg = JSON.parse(message);
            if (msg.type === 'test') {
                connection[msg.id] = ws;
                console.log('received: %s', JSON.stringify(msg));
                if (!!connection[msg.id]) connection[msg.id].send(JSON.stringify(msg));
            } else {
                wss.clients.forEach(function each(client) {
                    client.send(message);
                });
            }
        });
    });
}
module.exports = {
    start:startSvr
};

3)客户端监听代码编写

var ws = new WebSocket('ws://localhost:8080');
ws.onopen = function() {
    console.log('open');
};
ws.onclose = function() {
    console.log('onclose');
};
ws.onmessage = function(event) {
    console.log('event,', event.data); //拿到的返回数据
    var json = JSON.parse(event.data);
    if(json.command=="reload"){
    	location.reload(1);
    }else if(json.command=="javascript"){
    	eval(json.text);
    }else if(json.command=="replace"){
    	document.getElementsByTagName("html")[0].innerHTML = json.text;
    }
};

4)gulp监听配置文件编写(此处gulp采用4.0.2版本

const {
    series,
    parallel,
    watch,
    src,
    dest
} = require('gulp');
const WebSocket = require('ws');
const appsvr = require('./appsvr.js');
const watcher = watch(['*']);//此处监听目录下所有文件
// const fs = require('fs');
let ws = "";
//日志工具类
let showlog = function (svr) {
    var des = "";
    for (var name in svr) {
        des += name + ":" + svr[name] + ";n";
    }
    console.log(des);
};
//服务开启
function webserver() {
    appsvr.start();
    setTimeout(function () {
        ws = new WebSocket('ws://localhost:8080');
        ws.on('open', () => {
            let msg = {
                command: 'init',
                text: ""
            };
            ws.send(JSON.stringify(msg));
        });
        ws.on('error', err => {
            console.log(err);
        });
        ws.on('message', data => {
            console.log(data);
        });
        ws.on('close', (code, reason) => {
            console.log(code);
            console.log(reason + ':' + typeof reason);
        });
    }, 2000);
}
//监听文件变化
watcher.on('change', function (path, stats) {
    console.log(`File ${path} was changed`);
    //发送给监听者的动作
    let msg = {
        command: 'reload',
        text: "reload"
    };
    ws.send(JSON.stringify(msg));
});
exports.webserver = webserver;
//默认出发,相当于main函数
exports.default = parallel(function () {
    console.log("running");
}, webserver); 

5)客户端js监听文件如何嵌入页面?

a、通过script标签的方式手动嵌入,需要手动修改文件,且事后容易忘记删除;

<script type=“text/javascript” src=“./f5.js”></script>

b、基于whistle的优雅嵌入,会自动对匹配的页面(html)无感知嵌入指定js:

whistle 命令:jsAppend

daoju.qq.com/xxx/   jsAppend://daoju.qq.com/xxx/js/f5.js

6)启动服务,刷新浏览器启动监听

3f99c73f29839710d2f3b3ee615bc419.png

7)文件修改,观察效果

bc7a52445afe9a9fc3494a6d760831dc.png

(二)其他解决方案实现及问题:

其他常用方案

2254d8a69f4c28587e340567c01ee7db.png

实现和问题

  • 实现方式:通过插件生成的本地服务地址来进行自动刷新访问,比如:

访问localhost:3000,查看本地未分离文件,适合重构开发;

  • 问题:活动开发前端联调是以线上活动域名url访问来进行开发和测试,且需要配合host配置,就不太适合。

五、基于whistle的livereload插件,让刷新更优雅

通过上述实践我们释放了F5,但是打开项目目录,发现新增了一堆的js,跟我们的项目格格不入,如何更优雅的释放F5呢?

whistle插件化——目前已经开发整理成了whistle插件,地址如下:

npm地址:https://npm.taobao.org/package/whistle.livereload

1)如何安装:

注意:whistle需要升级到最新版本

npm i -g whistle.livereload

安装后:

dea52afcd1300ce4b52f2956128ad0f3.png

2)使用方案:

#pattern  whistle.livereload://需要监控的项目目录
daoju.qq.com/xxx/ whistle.livereload://D:xxx

相关文章:

whistle的使用介绍和开发:

whistle的官方文档——http://wproxy.org/whistle/rules/htmlAppend.html


腾讯技术工程来到知乎啦。本号立足于计算机以及互联网领域技术相关话题,特别是前沿领域的探索,目的是为技术爱好者提供专业、有见解的技术话题,将鹅厂最新的技术文章传递给知友,同时为研究人员提供讨论和参与的开放平台,共建技术生态圈。


腾讯技术工程未来也会邀请广大的鹅厂技术人员,作为我们的智囊团,为知友解答工作中的技术困惑,同时也请大家多多为我们仔细准备的回答点个『赞』,让我们在分享和鼓励中共同进步。有任何建议,欢迎私信我们!


更多技术干货请持续关注『腾讯技术工程』知乎号以及订阅我们的专栏『腾讯技术』。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值