欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jQuery一鍵移除使前端項目脫離對它的依賴

 更新時間:2022年04月26日 11:09:22   作者:「零一」  
這篇文章主要為大家介紹了jQuery一鍵移除使項目脫離對它的依賴使用方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

大家好,我是零一。雖然現(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

index.html

main.js

main.js

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

演示動圖

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

先全局下載一下

npm install -g replace-jquery

然后在項目目錄使用,語法為

replace-jquery 目標js文件 生成的js文件

replace-jquery main.js newMain.js

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

生成過程

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

export class Utils {
    constructor(selector) {
        this.elements = Utils.getSelector(selector);
        this.element = this.get(0);
        return this;
    }
    on(events, listener) {
        events.split(' ').forEach((eventName) => {
            this.each((el) => {
                const tNEventName = Utils.setEventName(el, eventName);
                if (!Array.isArray(Utils.eventListeners[tNEventName])) {
                    Utils.eventListeners[tNEventName] = [];
                }
                Utils.eventListeners[tNEventName].push(listener);
                // https://github.com/microsoft/TypeScript/issues/28357
                if (el) {
                    el.addEventListener(eventName.split('.')[0], listener);
                }
            });
        });
        return this;
    }
    remove() {
        this.each((el) => {
            el.parentNode.removeChild(el);
        });
        return this;
    }
    css(css, value) {
        if (value !== undefined) {
            this.each((el) => {
                Utils.setCss(el, css, value);
            });
            return this;
        }
        if (typeof css === 'object') {
            for (const property in css) {
                if (Object.prototype.hasOwnProperty.call(css, property)) {
                    this.each((el) => {
                        Utils.setCss(el, property, css[property]);
                    });
                }
            }
            return this;
        }
        const cssProp = Utils.camelCase(css);
        const property = Utils.styleSupport(cssProp);
        return getComputedStyle(this.element)[property];
    }
    static getSelector(selector, context) {
        if (selector && typeof selector !== 'string') {
            if (selector.length !== undefined) {
                return selector;
            }
            return [selector];
        }
        context = context || document;
        // For performance reasons, use getElementById
        // eslint-disable-next-line no-control-regex
        const idRegex = /^#(?:[\w-]|\\.|[^\x00-\xa0])*$/;
        if (idRegex.test(selector)) {
            const el = document.getElementById(selector.substring(1));
            return el ? [el] : [];
        }
        return [].slice.call(context.querySelectorAll(selector) || []);
    }
    get(index) {
        if (index !== undefined) {
            return this.elements[index];
        }
        return this.elements;
    }
    each(func) {
        if (!this.elements.length) {
            return this;
        }
        this.elements.forEach((el, index) => {
            func.call(el, el, index);
        });
        return this;
    }
    static setEventName(el, eventName) {
        // Need to verify https://stackoverflow.com/questions/1915341/whats-wrong-with-adding-properties-to-dom-element-objects
        const elementUUId = el.eventEmitterUUID;
        const uuid = elementUUId || Utils.generateUUID();
        // eslint-disable-next-line no-param-reassign
        el.eventEmitterUUID = uuid;
        return Utils.getEventName(eventName, uuid);
    }
    static setCss(el, prop, value) {
        // prettier-ignore
        let cssProperty = Utils.camelCase(prop);
        cssProperty = Utils.styleSupport(cssProperty);
        el.style[cssProperty] = value;
    }
    static camelCase(text) {
        return text.replace(/-([a-z])/gi, (s, group1) => group1.toUpperCase());
    }
    static styleSupport(prop) {
        let vendorProp;
        let supportedProp;
        const capProp = prop.charAt(0).toUpperCase() + prop.slice(1);
        const prefixes = ['Moz', 'Webkit', 'O', 'ms'];
        let div = document.createElement('div');
        if (prop in div.style) {
            supportedProp = prop;
        } else {
            for (let i = 0; i < prefixes.length; i++) {
                vendorProp = prefixes[i] + capProp;
                if (vendorProp in div.style) {
                    supportedProp = vendorProp;
                    break;
                }
            }
        }
        div = null;
        return supportedProp;
    }
    static generateUUID() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
            // eslint-disable-next-line no-bitwise
            const r = (Math.random() * 16) | 0;
            // eslint-disable-next-line no-bitwise
            const v = c === 'x' ? r : (r & 0x3) | 0x8;
            return v.toString(16);
        });
    }
    static getEventName(eventName, uuid) {
        return `${eventName}__EVENT_EMITTER__${uuid}`;
    }
}
Utils.eventListeners = {};
export default function $utils(selector) {
    return new Utils(selector);
}

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

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

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

