Перехват IIFE (самостоятельный вызов) javascript-функций

Я хочу подключить функции IIFE:

(function(p) {
   // stuff
})();

Я спрашиваю об этом в общем смысле, хотя конкретная причина заключается в том, что плагины WordPress часто добавляют встроенные скрипты прямо в вывод тела. Если вы хотите отложить (асинхронную) загрузку зависимостей по причинам SEO, это, естественно, не удастся.

В попытке исправить бесконечные неправильные методы написания кода поставщиками плагинов и плагины, которые просто не разработаны с учетом асинхронной загрузки, я хочу сделать такую ​​вещь.

Я пытаюсь избежать:

  1. Изменение кода поставщика напрямую.
  2. Парсинг необработанного контента с помощью PHP.
  3. Блокирование существующих серверных систем загрузки ресурсов JavaScript, чтобы соответствующим образом загрузить их позже.

Мне интересно, есть ли в браузере прототип крайне низкого уровня, который можно использовать для перехвата функций такого рода?


person Barry    schedule 17.08.2016    source источник
comment
К вашему сведению, это называется IIFE (немедленно вызываемая функция выражение)   -  person James Monger    schedule 17.08.2016
comment
Спасибо! Обновлены теги и заголовок   -  person Barry    schedule 17.08.2016
comment
К сожалению, ответ прост: нет, для этого в браузере нет низкоуровневых хуков. Что бы вы сделали, если бы у вас была такая способность? Было бы более продуктивно, если бы вы точно указали, что вы пытаетесь сделать, и может быть лучший подход к проблеме.   -  person Jacob    schedule 17.08.2016
comment
Конкретным примером является плагин Wordpress под названием Video Background. Он помещает функцию IIFE в тело после тега ‹script src›, чтобы загрузить его зависимость. Я написал хук, который добавляет в этот скрипт атрибут async или defer. Следовательно, это не блокирует нагрузку. Однако сопровождающий сценарий IIFE дает сбой, так как зависимость еще не загружена, потому что плагин не был написан для поддержки асинхронности. Поэтому я должен перехватить эту функцию, чтобы переписать ее, если я хочу, чтобы плагин остался неизменным. Хотя один пример из многих.   -  person Barry    schedule 17.08.2016
comment
Все они происходят в одном месте или в случайных местах в DOM? Если они все находятся в одном месте, вы можете просто поместить вокруг него оператор функции calllater = function() { ... все IIFE ... }   -  person Michael Scheffenacker    schedule 17.08.2016
comment
Можете ли вы заставить плагины помещаться в iframe, например: phpied.com/ async-js без блокировки загрузки   -  person Ian Gilroy    schedule 17.08.2016
comment
Как насчет трассировки стека window.onerror. Можно ли это использовать для повторной попытки первоначального выполнения в будущем? Если это так, решение должно состоять в том, чтобы использовать wp_deregister_script и использовать что-то вроде RequireJS или ded/script для правильного выполнения неудачных сценариев после асинхронной загрузки.   -  person Barry    schedule 17.08.2016
comment
Если вы написали хук, который изменяет внешние теги скрипта, отбрасываемые плагинами, вы захотите написать хук, который также изменяет встроенные теги скрипта.   -  person Bergi    schedule 17.08.2016
comment
Мммм, отличные идеи! Спасибо, Майкл, Ян и Берги. Похоже, мне нужно будет обработать необработанный контент, обнаружить теги ‹script› и обернуть их. Это вполне может быть единственным и лучшим решением!   -  person Barry    schedule 17.08.2016
comment
исправить плагины, которые просто не предназначены для асинхронной загрузки — это будет очень сложно. Они могут использовать document.write или что-то еще.   -  person Bergi    schedule 17.08.2016


Ответы (1)


В итоге я сделал то, чего хотел избежать. Он немного грязный, но работает очень хорошо. Я бы поделился, но NDA. Если возможно, я попытаюсь отправить его как запрос на вытягивание одного из более крупных плагинов SEO/кэширования (вероятно, Better Wordpress minify).

Он сканирует выходной буфер на наличие проблемных скриптов и стилей и настраивает их в соответствии с Google SEO (не блокирует). Я предполагаю, что это никогда не сработает для gen-pop, поскольку количество плохого кода в этом мире бесконечно, и я думаю, что регулярное выражение станет болезненно раздутым к тому времени, когда все варианты использования будут обработаны.

Он полагается на loadCSS и некоторую форму родного DocumentContentLoaded, определяемую встроенно в голове, начинается с принудительной отсрочки всех исходных скриптов, очищает javascript, предназначенный для выполнения в собственном теге скрипта, и перемещает скрипты тела в одну функцию. что можно позвонить, когда придет время. Все с регулярным выражением.

Вот несколько советов для тех, кто заинтересован в том, чтобы сделать подобное:

Привет всем комментариям и помощи, предоставленной здесь, я бы даже не попытался, не поговорив сначала с вами, ребята. Цените указатели и советы, увидимся в следующий раз!

person Barry    schedule 18.08.2016