Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   JS.next(стандарты, фичи, движки) (https://javascript.ru/forum/offtopic/50248-js-next-standarty-fichi-dvizhki.html)

kobezzza 05.04.2015 19:35

Сегодня копался в настройках Babel и нашел парочку интересных опций:

loose mode - в качестве конфига эта опция принимает массив трансоформеров, которые нужно скомпилить в "простом" режиме, что это значит - полученный код получается более читаемый и работает как правило быстрее, а достигается это за счёт отхождение от стандарта языка, т.е. поведение такого кода может отличатся от нативной реализации и использовать его нужно осторожно.

auxiliaryComment - это параметр принимает строку, которая будет вставлена в виде комментария перед каждый куском кода, который был сгенерен в Babel и которого нет в оригинальном коде, например, можно задать

'istanbul ignore next'


и потом, при обработке наших тестов через istanbul у нас не будет маячить сгенериный код, на мой взгляд это куда удобнее чем юзать специальные адапторы, вроде isparta.

Safort 13.04.2015 15:26

How to Fix the ES6 `class` keyword

kobezzza 15.05.2015 09:30

Свершилось! В Babel добавили поддержку абстрактных ссылок!

Песочница

Как можно видеть из примера, что кейза применения 2:

1) Появляется сахарный синтаксис для организации "конвеерных фильтров", как в Bash и т.д.

'  -1.121213 '::trim()::parseInt()::round()::abs()


2) Появляется сахар для bind(this)

.onclick = ::foo.bar // foo.bar.bind(foo)

kobezzza 15.05.2015 11:14

https://github.com/BrendanEich/ModernWeb.tw-2015

Safort 15.05.2015 11:55

kobezzza,
как-то внешний вид не очень
::foo.bar

Может, я просто ещё не привык)

Octane 16.05.2015 14:10

Цитата:

Сообщение от kobezzza
https://github.com/BrendanEich/ModernWeb.tw-2015

Так удобнее http://brendaneich.github.io/ModernWeb.tw-2015 :)

Octane 20.05.2015 19:44

До сих пор нативные промисы работают по-разному: https://github.com/promises-aplus/pr...pec/issues/193

nerv_ 26.05.2015 22:39

PhpStorm не понимает синтаксис геттеров/сеттеров es6 классов и подсвечивает как ошибку :)
https://yadi.sk/i/-jC6XHS3gtQWZ

cyber 27.05.2015 16:39

nerv_, я плагин ставил какой то это решило проблему

Gozar 27.05.2015 20:03

Цитата:

Сообщение от nerv_
PhpStorm не понимает синтаксис геттеров/сеттеров es6 классов и подсвечивает как ошибку
https://yadi.sk/i/-jC6XHS3gtQWZ

Понимает. Может тебе стоит обновить версию?

nerv_ 29.05.2015 15:39

Цитата:

Сообщение от Gozar
Понимает. Может тебе стоит обновить версию?

последняя вроде 8.0.3
проверь у себя, если не трудно

Цитата:

Сообщение от cyber
nerv_, я плагин ставил какой то это решило проблему

ссылка?

Gozar 29.05.2015 18:40

Цитата:

Сообщение от nerv_
проверь у себя, если не трудно

Цитата:

Сообщение от Gozar
Понимает

Последняя версия - это 9.0 (https://confluence.jetbrains.com/dis...Access+Program). EAP.

nerv_ 30.05.2015 00:26

Цитата:

Сообщение от Gozar
Последняя версия - это 9.0

официальная стабильная восьмая https://www.jetbrains.com/phpstorm/

Gozar 30.05.2015 01:50

Цитата:

Сообщение от nerv_
официальная стабильная восьмая

Ну, тогда я могу тебе только посочувствовать. Оставайся с принципами.

Знаешь что такое backup? Умеешь делать?

ЗЫ: У меня eap ни разу не упал и глючил в основном плагин stylus, из-за медлительности разработчика.

nerv_ 31.05.2015 20:15

Цитата:

Сообщение от Gozar
Ну, тогда я могу тебе только посочувствовать. Оставайся с принципами.

Котята плакали, кололись, но продолжали жрать кактус :)

Цитата:

Сообщение от Gozar
ЗЫ: У меня eap ни разу не упал и глючил в основном плагин stylus, из-за медлительности разработчика.

любопытства ради я поставил себе EAP. Панель гранта там засунули вбок) Грусть-печаль.

Gozar 31.05.2015 22:56

Цитата:

