Возможен ли Jquery * компилятор *? - PullRequest
17 голосов
/ 16 апреля 2011

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

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

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

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

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

  1. Что они уже делают
  2. Регистрация того, что они сделали в виде raw_function(passed_params)

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

Редактировать

Я думал о создании черного ящика с вводом / выводом как:

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

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

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

Ответы [ 4 ]

6 голосов
/ 27 июля 2014

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

var myId = $("#myId")

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

var myId = document.getElementById("myId")

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

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

4 голосов
/ 16 апреля 2011

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

2 голосов
/ 16 апреля 2011

код jQuery - это «сырой код JavaScript», поэтому я не уверен, что компилятор действительно купит вас. Это похоже на написание компилятора C #, который принимает код C # 4.0 и испускает код C # 1.1. В чем выгода?

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

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

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

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

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

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

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

до:

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

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

1 голос
/ 16 апреля 2011

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

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

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

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


Очевидно, что вы действительно хотите "встроить" код jQuery в ваш код, что-то вроде этого:

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

Это на самом деле то, что компилятор C ++ может сделать для оптимизации производительности, но Javascript - это не C ++, поэтому он здесь не применим.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...