# 前言

最近一个月一直在用 hugo 写博客,体验很不错,响应快,bug 少。昨天把 hugo 的源码也下下来了,准备研究下,以后估计就重度使用它了。

# 发现

在服务器上修改一篇博客时,惊奇地发现,浏览器上博客页面会自动刷新,而且它的刷新并不是重新加载整个页面,也就是说它刷新的同时还能保证页面停留在当前阅读的位置。

# 疑惑

服务器上修改,页面就会刷新,这到底是怎么实现的呢?难道浏览器和服务器一直保持着连接?不对啊,博客网页标签已经被挤到浏览器的角落了,要是浏览器的每个页面都和服务器保持着连接,这个开销也太大了吧!但是,要不是保持着连接,打开页面不动,过了那么久了,服务器改动一下,浏览器中博客页面也能自动刷新,这是怎么实现的呢?

# 讨论

今天上午把我这个疑问跟我同事分享了一下,结果被否定了。同事的意思是,浏览器也可以通过不断地向服务器发送请求来判断页面是否需要更新,或者使用 websocket 。总之我的所有页面都保持连接的说法是不太可能的,不然就不需要 http 长连接或者 websocket 这些技术了。我想也是。

# 探寻

带着疑惑下班回到家,想看一下这到底是怎么回事。

查看网页源码,看看有哪些 js (心中确实比较怀疑是不是 js 脚本定时请求)。jquery.min.js,通用库,跳过;拉到最后,也没看到几个js。全局搜索下js。慢着,这是什么<script src="/livereload.js?port=8088&mindelay=10&v=2" data-no-instant defer></script>livereload.js,看着就不是什么好东西,有点自动加载的意思。点开看看内容