Сообщение от nerv_
Панель гранта там засунули вбок)

Мне нравится. Я ниже версию ставить не хочу, мне там фичь недоставало удобных. 8.0.3 низковата, я уж и забыл что ей кто-то пользуется :)

kobezzza 01.06.2015 01:42

Цитата:

Сообщение от nerv_ (Сообщение 373293)
Панель гранта там засунули вбок) Грусть-печаль.

Дык, всё настраваемо же, у мя WS под себя оч сильно заточен, от дефолтного конфига мало что осталось :)

FINoM 29.06.2015 19:10

Ребят, как отключить часть транслятора Babel? В данном случае, хочу отключить for..of, так как разрабатываю одно приложение только под последний Хром, а этот вид цикла там работает и без Babel прекрасно.

Safort 29.06.2015 21:09

FINoM,
какой сборщик используешь?

Если Gulp, то попробуй так:
...
.pipe(babel({
  blacklist: ['es6.forOf']
}))
...


И ещё пара ссылок с более подробной инфой:
https://babeljs.io/docs/usage/options/
https://babeljs.io/docs/advanced/transformers/

FINoM 29.06.2015 21:29

Safort, уже понял, спасибо. Юзаю Grunt.

Возникла другая проблема (может не очень касается этой темы). Requirejs отказывается собирать проект из-за for..of:

Running "requirejs:object" (requirejs) task
>> Error: Parse error using esprima for file:
>> /path/to/scripts
>> Error: Line 246: Unexpected identifier
>> In module tree:
>>     object

Видимо, они не обновили парсер (здесь работает). Кто-то в курсе, как исправить проблему?

Safort 30.06.2015 00:21

FINoM,
а у тебя последняя версия Requirejs? Если да, то не вижу другого варианта, кроме как написать ишью.

Safort 10.07.2015 17:47

Exploring ES2016 Decorators

kobezzza 10.07.2015 18:03

Цитата:

Сообщение от Safort (Сообщение 378613)

Очень крутая фича.

Safort 10.07.2015 18:48

kobezzza,
давно юзаешь?

kobezzza 10.07.2015 18:57

Цитата:

Сообщение от Safort (Сообщение 378623)
kobezzza,
давно юзаешь?

Юзал в других языках, тут пока нет, т.к. в WS поддержки нормальной нет :(

kobezzza 22.07.2015 12:34

Паттерн для организации Partial классов:

base.js
export class Base {
  get() {
    return 1;
  }
}


child.js
import { Base } from 'base';
export class Child extends Base {
  
}


child-mixin.js
import { Child } from 'child';
extend(Child, /** @lends {Child.prototype} */ { // Аннотация для автокомплита в WS11 и GCC
  get() {
    return super.get(); // super работает
  }
});


Сама функция extend
function extend(Class, mixin) {
  mixin.__proto__ = Class.__proto__.prototype;
  for (let key in mixin) {
    Class.prototype[key] = mixin[key];
  }
}

Erolast 22.07.2015 14:15

Цитата:

obj.__proto__ = Class.__proto__.prototype;
__proto__ в ES6 существует только на правах legacy и только для браузеров, лучше использовать Object.setPrototype/Object.getPrototype.

Еще момент - неочевидно название переменной obj, я бы лучше methods назвал.

trikadin 22.07.2015 14:28

Цитата:

Сообщение от Erolast
__proto__ в ES6 существует только на правах legacy и только для браузеров, лучше использовать

Ноп, __proto__ теперь в стандарте.
https://developer.mozilla.org/ru/doc...s/Object/proto

И в той же ноде оно есть. Где ещё нужно-то?)

kobezzza 22.07.2015 14:30

Цитата:

__proto__ в ES6 существует только на правах legacy и только для браузеров, лучше использовать
Всё так, но __proto__ удобно юзать при объявлении литерала объекта и юзать можно смело, т.к. его не выпилят (т.к. стандартизировали это свойство именно в ЕС6), но в данном примере я просто накалякал по быстрому.

Главное тут было показать, как организовывать полноценные Partial классы с работой super и автокомплитом.

devote 22.07.2015 14:31

Цитата:

Сообщение от Erolast
__proto__ в ES6 существует только на правах legacy и только для браузеров

почему legacy ? насколько я помню свойство __proto__ вынули из раздела deprecated и стандартизировали в ES6.

devote 22.07.2015 14:32

мда... пока я формулировал сообщение, trikadin и kobezzza уже успели меня опередить =)

kobezzza 22.07.2015 14:33

Цитата:

