jquery执行顺序执行-如何使用油猴提高后端开发效率

2023-08-29 0 5,983 百度已收录

1. 原因

时隔一年,油猴剧本系列又来了。 原因是那天我洗脚的时候,突然灵光一闪。 我以为在后端开发中,有很多工作是完全机械的,并不困难。 ,并且花费了异常长的时间! 它似乎是某些表的主键。

到目前为止我还在开发之前的百万级ERP项目。 项目中有很多列表。 目前大概有几百个,但是每个列表都有很多数组,通常有20个左右数组,而且前端写入的时候,会在对应的socket中返回很多数组,需要选择从返回的数组中获取列表中您需要的数组。

也许一两个还可以,但是匹配几十上百个列表,一个数组,一个数组,需要花费大量的时间和精力,所以我此时有一个意见:有没有这样的方法来列出原型图将数组提取出来,然后与swagger中socket下的数组注释进行比较。 如果正确的话,将会生成Antd可以使用的头代码。 如果不正确,那么那些不正确的数组将统一显示。 ,然后用肉眼检查。 如果还是找不到这种数组,那就发送给前端,让前端添加这种数组。

当我想到这个可能性时,我就迫不及待地想意识到这一点。 这时我想起一年前我用油猴脚本做了一些事情,那么这个突然的突发奇想是否也可以用油猴脚本来实现。

2.油猴脚本

我今年已经写了几篇关于油猴脚本的文章,其中提到通过Webpack打包,可以开发非常复杂的脚本,甚至可以开发一些工程级别的脚本,也可以使用npm上的包。

而且由于webpack配置的复杂性,我一开始并没有考虑使用webpack打包工具,而是首先想到了另一个零配置的打包工具:parcel。

不幸的是,它失败了。 不知道为什么parcel打包的js文件直接通过油猴导入外部资源会报错,所以这个时候我也想到了一个打包js文件的工具:Rollup。

不幸的是,它也失败了。 不知道为什么引入油猴后会报错,所以此时放弃了抵抗,选择了webpack进行打包。 结果正如预期的那样。 将webpack打包的js文件导入到油猴中。 任何问题。

jquery执行顺序执行-如何使用油猴提高后端开发效率

由于之前已经做过这方面的工作,所以我也总结了相关文章:为tampermonkey搭建强大的tampermonkey脚本开发环境,所以tampermonkey的基础知识就不重复了。

2.1 包装的好处

为什么要通过webpack打包?

因为在编译一些复杂的脚本时,我们往往需要用到很多的库,同时我们也会将脚本模块化,分成很多文件。 同时,如果你想编译一些CSS样式,也可以直接编写CSS文件或者Less或Sass文件。 这个文件可以通过webpack统一,打包成js,然后通过油猴提供的外部导入形式导入。

随着我对React越来越熟悉,React也是实现上面提到的手动比较数组的功能不可或缺的一部分,而且我个人非常喜欢使用TypeScript,因为它会给代码更多的提示,让你不是编写代码时很容易犯一些低级错误。

使用React就不得不提到Antd。 Antd 的 UI 组件库提供了很多方便的组件。 它不仅解决了一些样式问题,还解决了很多交互的东西,比如它的Form表单也很好用。

综上所述,如果你想开发油脂猴脚本,通过webpack打包是一个非常好的选择。

3.jQuery

jquery执行顺序执行-如何使用油猴提高后端开发效率

正如我多年前的文章中所说,jQuery是一个值得学习的库,因为对于编写油猴脚本来说,没有什么比使用jQuery提取界面信息更方便的了。

由于 jQuery 的易用性,您可以通过使用 jQuery 轻松地从界面中提取您想要的信息。 即使使用正则表达式来实现类似的效果,jQuery 代码的编写速度也比正则表达式更快,而且更不易出错。

4. 常规

在编写脚本时,很多情况下都会用到正则表达式。 由于您需要精确匹配相应的字符,因此正则表达式是您的最佳选择。 在做一些手动代码生成工具的时候,由于字符匹配的问题,学习正则变得非常重要。