!function(){return function e(t,o,n){function r(s,c){if(!o[s]){if(!t[s]){var a="function"==typeof require&&require;if(!c&&a)return a(s,!0);if(i)return i(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var h=o[s]={exports:{}};t[s][0].call(h.exports,function(e){return r(t[s][1][e]||e)},h,h.exports,e,t,o,n)}return o[s].exports}for(var i="function"==typeof require&&require,s=0;s<n.length;s++)r(n[s]);return r}}()({1:[function(e,t,o){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],2:[function(e,t,o){var n=e("./_wks")("unscopables"),r=Array.prototype;null==r[n]&&e("./_hide")(r,n,{}),t.exports=function(e){r[n][e]=!0}},{"./_hide":17,"./_wks":45}],3:
......

算了,直接搜它是干啥的吧。

# 浮出水面

搜索时映入眼帘的第一句话就是:

livereload 是一个 web 开发辅助工具,当我们修改完 html、css 和 js 的时候会自动刷新浏览器,不需要再 F5 了。这样在双屏切图、写js代码的时候会提高很多效率;

这不正是我想要的答案吗!

# 深入了解

什么是 livereload?

  • livereload 是基于 html5 的 websocket 实现的;
  • livereload 在访问的 web 页面中插入一段 socket 套接字代码(js编写),这段代码与 livereload 服务器端 socket 建立链接;并等待与执行类似 “reload css/styles.css” 的指令。

如何插入socket套接字代码?下面列出了三种方式,在 web 页面中插入必要的 socket 套接字代码:

  • 通过浏览器插件
  • 通过服务器中间件(服务器中间件向返回的页面中插入一段js脚本)
  • 手动在页面中 <script src=""></script> 引入

什么是 livereload.js?

  • 一个js库
  • 实现了 livereload 协议的客户端
  • 它从 livereload 服务器获取更改通知并刷新页面

功能总结

  • 实时 CSS 重新加载
  • 整页重新加载
  • 使用 websocket 协议
  • CSS @import 支持
  • 实时图像重新加载
  • 实时 LESS.js 重新加载

# 铁证如山

服务器查看 web 服务器当前连接情况,确实看到有一个客户端一直和服务器保持着连接

[centli@VM_0_14_centos post]$ netstat -natp | grep 8088
tcp6       0      0 :::8088                 :::*                    LISTEN      -
tcp6       0      0 172.16.0.14:8088        180.114.236.97:55897    ESTABLISHED -

PC 客户端查看,也确实存在一条与服务器保持着的连接

C:\Users\Li_Yo>netstat -ano | findstr 8088TCP    192.168.2.195:55897    211.159.189.50:8088    ESTABLISHED     3820

而且,这条连接自从我打开浏览器访问博客后就从来没断开过,至少已经保持连接两小时了。

由此可以证明浏览器和客户端之间确实保持着 TCP 连接(websocket 技术)。

参考链接:

https://www.jianshu.com/p/42ca2ab73fbc

https://www.kutu66.com/GitHub/article_73969

livereload浏览器自动刷新相关推荐

  1. HTML运行到浏览器自动刷新,web前端开发之热加载—liveReload(浏览器自动刷新)...

    今天主要写一下,如何配置,保存前端代码后,浏览器自动刷新的功能,双屏操作,真的会方便很多,对于前端开发来说,一边写样式,一边看效果,爽翻~ 图片发自简书App 一.开发环境 1.电脑系统:mac 2. ...

  2. 结合 live-reload 实现自动刷新

    结合 live-reload 实现自动刷新 前端工程师日常开发最频繁(实际上最浪费时间)的操作是什么?可能你已经想到了,就是刷新页面,要让变更生效,需要重新加载,刷新页面的操作就变成了重复低效的操作. ...

  3. gulp4.0浏览器自动刷新

    环境版本: node版本:v12.2.0 npm版本:6.9.0 gulp版本: 4.0.2(node的12.0以上版本需要gulp4.0以上版本,不然会有许多不兼容问题) gulp-cli : 2. ...

  4. 修改文件后浏览器自动刷新解决方案

    为什么要找这样的一个方法? 工作场景中发现的需求,都要找办法去解决. 我们在双屏开发的时候,经常是在Mac屏幕上写代码,然后在扩展屏幕上放着浏览器. 一般写几行代码,就会去刷新一下浏览器,看看代码运行 ...

  5. gulp-connect浏览器自动刷新

    LiveReload可以理解成即时刷新,在前端开发中,在编写或调试html/js/css代码后需要从编辑器切换到浏览器,再刷新浏览器才能看到页面变化,这种频繁的操作在一定程度上影响了工作效率,而Liv ...

  6. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  7. webpack配置---设置快捷打包和浏览器自动刷新

    1.设置快捷打包 找到package.json中scripts 之后再输入命令npm run build 2.设置浏览器自动刷新 要先安装html-webpack-plugin这个插件再配置 3.将c ...

  8. Safari浏览器自动刷新页面插件Auto Refresh

    Safari浏览器自动刷新页面插件Auto Refresh  https://extensions.apple.com/details/?id=com.agriffindesign.autorefre ...

  9. 十行代码实现浏览器自动刷新

    需求:实现一个程序,让浏览器每秒钟自动刷新一次,并显示当前的时间戳 核心思路: 通过HTTP响应报头中的Refresh字段,可以控制浏览器自动刷新的时机 通过 Date类的getTime方法可以获取到 ...

  10. 360浏览器自动刷新选项设置方法

    360浏览器自动刷新选项设置方法 360浏览器不安装插件自动刷新怎么设置?我们使用浏览器在游览器贴吧的时候,经常会不同的按"Ctrl+R"或者是"F5"来刷新页 ...

最新文章

  1. python与excel表格-Python操作 Excel表格
  2. trace--求矩阵的迹
  3. 【Linux 报错】com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The las
  4. go语言定义二维数组
  5. IntelliJ IDEA License Server 本地搭建教程
  6. C#中HashTable、Dictionary、ConcurrentDictionary区别
  7. Machine Learning学习计划
  8. Jmeter 获取、读取token 供其他 HTTP 请求调用
  9. 《中国人工智能学会通讯》——6.7 实体链接任务及系统
  10. clion stfp 配置
  11. android 焦点动画,在一个视图/imageview上获得焦点时,实现android缩放动画?_animation_开发99编程知识库...
  12. Java:接口文档示例
  13. win7快捷方式去箭头_学会WIN+R,你的桌面再不需要快捷方式!
  14. Android 高效安全加载图片
  15. 《论韩愈 》——陈寅恪
  16. 老化测试Gsensor失败分析
  17. HTML系列之文本格式化标签
  18. 数组可以存放实数吗?
  19. 从苹果ATT新政第一年,看全球数据主权之争与治理规则的变迁
  20. Ktor2.0很多新特性,我们一年前就想到了,并已落实在项目中

热门文章

  1. Taro 周报 #7: 收获「e代驾」案例,发布 v2.2.16 和 v3.2.0-canary.2
  2. 怎么用计算机按键弹歌谱,键盘钢琴及谱子(弹钢琴练打字一举两得)
  3. 如何用O2OA公文编辑器制作标准的红头文件?
  4. Windows历史版本
  5. 数据库中常见mdf 、ndf 、ldf 、文件
  6. 两个很棒的爬虫智能解析库,通配大部分网页!
  7. 【建站指南】网站搭建需要准备什么?
  8. Django报错异常django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without
  9. matlab匹配滤波器的仿真
  10. 用按键精灵2014怎么开发后台自动喊话的游戏脚本