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

Safort 07.12.2014 13:50

kobezzza,
Цитата:

Ну, количество кода практически не увеличивается, если конечно не юзать полифил для генераторов, то тогда да.
У кого как. У меня код простенького роутера увеличился с 8кб до 28 и это без генераторов.

kobezzza 07.12.2014 13:52

Цитата:

Сообщение от Safort (Сообщение 345274)
kobezzza,

У кого как. У меня код простенького роутера увеличился с 8кб до 28 и это без генераторов.

Жесть, а из-за чего? Всмысле что он там нагенерил? Мб ты подключил ещё рантайм либу полифил? 28 кб это в гзипе (прост без гзипа нет смысла сравнивать объём) ?

Safort 07.12.2014 14:04

kobezzza,
Цитата:

Жесть, а из-за чего? Всмысле что он там нагенерил?
Мой код :D

Цитата:

Мб ты подключил ещё рантайм либу полифил?
Точно! У меня же там ещё карты кода подключены) Без них всего лишь на 1кб больше.

Цитата:

28 кб это в гзипе (прост без гзипа нет смысла сравнивать объём) ?
Неа, без гзипа.

kobezzza 07.12.2014 14:13

Цитата:

Точно! У меня же там ещё карты кода подключены) Без них всего лишь на 1кб больше.
Ну вот, я же говорю :) Серьёзная простыня кода только на генераторах.

Safort 07.12.2014 14:26

kobezzza,
помню, ещё с es6transpliter'ом мучился, когда пытался карты кода использовать. Поначалу думал, что совсем туплю, а потом случайно заглянул в раздел "проблемы"(issues), а там ;(

kobezzza 07.12.2014 14:42

Цитата:

Сообщение от Safort (Сообщение 345298)
kobezzza,
помню, ещё с es6transpliter'ом мучился, когда пытался карты кода использовать. Поначалу думал, что совсем туплю, а потом случайно заглянул в раздел "проблемы"(issues), а там ;(

Если честно, то я никада не юзал сорс мапы, как то не было нужды, но по хорошему для SS надо бы запилить.

Safort 08.12.2014 09:14

А вот и черновик спеки http://wiki.ecmascript.org/doku.php?...4_draft_rev_29

melky 08.12.2014 10:22

Цитата:

Сообщение от kobezzza
Если честно, то я никада не юзал сорс мапы, как то не было нужды, но по хорошему для SS надо бы запилить.

дебажишь сразу файл "myscript.js" ? а как же модули там всякие
у меня от открытия такого файла в несколько десятков тысяч строк консоль взрывается

kobezzza 08.12.2014 11:28

Цитата:

Сообщение от melky (Сообщение 345438)
дебажишь сразу файл "myscript.js" ? а как же модули там всякие
у меня от открытия такого файла в несколько десятков тысяч строк консоль взрывается

Я console.log ниндзя :D

kobezzza 08.12.2014 11:28

В 6to5 добавят опциональную декларацию типов из ES7!

https://github.com/6to5/6to5/issues/260

kobezzza 10.12.2014 13:33

Поигрался с Символами из ES7, офигенная тема, теперь мы можем срать в Object.prototype и не боятся наступить на мину :)

Object.prototype[Symbol.referenceLength] = function () {
    return Object.keys(this).length;
};

var foo = {a: 1, b: 2};
foo::length() // 2


Вообще ES7 делает качественный скачок в развитии языка, что не может не радовать.

melky 10.12.2014 17:55

Цитата:

Сообщение от kobezzza
Symbol.referenceLength

Цитата:

Сообщение от kobezzza
::length

вау!

kobezzza 10.12.2014 19:12

Копался на wiki GCC и обнаружил 2 вещи:

1) Теперь GCC частично понимает ES6 и даже умеет работать как транслятор: https://github.com/google/closure-co...ki/ECMAScript6

2) Аннотацию @expose решили выпилить (из доки её уже потёрли) и заменить на @exports: https://github.com/google/closure-compiler/issues/636. Беда в том, что @exports сейчас адово глючит и последняя стабильная сборка не поддерживает часть новых опций этой аннотации, т.е. они поспешили удалить @expose, но не доделали @exports, печалька.

kobezzza 15.12.2014 18:35

https://github.com/6to5/6to5/pull/29...mment-66951875
Скорость автора всех шокирует :D

Safort 28.12.2014 23:56

Наш немецкий коллега снова радует наиподробнейшими статьями http://www.2ality.com/2014/12/es6-symbols.html

Safort 06.01.2015 08:30

И ещё одна годнота http://www.2ality.com/2015/01/es6-maps-sets.html
На этот раз про Maps и Sets.

Safort 07.01.2015 00:49

