如何用油猴提升前端開發(fā)效率
點擊上方?前端Q,關(guān)注公眾號
回復(fù)加群,加入前端Q技術(shù)交流群
1. 起因
時隔一年,油猴腳本系列又來了,起因是那天洗澡的時候,突然靈光一閃,想到平時在前端開發(fā)中,有很多工作完全是一些機械的,沒有什么難度的活,但是又異常的花時間!其實就是對一些表格字段。
目前為止我還在開發(fā)之前的那個百萬級ERP項目,項目中的列表非常的多,目前大概有幾百個吧,而且每個列表都有非常多的字段,通常情況下都在20個字段左右,而后端寫的時候會在對應(yīng)的接口中返回一大堆字段,你需要從返回的字段中挑選出列表中需要的字段。
可能一個兩個還好,但是幾十個幾百個列表一個字段一個字段的對起來就很耗時耗力,所以這個時候我就有一個想法:有沒有那么一種方法,將原型圖上列表字段提取出來,然后與swagger中該接口下面的字段注釋做一個對比,如果對的上,則生成Antd可以使用的表頭代碼,如果沒有對上,那么就統(tǒng)一將這些沒有對上的字段展示出來,然后用肉眼去對,如果依然沒有找到這些字段,那么就發(fā)給后端,讓后端添加上這些字段。
一想到這個可能性,馬上就想迫不及待的想要進行實現(xiàn),這時我回憶起一年前用過油猴腳本做了一些事情,那么這次這個突發(fā)奇想是否也可以用油猴腳本進行實現(xiàn)。
2. 油猴腳本
我在去年已經(jīng)寫過幾篇關(guān)于油猴腳本的文章,其中提到過通過Webpack打包,可以開發(fā)特別復(fù)雜的腳本,甚至可以開發(fā)一些工程級的腳本,同時也可以使用npm上的包。
但是由于webpack配置的復(fù)雜性,所以我首先是沒有考慮使用webpack打包工具的,而是先想到了另一個零配置打包工具:parcel。
但是很遺憾,失敗了,不知道為什么通過parcel打包后的js文件直接通過油猴引入外部資源的方法會報錯,于是這個時候我還想到了一個打包js文件的工具:Rollup。
遺憾的是,同樣失敗了,不知道為什么引入油猴后就是會報錯,于是這個時候我就放棄抵抗,選擇了webpack進行打包,結(jié)果不出意料,webpack打包后的js文件引入油猴中沒有任何問題。
因為我之前已經(jīng)這么做過了,還總結(jié)了相關(guān)的文章:強大的油猴Tampermonkey腳本開發(fā)環(huán)境搭建,所以關(guān)于油猴的基礎(chǔ)部分就不再贅述。
2.1 打包的好處
為什么要通過webpack打包?
因為在編寫一些復(fù)雜腳本時,我們往往會需要使用到非常多的庫,而且也會將腳本進行模塊化,分成非常多的文件,同時如果你還想編寫一些CSS樣式,那么你也可以直接寫CSS文件或者Less或者Sass文件,通過webpack可以將這些文件統(tǒng)一起來,打包成一個js,然后通過油猴提供的外部引入方式進行引入。
隨著我對React越發(fā)的得心應(yīng)手,要實現(xiàn)上面說的自動比對字段的功能React也是不可少的一環(huán),而我個人非常喜歡使用TypeScript,因為它會給予代碼更多的提示,讓你在寫代碼的時候不容易犯一些低級錯誤。
而使用React的時候就不得不提到Antd,Antd這個UI組件庫提供了非常多的方便的組件,不光是解決了一些樣式問題,同時它還解決了很多交互層面的東西,比如它的Form表單,也是非常好用的。
綜上所述,如果你要開發(fā)一個油猴腳本,那么通過webpack進行打包就是一個非常好的選擇。
3. jQuery
正如我年前的那篇文章所說,jQuery是一個非常值得學(xué)習(xí)的庫,因為對于編寫油猴腳本來說,沒有什么比用jQuery去提取界面上的信息更方便的了。
由于jQuery的易用性,使用jQuery你可以輕易的從界面上提取到你要的信息,雖然使用正則可以達(dá)到差不多的效果,但jQuery代碼寫起來比正則更快,也更不容易出錯。
4. 正則
編寫腳本,非常多的情況會使用到正則,因為要精確的匹配到對應(yīng)的字符,正則是你的不二之選,在做一些自動生成代碼工具的時候,因為涉及到字符匹配的問題,學(xué)會正則就顯得非常的重要。
這里就要推薦一個非常好的正則測試網(wǎng)站:RegExr: 學(xué)習(xí)、構(gòu)建和測試正則表達(dá)式Test RegEx,因為有時候你無法判斷你寫的正則對不對,所以這個時候你就可以先在這個網(wǎng)站上面測試一下,如果測試結(jié)果符合你的預(yù)期,再將正則表達(dá)式復(fù)制到你的項目中進行測試,這樣編寫起正則來就方便的多,使用方法也非常簡單,去該網(wǎng)站上面點兩下大致就能明白如何使用。
5. 爬蟲基礎(chǔ)
如果你要提取一些界面上的信息,那么你得會一些爬蟲基礎(chǔ)知識,知道怎么獲取到界面上的某些信息。
理論上一個網(wǎng)頁上面所有的信息,都能通過正則表達(dá)式進行提取,但由于正則表達(dá)式在編寫的過程中可能會比較容易出錯,這個時候jQuery就能有效的幫你提取出這些頁面數(shù)據(jù)。
這里就對爬蟲入門時90%的人都會選擇的豆瓣排行榜做一個頁面信息提取。
6. 實例
上面所想的那個腳本我其實已經(jīng)實現(xiàn)了,但礙于swagger上面有公司項目的接口信息,所以這里就不拿那個腳本作為演示。
那么這里我就拿jQuery爬取到的豆瓣排行榜信息作為演示吧:
主要實現(xiàn)的功能就是,在輸入框中輸入電影名稱,然后將電影相關(guān)的信息進行匹配并且展示出來:
6.1 觸發(fā)事件構(gòu)建
要執(zhí)行你已經(jīng)寫好的代碼,你通常可能需要一個按鈕、一個輸入框或者其它元素進行觸發(fā),在本腳本的開發(fā)中,我就使用了Antd的按鈕+Antd的模態(tài)框+Antd的輸入框這3種組件來搭建腳本。
6.2 最終效果
最終的效果像下面這樣,代碼其實并不難。這里貼上最終的代碼:
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;
/** 分?jǐn)?shù) */
score: string;
/** 評價數(shù) */
number: string;
/** 簡介 */
info: string;
}
function AppButton() {
const [infoDataList, setInfoDataList] = useState([]);
const [showData, setShowData] = useState();
const [visible, setVisible] = useState(false);
return (
<>
title="自動對字段"
visible={visible}
centered
destroyOnClose
width={1000}
onCancel={() => {
setVisible(false);
}}
>
{/* 這里是將對的字段展示出來 */}
- 電影名:{showData?.title}
- 分?jǐn)?shù):{showData?.score}
- 評價數(shù):{showData?.number}
- 簡介:{showData?.info}
>
);
}
// 添加一個div作為React的入口文件
$("body").append(``);
render(
,
document.getElementById("ccll-app")
);
復(fù)制代碼
7. webpack配置
下面是我自己搭建并且使用的一套webpack.config.js,添加了對CSS、TypeScript、Less的支持,并且還對JavaScript做了兼容性處理,可以直接將下面的代碼復(fù)制過去嘗試。
const?{?resolve?}?=?require("path");
module.exports?=?{
??entry:?["./index.js"],
??output:?{
????path:?resolve(__dirname,?"build"),
????filename:?"index.js",
????publicPath:?"/",
??},
??module:?{
????rules:?[
??????{
????????test:?/.(js|jsx|mjs)$/,
????????exclude:?/node_modules/,
????????use:?[
??????????{
????????????loader:?"babel-loader",
????????????options:?{
??????????????//?預(yù)設(shè):指示babel做怎么樣的兼容性處理。
??????????????presets:?[
????????????????[
??????????????????"@babel/preset-env",
??????????????????{
????????????????????corejs:?{
??????????????????????version:?3,
????????????????????},?//?按需加載
????????????????????useBuiltIns:?"usage",
??????????????????},
????????????????],
????????????????"@babel/preset-react",
??????????????],
????????????},
??????????},
????????],
??????},
??????{
????????test:?/.tsx?$/,
????????use:?"ts-loader",
????????exclude:?/node_modules/,
??????},
??????{
????????test:?/.css$/,
????????//?使用哪些?loader?進行處理
????????use:?[
??????????// use 數(shù)組中 loader 執(zhí)行順序:從右到左,從下到上?依次執(zhí)行
??????????//?創(chuàng)建?style?標(biāo)簽,將?js?中的樣式資源插入進行,添加到?head?中生效
??????????"style-loader",
??????????//?將?css?文件變成?commonjs?模塊加載?js?中,里面內(nèi)容是樣式字符串
??????????"css-loader",
????????],
??????},
??????{
????????test:?/.less$/,
????????//?使用哪些?loader?進行處理
????????use:?[
??????????// use 數(shù)組中 loader 執(zhí)行順序:從右到左,從下到上?依次執(zhí)行
??????????//?創(chuàng)建?style?標(biāo)簽,將?js?中的樣式資源插入進行,添加到?head?中生效
??????????"style-loader",
??????????//?將?css?文件變成?commonjs?模塊加載?js?中,里面內(nèi)容是樣式字符串
??????????"css-loader",
??????????{
????????????loader:?"less-loader",
????????????options:?{
??????????????lessOptions:?{
????????????????javascriptEnabled:?true,
??????????????},
????????????},
??????????},
????????],
??????},
????],
??},
??resolve:?{
????extensions:?[".tsx",?".ts",?".js"],
??},
??mode:?"production",
??devtool:?"source-map",
};
復(fù)制代碼
8. 最后
本篇文章沒有拿我的那個最終實現(xiàn)的腳本進行演示,而是模擬了另一個例子,主要是起到一個拋磚引玉的作用,我想表達(dá)的意思就是油猴被我們前端開發(fā)者所忽略了,其實它是一個非常好的能夠提升開發(fā)效率的工具。
從文章中可以看到,編寫一個腳本需要掌握的知識還是比較多的,尤其是jQuery和正則,當(dāng)然如果你對原生js熟悉的話,你完全可以使用原生js代碼來代替jQuery的那些代碼。
就我個人編寫油猴腳本的經(jīng)驗來講,jQuery幾乎在每個腳本中都會用到,雖然用到的東西不是特別深,主要是提取界面信息,而正則用到的也非常多。
其實這里還留下了一個問題,就是引入了React+Antd后,打包的時間往往會達(dá)到10s左右,而打包后的代碼通常會達(dá)到2M左右,下一篇文章就講如何在油猴中使用CDN引入,讓打包時間減少到1s左右,代碼體積減少到幾十kb左右。
通過這次的靈光乍現(xiàn),我想到平時在寫業(yè)務(wù)代碼時,一些重復(fù)的機械的工作都可以交給腳本去實現(xiàn),提高自己的開發(fā)效率,做一個準(zhǔn)點下班的程序員。
關(guān)于本文
作者:滄滄涼涼
https://juejin.cn/post/7075237968205578277

往期推薦



最后
歡迎加我微信,拉你進技術(shù)群,長期交流學(xué)習(xí)...
歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個專業(yè)的技術(shù)人...


