jQuery noop приводит к тому, что JS сокращает код для удаления кода в веб-приложении .NET Framework 4.8

#javascript #jquery #.net #noop #minifyjs

Вопрос:

Когда я публикую свое приложение .NET, один из моих файлов JS неправильно сокращается. У меня есть несколько сотен строк кода в файле, но после завершения процесса получается почти пустая функция. Я прошел через него и определил, что он сводится к $.noop тому, что я использую, без этого процесс работает нормально. Чтобы продемонстрировать это, я разбил его на простой пример, который показывает, как это влияет на файл.

 var MyApp = {};
MyApp.EmailPopup = (function () {
    function Test() {
        // do lots of jquery stuff
        alert('hi');
    }

    var thisObject = {
        Show: $.noop
    };

    thisObject.Show = function () {
        Test();
    };

    return thisObject;
})();
 

При уменьшении вызов Test удаляется, как показано на рисунке:

 var MyApp={};MyApp.EmailPopup=function(){return{Show:$.noop}}();
 

Однако, если я удалю $.noop функцию и вместо нее добавлю пустую функцию, например:

 var MyApp = {};
MyApp.EmailPopup = (function () {
    function Test() {
        // do lots of jquery stuff
        alert('hi');
    }

    var thisObject = {
        Show: function () { } // this has changed
    };

    thisObject.Show = function () {
        Test();
    };

    return thisObject;
})();
 

Затем я получаю желаемую уменьшенную версию:

 var MyApp={};MyApp.EmailPopup=function(){return{Show:function(){alert("hi")}}}();
 

В реальном приложении, не включая эквивалентную Test функцию, я теряю сотни строк кода. Может ли кто-нибудь объяснить, почему использование $.noop предотвращает его работу, но инициализация пустой функции или null работает? Это веб-приложение .NET 4.8, оно использует jQuery 3.3.1, и я создаю его с помощью Visual Studio 2019.

Комментарии:

1. Похоже на ошибку в minify.js для меня. В чем причина инициализации thisObject с $.noop помощью и переопределения этого позже в первую очередь? Если у вас есть вся информация, которая позволяет вам решить, хотите ли вы использовать $.noop или что-то еще прямо во время построения функции, решите это тогда и там, а не через пару строк.

2. Я знаю, что в этом нет необходимости. Это было сделано для того, чтобы легко выделить все функции, которые будут доступны для использования в занятом «классе». Я легко могу это обойти, но в этот момент мне было просто интересно, была ли на то причина 🙂

3. Как я уже сказал, для меня это похоже на ошибку в minifyjs. Другой минимизатор, вероятно, работает лучше.

4. Спасибо за вклад!