Тут такое дело.. короче, я не осилил модули с использованием 6to5.
Как быть? Тестирую на клиенте вот это:
index.js
import aaa from 'c_module';

aaa();


c_module.js
function aaa() {
  console.log('text');
}


exports default aaa;


Компилируется без ошибок, но в браузере выдаёт это:
Цитата:

ReferenceError: require is not defined
Не пойму, ему ещё что-то надо(доп. библы) или что?
Будьте добры, подскажите кто пользуется.

Erolast 07.01.2015 08:30

Цитата:

Не пойму, ему ещё что-то надо(доп. библы) или что?
Аха, сходу только в ноде заработает, для браузеров, вроде как, нужно прикручивать browserify.

Но лично я компилирую в AMD с использованием RequireJS - это асинхронная загрузка, что плюс к скорости. Выглядит так:
//gulptask.js
gulp.task("build", function() {
    gulp.src(`./src/${page}/*.js`)
        .pipe(sourcemaps.init())
        .pipe(es6to5({
            modules: "amd",
            moduleIds: true
        }))
        .pipe(concat("index.js"))
        .pipe(gulpif(production, uglify()))
        .pipe(sourcemaps.wirte("./"))
        .pipe(gulp.dest(`./build/${page}`));
})

<!-- index.html -->
<script data-main="./build/index/index" src="./lib/require.js"></script>
<script>
    requirejs.config({
        enforceDefine: true,
        paths: {
            //Пути к сторонним библиотекам
            jquery: [
                "https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min", //CDN
                "./lib/jquery.js" //Фоллбек
            ]
        }
    })
</script>

Safort 07.01.2015 11:01

Erolast,
спасибо, сегодня как-нибудь попробую.

Safort 07.01.2015 11:08

Я-то надеялся что оно само всё за меня подключит

kobezzza 07.01.2015 11:53

Столкнулся с проблемой, что в Chrome в strictMode метод next у объекта генератора помечен как readOnly, но с другой стороны через defineProperty его можно поменять.

В ФФ всё ок.

Копался в спеке, но ничего не нашёл по этому поводу (может конечно проглядел), может кто в курсе или может дать ссылку на ответ? Хочется понять: это баг хрома или действительно по стандарту next readOnly (хотя это очень странно), но тогда почему через defineProperty свойство можно установить.

kobezzza 07.01.2015 12:08

Перевёл Collection на 6to5, почти не было проблем. Snakeskin не поддаётся, но баг какой то суко хитрый, пока сдался.

***

ФФ полностью воспроизводит Collection и Snakeskin без трансляции! Однако транслированный вариант пока работает быстрее.

kobezzza 07.01.2015 13:19

Ура! Я смог перевести SS на 6to5! Приятный профит: скорость транслятора увеличилась на ~10%.

cyber 07.01.2015 13:51

kobezzza, как с багом разобрался ?

Safort 07.01.2015 13:51

kobezzza,
Цитата:

ФФ полностью воспроизводит Collection и Snakeskin без трансляции!
Но ведь у тебя там classов нет, по этому не считается :D

kobezzza,
Цитата:

Ура! Я смог перевести SS на 6to5! Приятный профит: скорость транслятора увеличилась на ~10%.
Только недавно она тоже увеличилась, а сейчас ещё раз?)

kobezzza 07.01.2015 13:54

Цитата:

kobezzza, как с багом разобрался ?
А просто обновил транслятор (сегодня вышло релиза 3-4) и всё заработало :)

Цитата:

Но ведь у тебя там classов нет, по этому не считается
:p

Цитата:

Только недавно она тоже увеличилась, а сейчас ещё раз?)
Ну недавно увеличилась из-за оптимизаций, что я сделал, а сейчас из-за смены транслятора GCC смог лучше с оптимизировать код.

Вообще в целом SS работает оч шустро, но есть узкие места. Идеи по оптимизации есть, но пока лень имплементить их, уж больно муторно.

***

В целом 6to5 уже production ready транслятор, юзать можно смело. Баги встречаются, но автор просто с адовой скоростью их фиксит :)

Octane 07.01.2015 14:25

Цитата:

Сообщение от kobezzza
Столкнулся с проблемой, что в Chrome в strictMode метод next у объекта генератора помечен как readOnly, но с другой стороны через defineProperty его можно поменять.

В ФФ всё ок.

Копался в спеке, но ничего не нашёл по этому поводу (может конечно проглядел), может кто в курсе или может дать ссылку на ответ? Хочется понять: это баг хрома или действительно по стандарту next readOnly (хотя это очень странно), но тогда почему через defineProperty свойство можно установить.

function Constructor() {}

