自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

終于有人對 jQuery下手了,一鍵移除項目對它的依賴

開發(fā) 前端
最近新發(fā)現(xiàn)了一個有意思的工具,僅上線2周,就有 600+ 的Star,它說能幫助你的項目脫離對jquery的依賴,感覺是個不錯的想法,一起來看看吧~

 [[424009]]

大家好,我是 零一 。雖然現(xiàn)在很多前端項目都在用Vue、React,但依賴jquery的項目也不少,尤其是年代比較久遠的項目,那些還正在維護jquery項目的你,是否想將jquery從你的項目中移除?畢竟這個庫那么大,你能用到的代碼也就只有15%~30%,而且jquery對各個瀏覽器的兼容性也做了很大的處理(代碼量up up),但其實很多老項目也不會去考慮兼容很邊緣的瀏覽器了,所以其實jquery中兼容處理的代碼也沒太大必要

最近新發(fā)現(xiàn)了一個有意思的工具,僅上線2周,就有 600+ 的Star,它說能幫助你的項目脫離對jquery的依賴,感覺是個不錯的想法,一起來看看吧~

使用方式

這個工具的名字叫 replace-jquery ,據(jù)說是能幫你從項目中自動查找所有用到的jquery方法,并生成一套原生js的方法去替代

先來搞一個極簡的jquery項目

index.html

 

 

 

main.js

 

 


 

測試一下頁面的功能,是OK的

接下來我們用 replace-jquery 工具試著移除一下 main.js 中的jquery代碼

先全局下載一下

  1. npm install -g replace-jquery 

然后在項目目錄使用,語法為 replace-jquery 目標(biāo)js文件 生成的js文件

  1. replace-jquery main.js newMain.js 

該工具會自動找到你文件中所有用到的jquery方法。此處有一個確認(rèn)的步驟,你可以選擇想要替換哪些方法(默認(rèn)是全選的)

 

 

生成過程

 

