Почему у нас есть новые строки в уменьшенном JavaScript?
Я знаю о подобном вопросе, но он немного отличается от того, что я здесь задаю, поэтому, пожалуйста, не flag
это как дубликат.
Когда вы видите рабочую версию jQuery, почему через некоторое время появляется новая строка? Я скачал копию и удалил все новые строки (кроме лицензии), и она все еще работала. (Я запустил весь пакет модульных тестов против моих изменений в Mozilla Firefox, Google Chrome и Opera.)
Я знаю, что три новых строки (не считая лицензии) не сильно замедляют ее, но все же, не все ли помогают?
Я поставил перед собой небольшую задачу - выжать из своего кода JavaScript каждую небольшую часть производительности.
3 ответа
В настоящее время jQuery использует UglifyJS для минимизации их исходного кода. В своем скрипте сборки они специально установили max_line_length
директива быть 32 * 1024
:
Документация для UglifyJS имеет это сказать на max-line-len
директива;
--max-line-len
(по умолчанию 32K символов) - добавить новую строку после примерно 32K символов. Я видел как FF и Chrome квакали, когда весь код был в одной строке около 670K. Передайте –max-line-len 0, чтобы отключить эту функцию безопасности.
Чтобы цитировать FAQ по компилятору закрытия:
Закрывающий компилятор намеренно добавляет разрывы строк каждые 500 символов или около того. Брандмауэры и прокси-серверы иногда портят или игнорируют большие файлы JavaScript с очень длинными строками. Добавление разрывов строки каждые 500 символов предотвращает эту проблему. Удаление разрывов строк не влияет на семантику скрипта. Влияние на размер кода невелико, и компилятор оптимизирует размещение разрыва строки, так что размер штрафа кода становится еще меньше при сжатии файлов.
Это относится к любым программам минификации в целом.
Строки (исключая лицензию) имеют длину около 30 тыс. Символов. Можно было бы избежать ошибок, когда некоторые парсеры Javascript умирают на очень длинных строках. Это, вероятно, не произойдет в современных браузерах, но, возможно, некоторые старые или более малоизвестные браузеры имеют такие ограничения.
(Старый ответ ниже, который также может быть применим, только не в этом случае)
Это может быть связано с тем, что JSMin, популярный Javascript minifier, при определенных условиях будет сохранять перевод строки в выводе. Это связано с тем, что в Javascript переводы строки имеют большое значение, например, если вы пропустите точки с запятой. В документации сказано:
Он более консервативен при исключении перевода строки, поскольку перевод строки иногда рассматривается как точка с запятой. Перевод строки не опускается, если он предшествует не-ASCII-символу или букве ASCII или цифре или одному из следующих символов:
\ $ _ { [ ( + -
и если он следует за не-ASCII символом или буквой ASCII или цифрой или одним из следующих символов:
\ $ _ } ] ) + - " '
Другие минифайеры могут иметь аналогичные правила.
Так что это в основном предосторожность против случайного удаления перевода строки, который может быть необходим, с точки зрения синтаксиса. Последнее, что вы хотите, - это то, что ваш минимизированный JS больше не будет работать, потому что минификатор уничтожил свою семантику.
Что касается "Я знаю три новых строк (не считая лицензию) не собираемся, чтобы замедлить его много, но все же, не каждую крошечный бит помощи"? Когда ваш сервер использует GZIP сжатие разница, вероятно, будет спорными в любом случае.