两个相见恨晚的 Chrome devtool 开发技巧(一)(2)

简介: 这时,我们再去元素审查,修改样式代码, 发现样式改了, 浏览器文件系统中的样式代码改了, 编辑器中的样式代码也改了, 我们的需求到现在基本完成了, 但是如果再次修改,我们会发现右下角的文件系统里的样式文件出现了问号,说明现在是socket不通的状态, 并且编辑器中的代码是没有再次进行更改的。 其实这个问题是浏览器本身不支持这样多次更改, 产生 css 缓存后, 就不再进行热更新了, 禁掉缓存后也没有用, 但是我们尝试每次修改后, 强制刷新页面,在进行修改,发现是可以保证每次修改都生效的。

这时,我们再去元素审查,修改样式代码, 发现样式改了, 浏览器文件系统中的样式代码改了, 编辑器中的样式代码也改了, 我们的需求到现在基本完成了, 但是如果再次修改,我们会发现右下角的文件系统里的样式文件出现了问号,说明现在是socket不通的状态, 并且编辑器中的代码是没有再次进行更改的。 其实这个问题是浏览器本身不支持这样多次更改, 产生 css 缓存后, 就不再进行热更新了, 禁掉缓存后也没有用, 但是我们尝试每次修改后, 强制刷新页面,在进行修改,发现是可以保证每次修改都生效的。

但是这样还要每次手动刷新还是不方便, 那么怎么解决这个问题呢, 其实只需要在每次热更新后, 我们调用一下浏览器的强制刷新即可, 我们在元素审查html文件中查看,会发现浏览器偷偷给我们添加了一段脚本。

屏幕截图 2023-07-05 223253.png

我们把这段脚本拿下来看

// <![CDATA[  <-- For SVG support
if ("WebSocket" in window) {
  (function () {
    function refreshCSS() {
      var sheets = [].slice.call(document.getElementsByTagName("link"));
      var head = document.getElementsByTagName("head")[0];
      for (var i = 0; i < sheets.length; ++i) {
        var elem = sheets[i];
        var parent = elem.parentElement || head;
        parent.removeChild(elem);
        var rel = elem.rel;
        if (
          (elem.href && typeof rel != "string") ||
          rel.length == 0 ||
          rel.toLowerCase() == "stylesheet"
        ) {
          var url = elem.href.replace(/(&|\?)_cacheOverride=\d+/, "");
          elem.href =
            url +
            (url.indexOf("?") >= 0 ? "&" : "?") +
            "_cacheOverride=" +
            new Date().valueOf();
        }
        parent.appendChild(elem);
      }
    }
    var protocol =
      window.location.protocol === "http:" ? "ws://" : "wss://";
    var address =
      protocol + window.location.host + window.location.pathname + "/ws";
    var socket = new WebSocket(address);
    socket.onmessage = function (msg) {
      if (msg.data == "reload") window.location.reload();
      else if (msg.data == "refreshcss") refreshCSS();
    };
    if (
      sessionStorage &&
      !sessionStorage.getItem("IsThisFirstTime_Log_From_LiveServer")
    ) {
      console.log("Live reload enabled.");
      sessionStorage.setItem("IsThisFirstTime_Log_From_LiveServer", true);
    }
  })();
} else {
  console.error(
    "Upgrade your browser. This Browser is NOT supported WebSocket for Live-Reloading."
  );
}
// ]]>

从这段脚本中,就可以大致知道浏览器的元素样式修改后, 为什么加载到最新的修改样式后的代码, 其实就是浏览器修改元素样式后,会发出socket消息, 我们在脚本中就能监听到样式更改的消息, 然后把样式文件饮用的地址后面修改一下时间戳防止缓存, 重新发送样式文件请求,获取最新样式代码, 那么我们既然找到了这个更新时机,那么其实只需要在更新是,增加一个刷新浏览器的操作即可

代码片段如下

//...
 socket.onmessage = function (msg) {
      if (msg.data == "reload") window.location.reload();
      else if (msg.data == "refreshcss") {
        refreshCSS();
        setTimeout(() => {
          window.location.reload();
        }, 500);
      }
    };
//...

屏幕截图 2023-07-05 223450.png

这时我们就完整的完成了从 审查元素 > 修改样式 > 代码更改成功 的完整链路, 也大体理清了,浏览器的webwork功能。

3、总结

我们经常用浏览器的源代码面板, 但是文件系统一直在旁边,从来没看关注过, 当我们使用起来才发现,原来chrome是支持代码编辑器功能的,进而我们想到了,能不能直接通过样式审查修改样式的时候,实时更新本地的样式代码,不用再像之前调好后复制在通过类找到代码,在修改保存,再回来刷新检查生没生效。 我们发现是可行的, 我们在启动静态服务时,浏览器会通过socket消息与我们本地的代码进行通讯, 会监听到样式更改后,通过refashCSS修改我们html 中 head 里的样式文件的引用,增加时间戳,防止缓存, 但是不支持多次修改,更新, 我们通过修改浏览器注入的脚本,增加了reload ,达到了最终的。无限修改样式也可以同步更新到本地代码。

