Показать сообщение отдельно
  #8 (permalink)  
Старый 12.08.2015, 21:39
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от siber-biber Посмотреть сообщение
Если победите форматирование кода отпишите здесь ..мне тоже не нравится что бандл итоговый переформатируется.
Я не большой специалист в Cmd, но с ребятами общался на эту тему. Весь код JavaScript парсится, токенизируется лексером и превращается в AST дерево. Потом по нему проходятся оптимизатором, пылесосом и добавляют ложку дёгтя. В конечной стадии AST дерево форматируется обратно в JavaScript код. Здесь важно понимать, что текст скомпилированного кода не имеет прямого отношения к изначальному, он проходит через бинарную стадию и оригинальный исходник теряется. Поэтому форматирование неизбежно.

Цитата:
Еще не нравится что в код добавляются лишние semicolons в конструкции switch (...) {...} ..пришлось jshint-у сказать чтоб на такое не ругался.
Как побороть всё это я не нашел.
А и не найдёте. Есть несколько таких мест, в которых наш компилятор вставляет "лишние" точки с запятой. Причина проста, хотя и не очевидна: в JavaScript есть одна говнофича под названием Automatic Semicolon Injection. Это когда вы можете забыть точку с запятой в конце строки, а код вроде работает и всё какбэ хорошо.

Так вот, мне один раз пришлось потратить полдня на отлавливание очень мерзкого усатого друга, который был призван в наш мир именно через дырку в ASI на транслированном коде. В одном или двух кусках кода цикл for() был использован как инкрементальный оператор, без блока {}. Примерно вот так:

// Я не помню, что конкретно этот код делал
for (i = 0; i < 10; i++)

// Тут был комментарий
foo = bar; // пошли дальше по коду


Это каким-то образом пролетало через парсеры JavaScript в браузерах, и ошибки не вызывало. Видимо, в конце строки с for() автоматически подставлялась точка с запятой. Когда же код был транслирован, он выглядел уже по-другому:

for (i = 0; i < 10; i++) foo = bar;


Видите проблему, да? Чёртов JavaScript. Вот чтобы от таких косяков перестраховаться, принтер кода и втыкает "лишние" точки с запятой.

А вообще до меня только что дошло - зачем вы вообще гоняете JSHint на сборке? Это боевой код, как правило минимизированный. Какая разница, как он выглядит?
Ответить с цитированием