Object.defineProperty(Constructor.prototype, 'test', {
    value: 1,
    configurable: false,
    writable: false
});

var obj = new Constructor;
obj.test = 2;
alert(obj.test);

kobezzza 07.01.2015 14:33

Octane, интересно, что

function Constructor() {}

Object.defineProperty(Constructor.prototype, 'test', {
    value: 1,
    configurable: false,
    writable: false
});

var obj = new Constructor;

Object.defineProperty(obj, 'test', {
    value: 2
});

alert(obj.test);


Но вообще мой вопрос в другом: правильно ли, что next у объекта генератора read-only, т.к. в ФФ поведение другое и в стандарте ничего про это я не нашёл, ну и плюс это странно, т.к. в JS любой базовый метод можно переопределить или доопределить, например,

Array.prototype.forEach = function () {
     ...
};


И что принципиально другое в

function *foo() {
}

var bar = foo();
bar.next = function () {
    ...
};


Собственно, вот https://github.com/kobezzza/Collecti...orEach.js#L796

Octane 07.01.2015 14:44

Цитата:

Сообщение от kobezzza
В strictMode в Chrome (баг?) данный метод нельзя установить через obj.next =

почему ты считаешь это багом?
Если ты запустишь мой пример в strict режиме в любом браузере, то получишь exception
Все дело только в том, что разработчики хрома зачем-то добавили атрибуты configurable=false и writable=false для next

kobezzza 07.01.2015 14:47

Цитата:

почему ты считаешь это багом?
Потому что в стандарте нет ни слова про специальные дескрипторы этого свойства и ФФ также их нет, а в хроме есть, следовательно хром не следует стандарту ES6 и это баг :)

И ещё: Object.defineProperty позволяет обойти это поведения, я не знал про это и как я понимаю, что это так и должно быть?

Octane 07.01.2015 14:55

Да, так работает во всех браузерах. Хз где про это прочитать, у Сошникова вроде нету.
Вообще с defineProperty много проблем, даже не в strict он может на некоторых Android 4 девайсах выкинуть can't redefine property для DOM элементов или свалиться на добавлении свойства функции.

Octane 10.01.2015 19:10

Immediately-invoked function expression (IIFE)
 
Разбирался как должны себя вести функции в ES6 в следующих случаях:
function f(x = g()) {…}
function f(x = function () {…}()) {…}
не нашел вменяемой информации, но вроде как этот блок с аргументами должен выполняться вместе с function body, но что интересно, наткнулся на название повсеместно применяемого приема:
(function () {
    …
}());

(function () {
    …
})();

!function () {
    …
}();

new function () {
    …
};
Immediately-invoked function expression (IIFE)
раньше только self-executing anonymous function встречал

------------------------------------------------
как-то я пропустил эту тему Self-invoking функции :(

Safort 10.01.2015 19:50

Octane,
Цитата:

Разбирался как должны себя вести функции в ES6 в следующих случаях:
function f(x = g()) {…}
function f(x = function () {…}()) {…}
не это ли случайно искал http://dmitrysoshnikov.com/ecmascrip...of-parameters/ ?

kobezzza 10.01.2015 20:04

Цитата:

Сообщение от Safort (Сообщение 350633)
Octane,

не это ли случайно искал http://dmitrysoshnikov.com/ecmascrip...of-parameters/ ?

О, я не знал про область видимости параметров, интересно :)

Octane 10.01.2015 20:08

Я читал эту статью, но там ни слова про IIFE в дефолтных значениях, можно только догадываться что такая функция будет исполнена перед function body, так как значения вычисляются при каждом вызове функции, а не при декларации.

Safort 10.01.2015 20:15

kobezzza,
да, интересно придумали. Только вот теперь иногда придётся учитывать ещё одну область видимости)

kobezzza 10.01.2015 21:09

Цитата:

Сообщение от Safort (Сообщение 350641)
kobezzza,
да, интересно придумали. Только вот теперь иногда придётся учитывать ещё одну область видимости)

После прочтения пошел смотреть как сделано в SS, и с радостью обнаружил, что в SS запрещено декларировать JS функции :)

- template foo(a = function () {}) // Ошибка

Octane 10.01.2015 21:53

new function (x = () => this) {
  console.log(x() === this) // true
}

Safort 13.01.2015 11:25

6to5 + esnext

kobezzza 13.01.2015 11:34

Цитата:

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

Хороший пример, когда в нужное время появился качественный и нужный проект. Единственно, название они не оч удачно выбрали, т.к. со временем, когда ES6 станет стандартом, а ES7 будет внедрятся, понадобится 7to6 - с технической точки зрения у них всё ок, т.к. плагинная архитектура позволяет расширять функционал как угодно, но вот название может сбивать с толку.


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