Возможно ли компилятор JQuery *?

Когда я увидел этот вопрос, я подумал, что было бы полезно, если бы был написан компилятор jQuery. Теперь, компилятором, я имею в виду что-то, что принимает код jQuery и выводит исходный код javascript, который в конечном итоге выполняется.

Вот как я вижу блок выполнения jQuery-кода:

  • вызывается функция jQuery и передаются параметры
  • функция вызывает необработанную функцию javascript и передает полученные ей параметры.
  • вновь вызываемая функция выполняет предполагаемое действие

Я понимаю, что это очень упрощенная модель, и это может быть намного сложнее, но я думаю, что сложность сводится к повторению шагов 2 и 3 с вызовами различных исходных js-функций и каждый раз, когда они загружаются со всеми или подмножеством параметров/предыдущих результатов.

Если мы подпишем эту модель, мы можем придумать методы, чтобы функции jQuery выполняли двойную работу:

  • Что они уже делают
  • Записывая, что они сделали в форме raw_function(passed_params)

Я делаю некоторые неправильные предположения, которые сделают это невозможным? Любые идеи о том, как профайлер Firebug пытается получить имена функций? Можно ли здесь использовать?

Изменить

То, что я думал, делало черный ящик со входом/выходом как:

normal jquery code [BB]code you'd write if you used no library

  • Я назвал это компилятором, потому что вы скомпилировали один раз и затем использовали полученный код.
  • Я утверждал, что он может иметь как минимум образовательное использование и, возможно, другие виды использования.
  • Люди сказали, что это потребует небольшого количества кода и выдаст огромную массу; что не бросает вызов намеченной цели, насколько я вижу
  • Люди сказали, что я добавлю лишний лишний шаг к рендерингу страницы, который, учитывая, что только полученный код в конечном итоге будет использоваться (и, вероятно, будет использоваться только для изучения), неверен.
  • Люди говорят, что между функциями javascript и функциями jquery нет взаимно однозначного отношения, и подразумевается, что такой конвертер будет слишком сложным и, вероятно, не стоит усилий. С этим я сейчас согласен.

Спасибо всем!

Ответы

Ответ 1

Я думаю, что вы имеете в виду: если вы пишете

var myId = $("#myId")

он будет преобразован в

var myId = document.getElementById("myId")

Я думаю, что это возможно, но проблема в том, что функции jQuery возвращают объекты jQuery, поэтому в приведенном выше примере первый myId будет объектом jQuery, а второй будет объектом node (я думаю), который повлияет другие функции, которые необходимо использовать позже в коде после компиляции. Особенно, если они скованы

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

Ответ 2

Если цель компилятора для преобразования Javascript (который может быть jquery или что-то еще) для лучшего Javascript (который я понял из вас, говоря "в конечном счете выполненный" ), Google уже это сделал. Они сделали компилятор закрытия, а некоторые попробовали его с JQuery в этой статье. Разве это не то, что вы предлагаете?

Ответ 3

Код jQuery является "сырым кодом JavaScript", поэтому я не уверен, что компилятор действительно вас купит. Это похоже на запись компилятора С#, который принимает код С# 4.0 и испускает код С# 1.1. Какая польза?

jQuery - это не другой язык, который заменяет или даже сидит поверх JavaScript. Это структура кода JavaScript, которая предоставляет множество полезных помощников для общих задач. На мой взгляд, наибольшей выгодой является то, что его отличительная структура помогает отличить его от более "Java-подобных" языков.

JavaScript сам по себе обманчиво похож на другие языки, и это, как правило, является одним из его самых больших недостатков как языка. Люди пытаются думать об этом с точки зрения Java, хотя сходство в значительной степени останавливается на имени. Структурно JavaScript во многом отличается (типизация, область видимости, совпадение, наследование, полиморфизм и т.д.), И мне особенно нравится, как jQuery и другие современные проекты JavaScript принесли язык для самостоятельных целей.

Я думаю, чтобы вернуться к вопросу... Если вы хотите превратить JavaScript в стиле jQuery в Java-стиле JavaScript, то это что-то вроде шага назад. Обе версии будут интерпретироваться браузером одинаково, но одна из версий менее изящна и представляет язык хуже, чем другой.

Обратите внимание, что jQuery - это не единственная инфраструктура, которая делает эти вещи, она просто самая популярная. Должен ли такой компилятор также обрабатывать все другие структуры? Все они делают разные вещи разными способами, чтобы использовать язык. Я не думаю, что гомогенизация их в "более простой" форме покупает нам что-нибудь.

Изменить: (В ответ на различные комментарии по этому вопросу и его ответы, вроде...

Как бы вы структурировали этот компилятор? Учитывая, что (как мы и пытались указать) jQuery является JavaScript и представляет собой только библиотеку кода JavaScript, и, учитывая, как работают браузеры и JavaScript, ваш "компилятор" просто должен быть другой библиотекой JavaScript. По сути, вы хотите, чтобы перейти от:

  • Веб-страница
  • Библиотека jQuery
  • Некоторые JavaScript-коды, которые используют библиотеку jQuery

в

  • Веб-страница
  • Библиотека jQuery
  • Некоторые JavaScript-коды, которые используют библиотеку jQuery
  • Ваша библиотека "компилятора"
  • Еще один код JavaScript, который отправляет предыдущий код JavaScript через вашу библиотеку как-то
  • Ваша библиотека, эквивалентная jQuery
  • Еще один код JavaScript, который заменяет исходный код JavaScript вашей новой версией

чтобы сделать вещи проще? Или каким-то образом упростить использование инструментов для отладки, таких как FireBug? То, что вы предлагаете, называется "обфускатором", и его единственная цель - сделать код более сложным для обратного проектирования. Побочным эффектом является то, что он также делает код более сложным для понимания и поддержки.

Ответ 4

Теперь, компилятором, я имею в виду что-то который принимает код jQuery и выводит необработанный код JavaScript, который в конечном счете выполняется.

Я думаю, что это утверждение может указывать на то, что для вас не так.

jQuery - это библиотека, реализованная на языке Javascript. jQuery не является языком, отделенным от Javascript. jQuery - это набор Javascript-кода, который можно использовать для упрощения разработки Javascript. Все это Javascript. "Компилятор jQuery" для преобразования "кода jQuery" в "raw Javascript" был бы совершенно бесполезным, поскольку jQuery - это сырой Javascript.

То, что вы, вероятно, действительно хотите, это компилятор Javascript. В этом случае это, безусловно, возможно. Фактически, некоторые веб-браузеры в настоящее время фактически "компилируют" код Javascript в каком-то байт-коде для повышения производительности. Но рабочие процессы разработки, связанные с Javascript, обычно не связаны с каким-либо компилятором.


По-видимому, вы действительно хотите "встроить" код jQuery в свой код, например:

var myfoo = $('#foo');var myfoo = document.getElementById('foo');

На самом деле это компилятор С++ для оптимизации производительности, но Javascript не является С++, поэтому он не применяется здесь.

Я не вижу, как это полезно. Точка jQuery заключается в упрощении разработки Javascript путем предоставления согласованного интерфейса, такого как функция $(). Выполняя эту процедуру "inlining", вы создаете код, который еще труднее читать и поддерживать.

И зачем добавлять дополнительный шаг? Почему бы просто не доставить код JavaScript javascript и библиотеку jQuery в браузер? Зачем добавлять дополнительный шаг с помощью дополнительного инструмента для преобразования Javascript в Javascript, который не предоставляет каких-либо существенных дополнительных преимуществ?