4、完整代码

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <link rel="stylesheet" href="./index.css" />
  <body>
    <div class="box">hello world</div>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
    </ul>
  </body>
  <script>
    // <![CDATA[  <-- For SVG support
    if ("WebSocket" in window) {
      (function () {
        function refreshCSS() {
          var sheets = [].slice.call(document.getElementsByTagName("link"));
          var head = document.getElementsByTagName("head")[0];
          for (var i = 0; i < sheets.length; ++i) {
            var elem = sheets[i];
            var parent = elem.parentElement || head;
            parent.removeChild(elem);
            var rel = elem.rel;
            if (
              (elem.href && typeof rel != "string") ||
              rel.length == 0 ||
              rel.toLowerCase() == "stylesheet"
            ) {
              var url = elem.href.replace(/(&|\?)_cacheOverride=\d+/, "");
              elem.href =
                url +
                (url.indexOf("?") >= 0 ? "&" : "?") +
                "_cacheOverride=" +
                new Date().valueOf();
            }
            parent.appendChild(elem);
          }
        }
        var protocol =
          window.location.protocol === "http:" ? "ws://" : "wss://";
        var address =
          protocol + window.location.host + window.location.pathname + "/ws";
        var socket = new WebSocket(address);
        socket.onmessage = function (msg) {
          if (msg.data == "reload") window.location.reload();
          else if (msg.data == "refreshcss") {
            refreshCSS();
            setTimeout(() => {
              window.location.reload();
            }, 500);
          }
        };
        if (
          sessionStorage &&
          !sessionStorage.getItem("IsThisFirstTime_Log_From_LiveServer")
        ) {
          console.log("Live reload enabled.");
          sessionStorage.setItem("IsThisFirstTime_Log_From_LiveServer", true);
        }
      })();
    } else {
      console.error(
        "Upgrade your browser. This Browser is NOT supported WebSocket for Live-Reloading."
      );
    }
    // ]]>
  </script>
</html>

index.css

.box {
    width: 300px;
    height: 400px;
    background-color: #5826ea;
    color: #a73751;
    font-size: 30px;
  }
  ul li {
    color: #ff0090;
    font-size: 20px;
  }

相关文章
|
6月前
|
Web App开发 JavaScript 前端开发
使用vue快速开发一个带弹窗的Chrome插件
使用vue快速开发一个带弹窗的Chrome插件
236 0
使用vue快速开发一个带弹窗的Chrome插件
|
6月前
|
Web App开发 JavaScript 前端开发
chrome调试秘籍,让你的开发速度飞起来
chrome调试秘籍,让你的开发速度飞起来
|
19天前
|
Web App开发 Windows
win 快捷键大全,虚拟窗口、桌面等操作细节,可以使界面整洁,分类工作;Chrome快捷键,都是一些开发的骚操作
这篇文章提供了Windows操作系统和Chrome浏览器的快捷键大全,以及Xshell的快捷键操作,旨在帮助用户提高工作效率和界面管理。
86 2
|
18天前
|
Web App开发 JSON JavaScript
vue学习:chrome 中 vuetools 开发插件 的下载、安装
这篇文章介绍了如何在Chrome浏览器中下载、安装并测试Vue.js开发插件——vue-devtools。
112 0
vue学习:chrome 中 vuetools 开发插件 的下载、安装
|
3月前
|
Web App开发 存储 前端开发
《Chrome谷歌插件Top10》开发最好用的谷歌插件
本文介绍了多个实用的浏览器插件及其安装方法。包括CSDN浏览器助手,提供高效开发工具;FeHelper,前端必备工具,支持格式化、压缩等功能;uBlock Origin,有效屏蔽广告和弹窗;PageLiner,网页标尺工具,便于前端设计;Fatkun,批量下载图片;Smallpdf,文件转换工具;Octotree,GitHub代码树插件;Awesome Screenshot,截图与录屏工具;ColorZilla,颜色拾取器;Dark Reader,暗黑模式阅读插件。安装方式有通过Chrome商店搜索或下载crx插件本地安装。
62 11
|
3月前
|
Web App开发 JSON 安全
【跨域难题终结者】:一键解锁Chrome浏览器神秘设置,彻底告别开发阶段的跨域烦恼!
【8月更文挑战第20天】跨域是前端开发常遇难题,尤其在前后端分离项目中。浏览器因安全考量会阻止不同源间的请求。本文对比CORS、JSONP、代理服务器等解法,并介绍开发阶段通过调整Chrome设置来临时禁用跨域限制的方法,提供启动Chrome及使用`fetch`API示例,适合快速测试。但请注意这不适用于生产环境,存在一定安全风险。
590 1
|
3月前
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
290 8
|
4月前
|
Web App开发 前端开发 Java
通过设置 Chrome 解决开发调用跨域问题
通过设置 Chrome 解决开发调用跨域问题
1111 7
|
Web App开发 存储 前端开发
使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码
使用 Chrome 开发者工具研究一个基于 Angular 开发的网站源代码
|
5月前
|
存储 Web App开发 JSON
【Chrome插件】如何在Chrome插件开发中处理复杂数据结构的存储?
在Chrome插件开发中,遇到问题:存储包含Map和数组的复杂数据结构到`chrome.storage.local`时,读取为空。原因在于`chrome.storage.local`只支持JSON序列化,而Map无法直接序列化。解决方案是使用`serializeMap`和`deserializeMap`方法将Map转换为数组进行存储和读取。更新的`saveMindData`和`getMindData`方法实现了数据的正确序列化和反序列化。
116 5