刪除jquery,注入替代品

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

補充

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

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

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

super-mini-jquery包體大小

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

無法替換ajax

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

以上就是jQuery一鍵移除使項目脫離對它的依賴的詳細內(nèi)容,更多關于項目脫離jquery依賴的資料請關注腳本之家其它相關文章!

相關文章

  • jQuery插件實現(xiàn)非常實用的tab欄切換功能【案例】

    jQuery插件實現(xiàn)非常實用的tab欄切換功能【案例】

    這篇文章主要介紹了jQuery插件實現(xiàn)非常實用的tab欄切換功能,涉及jQuery事件響應及頁面元素屬性動態(tài)操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-02-02
  • Jquery on綁定的事件 觸發(fā)多次實例代碼

    Jquery on綁定的事件 觸發(fā)多次實例代碼

    下面小編就為大家?guī)硪黄狫query on綁定的事件 觸發(fā)多次實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • jQuery實現(xiàn)的分頁功能示例

    jQuery實現(xiàn)的分頁功能示例

    這篇文章主要介紹了jQuery實現(xiàn)的分頁功能,結合實例形式較為詳細的分析了jQuery實現(xiàn)分頁功能的具體步驟及相關操作技巧,包括前臺樣式、布局及jQuery分頁插件的調(diào)用方法,需要的朋友可以參考下
    2017-01-01
  • jquery中獲取元素的幾種方式小結

    jquery中獲取元素的幾種方式小結

    jquery中獲取元素的幾種方式小結,需要的朋友可以參考下。
    2011-07-07
  • jQuery獲取checkboxlist的value值的方法

    jQuery獲取checkboxlist的value值的方法

    最近著手一個項目用到了服務器空間checkboxlist ,使用起來是方便,可以想要從js獲取值就稍微麻煩點了,google后找到了如下方法,感興趣的小伙伴們可以參考一下
    2015-09-09
  • 前端分頁功能的實現(xiàn)以及原理(jQuery)

    前端分頁功能的實現(xiàn)以及原理(jQuery)

    本文主要介紹了基于jQuery實現(xiàn)的前端分頁功能,并分析了其實現(xiàn)原理。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • domReady的實現(xiàn)案例

    domReady的實現(xiàn)案例

    下面小編就為大家?guī)硪黄猟omReady的實現(xiàn)案例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 使用jQuery實現(xiàn)Web頁面換膚功能的要點解析

    使用jQuery實現(xiàn)Web頁面換膚功能的要點解析

    網(wǎng)頁換膚的實質(zhì)就是切換CSS樣式,關鍵是給用戶做出點擊切換的功能以及換膚完成之后的緩存記錄功能,下面我們就來看一下使用jQuery實現(xiàn)Web頁面換膚功能的要點解析:
    2016-05-05
  • jQuery實現(xiàn)區(qū)域打印功能代碼詳解

    jQuery實現(xiàn)區(qū)域打印功能代碼詳解

    這篇文章主要介紹了jQuery實現(xiàn)區(qū)域打印功能代碼詳解的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • jQuery中insertBefore()方法用法實例

    jQuery中insertBefore()方法用法實例

    這篇文章主要介紹了jQuery中insertBefore()方法用法,實例分析了insertBefore()方法的功能、定義及把匹配的元素插入到另一個指定的元素集合前面的使用技巧,需要的朋友可以參考下
    2015-01-01

最新評論