Closed golyshevd closed 8 years ago
А это точно правильно?
А это точно правильно?
Ни один прежний тест не упал, мой тест прошел. Теперь ключи объектов железобетонно будут отсортированы на любой вложенности в любые контейнеры. По сути пришлось сделать кастомный JSON.stringify, оригинальный я использую только для сериализации примитивов.
Если знаете узкие места, я могу еще тестов добавить, скажите только какие кейсы хотите
Если знаете узкие места
По стандарту ключи в объектах не упорядочены. Реализации в разных популярных браузерах не следуют этому правилу и периодически что-то ломается, когда одни разработчики завязываются на реализацию, а другие на стандарт. Понять разработчиков браузеров можно — им нужно поддерживать наследие. Понять html-differ с таким поведением пока сложно.
Теперь ключи объектов железобетонно будут отсортированы
Да, но зачем? Это точно правильно их так сортировать? Почему текущее поведение неверное?
Есть кейс из жизни:
<body class="i-bem" data-bem='{"i-global":{},"b-page":{}}'> — было
<body class="i-bem" data-bem='{"b-page":{},"i-global":{}}'> — стало
2 часа искали причину.
Почему текущее поведение неверное?
Потому что по прежней логике объекты
[{a: 1, b: 2}]
// и
[{b: 2, a: 1}]
не эквивалентны, а точнее не всегда, потому что JSON.stringify может поменять местами ключи при сериализации. Прежняя реализация сортировки объекта не корректна, потому что спецификация не гарантирует какого-либо порядка при итерации по ключам объекта. Но в прежней реализации было сделано предположение, что порядок ключей соответствует порядку их присваивания, и это работает постолько поскольку. На это нельзя полагаться.
Есть кейс из жизни:
Тут тесты бы не упали и при прежней логике, но это проделки JSON.stringify
@zxqfox
тут, кажется, действительно автор пулл-реквеста пофиксил злостную багу, которую я описал в issue – https://github.com/bem/html-differ/issues/33
Убедили. Вариантов нет, придется резать.
Если тут все норм, выпустите новую версию enb-bem-tmpl-specs?
@golyshevd
про выпуск enb-bem-tmpl-specs
это к @blond
Спасибо за фикс
Ну тогда хотя бы этот модуль зарелизьте ) Спасибо!
Готово ;)
Без этого фикса ключи объектов внутри массивов не сортируются, поэтому рекурсивно вызываю _sortObj на каждом элементе массива
@eGavr
@truerenton @remnev