Кажется, прошла незамеченной хорошая новость.
Разработчики V8 активно взялись за добавление lookbehind assertions в регулярные выражения JavaScript.
В Google Chrome Canary уже можно потестировать при помощи флага:
В этом месяце выходит шестая версия Node.js, основанная на V8 5.0, и в ней тоже можно включить поддержку lookbehind:
Если совсем не терпится, можно потестировать на уже появляющихся RC:
nodejs.org/download/rc
Я так протестировал положительный и отрицательный варианты на примере из статьи:
Стоит обратить внимание на две особенности, упомянутые авторами:
1. В отличие от Perl, оба варианта lookbehind поддерживают выражения переменной длины.
2. Разработчики пошли по пути .NET и в другой особенности — установлен непривычный (для начала) порядок запоминания подвыражений и внутренних ссылок.
P.S. Нововведение перешло на стадию флага --es_staging.
Разработчики V8 активно взялись за добавление lookbehind assertions в регулярные выражения JavaScript.
В Google Chrome Canary уже можно потестировать при помощи флага:
chrome.exe --js-flags="--harmony-regexp-lookbehind"
В этом месяце выходит шестая версия Node.js, основанная на V8 5.0, и в ней тоже можно включить поддержку lookbehind:
node --harmony_regexp_lookbehind
Если совсем не терпится, можно потестировать на уже появляющихся RC:
nodejs.org/download/rc
Я так протестировал положительный и отрицательный варианты на примере из статьи:
Стоит обратить внимание на две особенности, упомянутые авторами:
1. В отличие от Perl, оба варианта lookbehind поддерживают выражения переменной длины.
2. Разработчики пошли по пути .NET и в другой особенности — установлен непривычный (для начала) порядок запоминания подвыражений и внутренних ссылок.
P.S. Нововведение перешло на стадию флага --es_staging.
ChALkeRx
На всякий случай напоминаю, что использовать --harmony-флаги в продакшне не рекомендуется.
Даже если фича выглядит аддитивной — они иногда сегфолтятся.
ChALkeRx
Так. Первый абзац в предыдущем комментарии — цитата из статьи. Мне хабр показал сработавший blockquote в предпросмотре, но вырезал его после отправки. А отредактировать я уже не могу.
vmb
Спасибо за комментарий и щепетильность. Вдвойне полезно от разработчика Node.js)
Да, я это не к тому написал, чтобы всем вовсю использовать в продакшене. Скорее, чтобы тестировать и помогать в отладке. Похоже, это сейчас будет единственный удобный способ, с выходом Node.js 6.0.
vmb
Я получил список флагов для ночной сборки с V8 4.9 при помощи
node --v8-options > v8.txt
. У многих ключей--harmony...
есть приписка(in progress)
в объяснениях. У--harmony_regexp_lookbehind
такой приписки нет. Вы не знаете, стоит ли за этим какая-то принципиальная разница?ChALkeRx
Честно говоря, вот так не могу сказать. Предполагаю что первые точно не готовы, а вторые не оттестированы, но я в этом не уверен. Лучше поискать какую-нибудь информацию на эту приписку, где-то может быть описано.
Но ни те ни другие в продакшне использовать не стоит. Для тестирования и разработки следующей версии — да, сколько угодно. А так накатаете в продакшн, какой-нибудь клиент пришлёт запрос на котором оно падает — будет нехорошо.
vmb
«This is pretty much done, but still hidden behind a flag. Do we wait till the proposal advances or do we just stage it?»
«I'd argue we should leave this flipped off until the proposal reaches at least Stage 2 (or maybe Stage 3) at TC-39. We don't know what kinds of subtle changes in semantics might come in the future, and we don't want to create an hazard where we might want to change the semantics that we ship later, as it could break websites.»
https://bugs.chromium.org/p/v8/issues/detail?id=4545
То есть, в принципе возможность отлажена, но останется под флагом, пока ещё больше не приблизится к стандарту. Наверное, для личного пользования уже можно рисковать.
vmb
Скрипт с этой возможностью запускается под любым из этих флагов, по крайней мере на Node.js 6 RC 2 (V8 5):
node --harmony_regexp_lookbehind test.js
node --harmony test.js
node --es_staging test.js
ChALkeRx
Ну да.
--harmony_regexp_lookbehind — включает конкретную фичу, независимо от того, в каком она состоянии.
--es_staging — включает то, что считается готовым, но не стабильным/не оттестированым.
--harmony — уже синоним для --es-staging.
См. https://nodejs.org/en/docs/es6/ (но учтите, что конкретный список фич там для более старой версии).
vmb
А это уже синонимы как для разработчиков Node, так и для разработчиков V8?
ChALkeRx
--es_staging (enable all completed harmony features)
--harmony (enable all completed harmony features)
Насколько я знаю — да.
Ещё: раньше (в Node.js 0.10/0.12) --harmony включал не только готовые фичи, а целую кучу всего совсем сырого.
Начиная с io.js 1.0 — так, как сейчас.
См. https://iojs.org/en/es6.html для истории.
vmb
Большое спасибо вам за все ответы.
rumkin
Сорри за оффтоп. Crажите включена ли поддержка Proxy в пятой версии v8 или так же придется использовать harmoni-флаги?
vmb
Судя по официальному блогу, включена уже в 4.9.
rumkin
Ох ты ж! Мы еще и деструктивное присваивание получим! Не ожидал так скоро.
ChALkeRx
Есть удобный сайт, где можно посмотреть информацию по фичам — https://www.chromestatus.com/
vmb
Спасибо. Есть ли какое-то соответствие между версией Хрома и v8, или бывают только случайные совпадения? Canary сейчас уже 52, но v8 в ней всё ещё 5.1.
ChALkeRx
Начиная с довольно старой версии, версия v8 равна версии хрома, делённой на 10. Но это относится к стабильным в основном. То есть как только хром 50 выходит (кстати, уже) — ветка v8 5.0 считается стабильной (опять же, уже).
Её как раз несколько минут назад вмерджили в Node.js master, так что в 6.0 будет v8 5.0. Это планировалось, но до конца не было ясно, так как график релизов Chrome/v8 не жёсткий (и стабильный релиз v8 5.0 мог быть отложен), а релиз Node.js 6.0 назначен на конец этого месяца.
vmb
А Node 6 RC 2 или релиз не будут из-за этого раньше выпускать?
iShatokhin
Тогда для Node можно использовать это — node.green
Я прав?
ChALkeRx
Можно, используйте =). Но она основывается на последних nightly сборках, а про то, что в Node.js 6.0 ожидается всё-таки v8 5.0, а не 4.9 (как сейчас в той табличке) — было известно давно. Но без стопроцентной гарантии.