这里有一个非常好的正则测试网站:RegExr:学习、构建和测试正则表达式TestRegEx,因为有时候你很难判断自己写的正则表达式是否正确,所以这时候你可以先在这个网站测试一下一看,如果测试结果符合你的预期,那么就将正则表达式复制到你的项目中进行测试,这样编译正则表达式就方便多了,使用方式也很简单。 进入网站点击两次即可了解如何使用。

5. 爬虫基础知识

如果你想提取界面上的一些信息,那么你必须有一些爬虫的基础知识,并且知道如何获取界面上的个体信息。

理论上来说,一个网页中的所有信息都可以通过正则表达式来提取出来,但是由于正则表达式在编译的过程中可能比较容易出错,这时候jQuery就可以有效的帮助你提取那些页面数据。

jquery执行顺序执行-如何使用油猴提高后端开发效率

这里有一个90%的人刚开始爬虫都会选择的豆瓣排行榜的页面信息提取。

6. 例子

虽然我已经实现了里面我想的脚本,但是由于swagger中公司项目的socket信息,这里我不会使用任何脚本作为演示。

那么这里我就以jQuery爬取的豆瓣排名信息来作为演示:

主要功能是在输入框中输入电影名称,然后匹配并显示电影相关信息:

6.1 触发风暴建立

要执行你已经编写的代码,通常需要一个按钮、一个输入框或其他元素来触发。 在这个脚本的开发中,我使用了Antd的按钮+Antd的模态框+Antd的输入框这三个组件来构建脚本。

6.2 最终疗效

jquery执行顺序执行-如何使用油猴提高后端开发效率

最终效果如下,代码看起来并不难。 将最终代码粘贴到此处:

import { Button, ConfigProvider, Form, Modal } from "antd";
import "antd/dist/antd.css";
import TextArea from "antd/es/input/TextArea";
import zhCN from "antd/lib/locale/zh_CN";
import * as $ from "jquery";
import { useState } from "react";
import { render } from "react-dom";

interface InfoDataList {
  /** 电影的名称 */
  title: string;
  /** 分数 */
  score: string;
  /** 评价数 */
  number: string;
  /** 简介 */
  info: string;
}

function AppButton() {
  const [infoDataList, setInfoDataList] = useState([]);

  const [showData, setShowData] = useState();

  const [visible, setVisible] = useState(false);

  return (
    
      <Button
        onClick={() => {
          /** 整理后的信息 */
          const info: InfoDataList[] = [];

          // 这里是提取界面信息
          $(".info").each(function (this) {
            const infoItem: InfoDataList = {} as InfoDataList;
            // 这里是所有的信息,下面组件提取各种信息
            $(this)
              .find(".title")
              .each(function (this, index) {
                // 只取第一个电影名字
                if (index === 0) infoItem.title = this.innerHTML;
              });

            // 取分数
            $(this)
              .find(".rating_num")
              .each(function (this) {
                infoItem.score = this.innerHTML;
              });

            // 评价数
            $(this)
              .find(".star > span:nth-child(4)")
              .each(function (this) {
                infoItem.number = this.innerHTML;
              });

            // 取信息
            $(this)
              .find(".inq")
              .each(function (this) {
                infoItem.info = this.innerHTML;
              });

            info.push(infoItem);
          });

          setInfoDataList(info);
          // 打开弹窗
          setVisible(true);
        }}
        style={{ position: "fixed", right: "100px", bottom: "100px" }}
      >
        点我
      
      <Modal
        title="自动对字段"
        visible={visible}
        centered
        destroyOnClose
        width={1000}
        onCancel={() => {
          setVisible(false);
        }}
      >
        <Form
          preserve={false}
          onValuesChange={async (value) => {
            // 如果没有值,则不匹配
            if (!value.text) {
              setShowData(undefined);
              return;
            }
            const rgx = RegExp(value.text);

            const data = infoDataList.find((item) => rgx.test(item.title));
            setShowData(data);
          }}
        >
          <Form.Item name="text">