почему legacy ?
Ну вообще это хак, удобный хак, который 100 лет везде был, поэтому его и стандартизировали. А чтобы привереды не ворчали, то они добавили методы сетторы/гетторы, но нам то с вами нет смысла боятся юзать эту удобняшку :)

Правда я не понимаю, почему они не заюзали Символы для этой задачи, например,

let foo = {
  [Symbol.prototype]: {
    bar: 1
  },

  get() {
    return this.bar;
  }
}


Ведь символы для того и были созданы и они уже юзаются для таких задач, например, Symbol.iterator

trikadin 22.07.2015 14:35

Цитата:

Сообщение от devote
мда... пока я формулировал сообщение, trikadin и kobezzza уже успели меня опередить =)

Бывает) Мы тут просто всё утро с ним как раз __proto__ и партиал классы обсуждали, поэтому немного поднаторели в вопросе)

devote 22.07.2015 14:38

Цитата:

Сообщение от kobezzza
который 100 лет везде был

ну не 100 конечно и не везде, например в ИЕ он появился только с ИЕ11. В других браузерах да, был давно, но использовали его чаще в полифилах/шимах а не в полноценных проектах. Теперь же его спокойно можно юзать где душа пожелает (главное не переусердствовать :) )

trikadin 22.07.2015 14:41

Цитата:

Сообщение от devote
Теперь же его спокойно можно юзать где душа пожелает (главное не переусердствовать )

Ну, в MDN'е огромными красными буквами написано, что это может похерить производительность, и я склонен им верить. Так что юзать надо с осторожностью.

kobezzza 22.07.2015 14:46

Цитата:

Сообщение от trikadin (Сообщение 380883)
Ну, в MDN'е огромными красными буквами написано, что это может похерить производительность, и я склонен им верить. Так что юзать надо с осторожностью.

Ну херит производительность не само свойство __proto__, а сам факт смены прототипа в рантайме :) Но в примере с партиал классами это совсем безобидная операция, не на что не влияет :)

devote 22.07.2015 14:48

Цитата:

Сообщение от trikadin
что это может похерить производительность

хм... я конечно понимаю настораживание, но много ли сожрет код:
Object.defineProperty(Object.prototype, '__proto__', {
  set: function(value) {
    Object.setPrototypeOf(this, value);
  },
  get: function() {
    return Object.getPrototypeOf(this);
  }
});

или скорее:
Object.setPrototypeOf = function(obj, value) {
  obj.__proto__ = value;
};
Object.getPrototypeOf = function(obj) {
  return obj.__proto__;
};

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

А насчет их осторожности, тут скорее просто хотят себя огородить от лишних проблем в будущем (вдруг захотят все же убрать свойство).

trikadin 22.07.2015 15:14

Цитата:

Сообщение от kobezzza
Но в примере с партиал классами это совсем безобидная операция, не на что не влияет

Ну это да.

Erolast 22.07.2015 15:15

Цитата:

помню свойство __proto__ вынули из раздела deprecated и стандартизировали в ES6.
До ES6 его вообще не было (http://www.ecma-international.org/ecma-262/5.1/, ctrl+f), в ES6 его добавили сразу как legacy.

Цитата:

Annex B (normative) Additional ECMAScript Features for Web Browsers

The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript host is a web browser. The content of this annex is normative but optional if the ECMAScript host is not a web browser.

NOTE This annex describes various legacy features and other characteristics of web browser based ECMAScript implementations. All of the language features and behaviours specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification. However, the usage of these features by large numbers of existing web pages means that web browsers must continue to support them. The specifications in this annex defined the requirements for interoperable implementations of these legacy features.

These features are not considered part of the core ECMAScript language. Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. ECMAScript implementations are discouraged from implementing these features unless the implementation is part of a web browser or is required to run the same legacy ECMAScript code that web browsers encounter.
http://www.ecma-international.org/ec...r-web-browsers

__proto__ входит туда же, под индексом "B.2.2.1" - http://www.ecma-international.org/ec...type.__proto__

То есть, юзать, конечно же, можно, но, во-первых, отличные от браузеров окружения не обязаны его поддерживать, а во-вторых, это прямо не рекомендуется в спецификации (а значит, в один прекрасный момент может быть запрещено в каком-нибудь 2016 strict mode).

FINoM 27.07.2015 22:18

Где можно посмотреть список фич ES7, поддерживаемых в Babel, желательно, с небольшими примерами?


Часовой пояс GMT +3, время: 05:12.