按回車鍵即可完成替換,并生成新的文件

  1. export class Utils { 
  2.     constructor(selector) { 
  3.         this.elements = Utils.getSelector(selector); 
  4.         this.element = this.get(0); 
  5.         return this
  6.     } 
  7.  
  8.     on(events, listener) { 
  9.         events.split(' ').forEach((eventName) => { 
  10.             this.each((el) => { 
  11.                 const tNEventName = Utils.setEventName(el, eventName); 
  12.                 if (!Array.isArray(Utils.eventListeners[tNEventName])) { 
  13.                     Utils.eventListeners[tNEventName] = []; 
  14.                 } 
  15.                 Utils.eventListeners[tNEventName].push(listener); 
  16.  
  17.                 // https://github.com/microsoft/TypeScript/issues/28357 
  18.                 if (el) { 
  19.                     el.addEventListener(eventName.split('.')[0], listener); 
  20.                 } 
  21.             }); 
  22.         }); 
  23.  
  24.         return this
  25.     } 
  26.     remove() { 
  27.         this.each((el) => { 
  28.             el.parentNode.removeChild(el); 
  29.         }); 
  30.         return this
  31.     } 
  32.     css(css, value) { 
  33.         if (value !== undefined) { 
  34.             this.each((el) => { 
  35.                 Utils.setCss(el, css, value); 
  36.             }); 
  37.             return this
  38.         } 
  39.         if (typeof css === 'object') { 
  40.             for (const property in css) { 
  41.                 if (Object.prototype.hasOwnProperty.call(css, property)) { 
  42.                     this.each((el) => { 
  43.                         Utils.setCss(el, property, css[property]); 
  44.                     }); 
  45.                 } 
  46.             } 
  47.             return this
  48.         } 
  49.         const cssProp = Utils.camelCase(css); 
  50.         const property = Utils.styleSupport(cssProp); 
  51.         return getComputedStyle(this.element)[property]; 
  52.     } 
  53.     static getSelector(selector, context) { 
  54.         if (selector && typeof selector !== 'string') { 
  55.             if (selector.length !== undefined) { 
  56.                 return selector; 
  57.             } 
  58.             return [selector]; 
  59.         } 
  60.         context = context || document; 
  61.  
  62.         // For performance reasons, use getElementById 
  63.         // eslint-disable-next-line no-control-regex 
  64.         const idRegex = /^#(?:[\w-]|\\.|[^\x00-\xa0])*$/; 
  65.         if (idRegex.test(selector)) { 
  66.             const el = document.getElementById(selector.substring(1)); 
  67.             return el ? [el] : []; 
  68.         } 
  69.         return [].slice.call(context.querySelectorAll(selector) || []); 
  70.     } 
  71.     get(index) { 
  72.         if (index !== undefined) { 
  73.             return this.elements[index]; 
  74.         } 
  75.         return this.elements; 
  76.     } 
  77.     each(func) { 
  78.         if (!this.elements.length) { 
  79.             return this
  80.         } 
  81.         this.elements.forEach((el, index) => { 
  82.             func.call(el, el, index); 
  83.         }); 
  84.         return this
  85.     } 
  86.     static setEventName(el, eventName) { 
  87.         // Need to verify https://stackoverflow.com/questions/1915341/whats-wrong-with-adding-properties-to-dom-element-objects 
  88.         const elementUUId = el.eventEmitterUUID; 
  89.         const uuid = elementUUId || Utils.generateUUID(); 
  90.         // eslint-disable-next-line no-param-reassign 
  91.         el.eventEmitterUUID = uuid; 
  92.         return Utils.getEventName(eventName, uuid); 
  93.     } 
  94.     static setCss(el, prop, value) { 
  95.         // prettier-ignore 
  96.         let cssProperty = Utils.camelCase(prop); 
  97.         cssProperty = Utils.styleSupport(cssProperty); 
  98.         el.style[cssProperty] = value; 
  99.     } 
  100.     static camelCase(text) { 
  101.         return text.replace(/-([a-z])/gi, (s, group1) => group1.toUpperCase()); 
  102.     } 
  103.     static styleSupport(prop) { 
  104.         let vendorProp; 
  105.         let supportedProp; 
  106.         const capProp = prop.charAt(0).toUpperCase() + prop.slice(1); 
  107.         const prefixes = ['Moz''Webkit''O''ms']; 
  108.         let div = document.createElement('div'); 
  109.  
  110.         if (prop in div.style) { 
  111.             supportedProp = prop; 
  112.         } else { 
  113.             for (let i = 0; i < prefixes.length; i++) { 
  114.                 vendorProp = prefixes[i] + capProp; 
  115.                 if (vendorProp in div.style) { 
  116.                     supportedProp = vendorProp; 
  117.                     break
  118.                 } 
  119.             } 
  120.         } 
  121.  
  122.         div = null
  123.         return supportedProp; 
  124.     } 
  125.     static generateUUID() { 
  126.         return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { 
  127.             // eslint-disable-next-line no-bitwise 
  128.             const r = (Math.random() * 16) | 0
  129.             // eslint-disable-next-line no-bitwise 
  130.             const v = c === 'x' ? r : (r & 0x3) | 0x8
  131.             return v.toString(16); 
  132.         }); 
  133.     } 
  134.     static getEventName(eventName, uuid) { 
  135.         return `${eventName}__EVENT_EMITTER__${uuid}`; 
  136.     } 
  137.  
  138. Utils.eventListeners = {}; 
  139.  
  140. export default function $utils(selector) { 
  141.     return new Utils(selector); 

簡單看了一下,似乎就是把我們用到的jquery方法替換成了簡單的原生方法,并封裝在 Utils 這個類中,那么我們每次調(diào)用 $("xxx") 時,其實就是在調(diào)用該類上的方法,那么對這個文件做一些修改

  1. // 此處刪除export 
  2. class Utils { 
  3.  // ...省略一些代碼 
  4.  
  5. Utils.eventListeners = {}; 
  6.  
  7. // 此處刪除 export default,并將函數(shù) $utils改成 $ 
  8. function $(selector) { 
  9.     return new Utils(selector); 

這樣就相當(dāng)于我們在全局模擬jquery定義了一個 $ 方法。此時html文件中的jquery引用就可以刪除了,并把我們剛才生成的文件引進來

 

 

刪除jquery,注入替代品

 

 

再去頁面中嘗試操作dom,可以看到效果跟之前一樣,成功!

補充

如果你想用該工具生成jquery所有api的替代文件,即生成一個 super-mini-jquery ,你可以這么做

  1. replace-jquery --build-all super-mini-jquery.js 

將代碼混淆丑化以后大概只有10kb

 

 

super-mini-jquery包體大小

 

 

 因為這個工具剛發(fā)布才2個星期不到,只實現(xiàn)了大部分的jquery代碼替換,比如 ajax 暫時是沒辦法替換的,你如果嘗試去替換,工具也會提醒你

無法替換ajax

總的來說,這個工具想法不錯,希望后期能支持更多的語法替換!

 

責(zé)任編輯:張燕妮 來源: 前端印象
相關(guān)推薦

2020-02-23 16:33:02

GitHub印度子公司

2018-12-26 09:03:30

物聯(lián)網(wǎng)IOT智能

2020-09-16 13:08:17

微信兒童版天眼查騰訊

2024-07-17 13:11:22

2023-08-23 19:01:09

PythonExcel語言

2025-04-01 00:00:22

數(shù)據(jù)場景競品

2015-09-29 11:37:45

技術(shù)依賴程序員

2015-09-22 09:41:56

技術(shù)程序員

2021-10-09 00:02:04

DevOps敏捷開發(fā)

2021-06-13 12:03:46

SaaS軟件即服務(wù)

2022-03-27 20:32:28

Knative容器事件模型

2023-11-24 12:36:00

模型訓(xùn)練

2023-11-02 08:43:08

protocgo兼容

2015-01-23 10:04:56

bug程序員

2023-10-05 18:49:12

.Net?Newtonsof源碼

2020-07-29 09:21:34

Docker集群部署隔離環(huán)境

2020-11-30 08:34:44

大數(shù)據(jù)數(shù)據(jù)分析技術(shù)

2021-02-14 00:21:37

區(qū)塊鏈數(shù)字貨幣金融

2021-06-29 11:21:41

數(shù)據(jù)安全網(wǎng)絡(luò)安全黑客

2022-01-05 18:27:44

數(shù)據(jù)挖掘工具
點贊
收藏

51CTO技術(shù)棧公眾號