Ember.js: [QUEST] Разрешить простые классы ES6 быть сервисами

Созданный на 16 янв. 2018  ·  47Комментарии  ·  Источник: emberjs/ember.js

Теперь, когда классы RFC

Мы собираемся начать с сервисов, потому что суперкласс Service - это пустой подкласс от Ember.Object .

Однако есть еще ряд вещей, над которыми нужно работать.

Контекст и предыстория

Во-первых, не все функциональные возможности RFC реализованы. По большей части, проблемы незначительны и связаны с .extend() в подклассе ES2015 суперкласса Ember. Поскольку этот квест касается использования базовых классов ES2015, которые не расширяются от Ember.Object или Ember.Service , он не имеет прямого отношения, но @pzuraq работает над выявлением этих ограничений и написанием для них неудачных тестов.

Во-вторых, для поддержки простых объектов нам нужно будет выбрать общедоступный API для внедрения зависимостей в классы ES, что требует принятия решения о стабильном общедоступном API для внедрения зависимостей в целом. Наименьший шаг приращения - ожидать статического метода create который принимает owner , но мы можем захотеть сделать немного больше. Я возьму на себя ответственность за написание RFC.

Наконец, нам нужно будет решить, как обрабатывать вычисляемые свойства в этих новостных классах. Самый дополнительный шаг - не поддерживать вычисляемые свойства непосредственно в Ember и по-прежнему требовать Ember.set для установки свойств непосредственно в сервисах. Аддон ember-decorators можно использовать, чтобы получить сахар для этих функций.

Однако, если мы ожидаем, что люди будут чувствовать, что им нужно использовать ember-decorators каждый раз, когда они используют голые классы, мы, вероятно, должны вложить достаточно средств в Ember, чтобы этого избежать. Например, мы могли бы добавить декоратор @tracked для полей, который (на данный момент) вызывает Ember.set под капотом. Нам всем нужно будет пересмотреть наши собственные приложения, чтобы решить, сколько сервисов в реальном мире во многом полагаются на функции объектной модели Ember.

Текущий статус и рабочие элементы

  • [] Определение ограничений в текущей поддержке классов ES (🔒 @pzuraq)

    • [] Исправьте или отложите их

  • [] Напишите RFC для внедрения зависимостей вне старых классов Ember (🔒 @wycats)
  • [] Изучите реальные приложения на предмет использования функций объектной модели Ember в сервисах.

Самое полезное, что вы могли бы сделать прямо сейчас, - это просмотреть свое приложение и изучить все ваши сервисы на предмет использования определенных функций:

Total services: <count>
is an object proxy: <count>
injects another service: <count>
alias: <count>
readonly: <count>
non-volatile computed properties: <count>
observers: <count>
concatenated or merged properties: <count>
actions: <count>

Например, это мой обзор Skylight:

Total services: 9
is an object proxy: 1
injects another service: 3
alias: 1
readonly: 1
computed properties (not volatile): 0
observers: 0
concatenated or merged properties: 0
actions: 0

Общайтесь в сообществе Slack

Мы будем координировать эту работу по поводу нехватки комьюнити. Вы можете присоединиться к каналу # st-es-class-services.

Inactive Quest

Самый полезный комментарий

Я написал простой скрипт на Ruby в рамках Ember London Meetup Quest Night, чтобы протестировать все сервисы на соответствие перечисленным функциям: https://gist.github.com/sevab/497ead350f25e82c5034686c6b163192

Соответствует результатам Ghost. Не стесняйтесь опробовать свои приложения, перетащив и запустив файл в корне проекта.

Все 47 Комментарий

Приятно видеть это!

Вот мой опрос. Сюда не входят услуги, предоставляемые надстройками, а это еще около 6 услуг.

Total services: 8
injects another service: 6
is an object proxy: 0
aliases: 1
readonly: 0
non-volatile computed properties: 5
observers: 0
concatenated or merged properties: (0)
actions: 0
EventedMixin: 0

Вот результат нашего приложения,
Total services: 12 is an object proxy: 0 injects another service: 11 alias: 7 readonly: 0 computed properties (not volatile): 24 observers: 0 concatenated or merged properties: 0 actions: 0

Три исследования по производственным приложениям:
1.

Total services: 7
is an object proxy: 0
injects another service: 6
alias: 0
readonly: 0
computed properties (not volatile): 1
observers: 1
concatenated or merged properties: 0
actions: 0
    2.
Total services: 2
is an object proxy: 0
injects another service: 2
alias: 0
readonly: 0
computed properties (not volatile): 1
observers: 0
concatenated or merged properties: 0
actions: 0
    3.
Total services: 5
is an object proxy: 0
injects another service: 3
alias: 0
readonly: 0
computed properties (not volatile): 1
observers: 0
concatenated or merged properties: 0
actions: 0

Как @josemarluedke , сюда не входят услуги, предоставляемые надстройками.

Интерком (числа - это количество сервисов, например, 16 сервисов используют inject (чаще всего несколько раз, всего 30+)):

Total services: 44
is an object proxy: 0
injects another service: 16
alias: 0
readonly: 5
computed properties (not volatile): 20
observers: 0 💪
concatenated or merged properties: 0
actions: 1
Total services: 10
is an object proxy: 0
injects another service: 6
alias: 1
readonly: 2
computed properties (not volatile): 14
observers: 1
concatenated or merged properties: 0
actions: 4 👈

👉 Действия - это просто методы, вызываемые с помощью помощника связывания из шаблонов.

Вот данные о двух наиболее сложных приложениях Yapp :

Приложение 1:

Всего услуг: 18
прокси объекта: 0
вводит другую услугу: 7
псевдоним: 0
только чтение: 1
энергонезависимые вычисляемые свойства: 5
наблюдатели: 1
объединенные или объединенные свойства: 0
действий: 0

Приложение 2:

Всего услуг: 26
прокси объекта: 0
вводит другую услугу: 10
псевдоним: 0
только чтение: 5
энергонезависимые вычисляемые свойства: 15
наблюдатели: 1
объединенные или объединенные свойства: 0
действий: 0

Кроме того, в Ember.Evented сочетаются несколько сервисов, которые выполняют задачи параллелизма с помощью ember.

Вот данные о нашем основном приложении в TradeGecko

Всего услуг: 72
прокси объекта: 0
вводит другую услугу: 40
псевдоним: 1
только чтение: 6
вычисленные свойства (не летучие): 23
наблюдатели: 1
объединенные или объединенные свойства: 0
действий: 0

А также несколько задач параллелизма и одно использование unknownProperty

Одно из наших внутренних приложений:

Всего услуг: 15
прокси объекта: 0
вводит другую услугу: 12
псевдоним: 0
только чтение: 0
вычисляемые свойства (не летучие): 5
наблюдатели: 0
объединенные или объединенные свойства: 0
действий: 0

Приложение 1

Total services: 10
is an object proxy: 0
injects another service: 4
alias: 1
readonly: 0
computed properties (not volatile): 4
observers: 0
concatenated or merged properties: 0
actions: 0
EventedMixin: 1
Total services: 18
is an object proxy: 0
injects another service: 12
alias: 1
readonly: 3
non-volatile computed properties: 13
observers: 2
concatenated or merged properties: 0
actions: 0

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

Total services: 18 (excluding -dom-tree-construction, -dom-changes, -glimmer-environment, -routing)
is an object proxy: 1 (localStorage)
injects another service: 16
alias: 0
readonly: 3
non-volatile computed properties: 4
observers: 2
concatenated or merged properties: 0
actions: 0

Всего услуг: 36
прокси объекта: 2
вводит другую услугу: 24
псевдоним: 3
только чтение: 0
энергонезависимые вычисляемые свойства: 19
наблюдатели: 2
объединенные или объединенные свойства:? [не знаю, что это]
действий: 0

Для панели управления Heroku:

Total services: 22
is an object proxy: 0
injects another service: 12
alias: 4
readonly: 4
non-volatile computed properties: 22
observers: 2
concatenated or merged properties: 0
actions: 0

Для https://digitalroots.com / https://interactions.com

Total services: 15
is an object proxy: 1
injects another service: 14
alias: 4
readonly: 0
computed properties (not volatile): 73
observers: 1
concatenated or merged properties: 0
actions: 0

Для MinuteBase

Total services: 17

is an object proxy: 0
injects another service: 11
alias: 0
readonly: 2
non-volatile computed properties: 5
observers: 0
concatenated or merged properties: 0
actions: 0

Для каяко

Total services: 70

is an object proxy: 0
injects another service: 51
alias: 0
readonly: 3
non-volatile computed properties: 16
observers: 0
concatenated or merged properties: 0
actions: 0

@wycats закончил тест на разбитое поведение компонента в didRecieveAttrs здесь , и нашел еще одно испытание, которое было пропущено , что демонстрирует проблемы , которые мы будем иметь с конструкторами здесь . Я собираюсь начать добавлять тесты для поведения proto / наблюдателя.

@pzuraq, это отличная работа. Держите их!

Приложение 1

Total services: 21

is an object proxy: 4
injects another service: 6
alias: 0
readonly: 6
non-volatile computed properties: 6
observers: 0
concatenated or merged properties: 0
actions: 0
ember-concurrency tasks: 2

Приложение 2 (более раннее)

Total services: 16

is an object proxy: 1
injects another service: 11
alias: 5
readonly: 12
non-volatile computed properties: 9
observers: 0
concatenated or merged properties: 0
actions: 0

Привет, отличная работа! Для travis-web :

Всего услуг: 23
прокси объекта: 0
вводит другую услугу: 14
псевдоним: 3
только чтение: 0
энергонезависимые вычисляемые свойства: 12
наблюдатели: 1
объединенные или объединенные свойства: 0
действий: 0

Я не был уверен в том, что «это объектный прокси»; некоторые службы являются расширением других, но я думаю, вы не это имеете в виду?

Я также не был уверен, должны ли «энергонезависимые вычисляемые свойства» включать alias , но я не догадался.

@backspace alias указан отдельно, поэтому нет 😄

"прокси-объект" означает ObjectProxy.extend()

Total services: 31
is an object proxy: 0
injects another service: 27
alias: 0
readonly: 0
non-volatile computed properties: 28
observers: 0
concatenated or merged properties: 0
actions: 0

EventedMixin: 5
ember-concurrency tasks: 4

Считает призрак:

Total services: 17
is an object proxy: 3 (using `_ProxyMixin`)
injects another service: 12
alias: 0
readonly: 1
non-volatile computed properties: 6
observers: 0
concatenated or merged properties: ?
actions: 1

EventedMixin: 4

Общий объем услуг и вычисляемых свойств TradeGecko вырастет еще на несколько.

Total services: 78
is an object proxy: 0
injects another service: 40
alias: 8
readonly: 6
non-volatile computed properties: 49
observers: 0
concatenated or merged properties: 0
actions: 0

Отлично!

Похоже, что преобладающими вариантами использования являются:

  • внедрение службы
  • вычисленные свойства
  • простые макросы вычисляемых свойств, такие как псевдоним и только для чтения

Это действительно отличная новость, потому что эти функции имеют более четкий путь к прямой миграции в классы ES6, чем некоторые другие функции объектной модели Ember (например, конкатенированные свойства).

Продолжайте опросы.

Насчет действий по сервисам. Я думаю, что эта функция может не использоваться в основном из-за образования и того, что большинство людей не знают о {{action ... target=..}} . На мой взгляд, это неиспользованная функция, особенно с неизменным состоянием службы. Вот пример: https://ember-twiddle.com/228b63aeb8f8e6464960ba019d7ce720

Мне бы хотелось, чтобы действия работали с функциями и были привязаны к родительскому объекту по умолчанию, что избавило бы от необходимости использовать объект actions .

@knownasilya Мое личное мнение {{action}} - привязать функцию за вас. Следовательно, нам совсем не нужно беспокоиться о действиях старого стиля в новом коде. Что вы думаете?

Лично я считаю, что в современном Ember действия - это просто функции, а задача помощника {{action}} - привязать функцию за вас.

{{action определенно не имеет предполагаемой здесь семантики. Интересно, что я тоже придерживался этой точки зрения и был «отклонен» за фактическое исправление семантики для этого. Пожалуйста, просмотрите https://github.com/emberjs/ember.js/pull/14479, чтобы

Я бы посоветовал на этом этапе для простых целей привязки использовать помощник {{bind (предоставленный https://github.com/Serabe/ember-bind-helper), а не {{action .

Следовательно, нам совсем не нужно беспокоиться о действиях старого стиля в новом коде. Что вы думаете?

ТБХ, я не думаю, что это так просто. Мы могли бы писать «новый код», создавая замену существующей концепции (рассмотрите возможность рефакторинга службы из контроллера). Когда мы говорим о «новом коде», это код шаблона: я полностью согласен! Но рефакторинг любого количества моих шаблонов просто для рефакторинга службы кажется неидеальным.

Total services: 13
is an object proxy: 0
injects another service: 10
alias: 2
readonly: 3
computed properties (not volatile): 8
observers: 0
concatenated or merged properties: 0
actions: 0
Total services: 30
is an object proxy: 0
injects another service: 18
alias: 2
readonly: 2
computed properties (not volatile): 30
observers: 1
concatenated or merged properties: 0
actions: 0
 Всего услуг: 18
 прокси объекта: 0
 вводит другую услугу: 10
 псевдоним: 0
 только чтение: 0
 вычисляемые свойства (не летучие): 6
 наблюдатели: 0
 объединенные или объединенные свойства: 0
 действия: 2
Total services: 31
is an object proxy: 0
injects another service: 25
alias: 2
readonly: 3
computed properties (not volatile): 2
observers: 0
concatenated or merged properties: 0
actions: 0

Всего услуг: 47
прокси объекта: 0
вводит другую услугу: 39
псевдоним: 13
только чтение: 6
энергонезависимые вычисляемые свойства: 60
наблюдатели: 0
объединенные или объединенные свойства: 0
действий: 0

Total services: 32
is an object proxy: 0
injects another service: 18
alias: 0
readonly: 0
non-volatile computed properties: 6
observers: 0
concatenated or merged properties: 0
actions: 0
Total services: 10
is an object proxy: 0
injects another service: 6
alias: 0
readonly: 1
computed properties (not volatile): 0
observers: 1
concatenated or merged properties: 0
actions: 0

Основное приложение Ember Оло (~ 20k LoC в директории app для контекста / масштаба):

Total services: 22
is an object proxy: 0
injects another service: 10
alias: 1
readonly: 0
non-volatile computed properties: 21
observers: 0
concatenated or merged properties: 0
actions: 0
Total services: 16
is an object proxy: 0
injects another service: 7
alias: 0
readonly: 0
non-volatile computed properties: 1
observers: 0
concatenated or merged properties: 0
actions: 0

EventedMixin: 4

Я написал простой скрипт на Ruby в рамках Ember London Meetup Quest Night, чтобы протестировать все сервисы на соответствие перечисленным функциям: https://gist.github.com/sevab/497ead350f25e82c5034686c6b163192

Соответствует результатам Ghost. Не стесняйтесь опробовать свои приложения, перетащив и запустив файл в корне проекта.

Я также был на мероприятии Ember London Meetup Quest Night и собрал сценарий для генерации этих подсчетов ... Мой - это javascript, и вы можете вставить его в консоль веб-разработчика рядом с любым запущенным приложением ember, и он должен найти приложение ember и проанализировать его и выведите соответствующую информацию.

https://gist.github.com/vitch/591d022359bd392535c15c715a59e81a

Вот результат одного из наших приложений:

Total services: 72
is an object proxy: 0
injects another service: 58 properties in 46 services
computed properties: 149 properties in 52 services
alias: 5 properties in 4 services
readonly: 4 properties in 2 services
involatile computed properties: 148 properties in 52 services
volatile computed properties: 1 properties in 1 services
observers: 1 properties in 1 services
concatenated or merged properties: 0 (?)
actions: 0

Скрипт взломан вместе и может не работать во всех приложениях Ember или во всех версиях Ember, но, надеюсь, это полезное начало. При желании его было бы довольно легко расширить для вывода дополнительной информации ...

Total services: 76
is an object proxy: 0
injects another service: 215 properties in 59 services
computed properties: 149 properties in 53 services
alias: 132 properties in 46 services
readonly: 5 properties in 4 services
involatile computed properties: 129 properties in 52 services
volatile computed properties: 20 properties in 18 services
observers: 7 properties in 6 services
concatenated or merged properties: 0 (?)
actions: 0

Еще одно из наших приложений:

Total services: 20
is an object proxy: 0
injects another service: 0 properties in 0 services
computed properties: 0 properties in 0 services
alias: 0 properties in 0 services
readonly: 0 properties in 0 services
involatile computed properties: 0 properties in 0 services
volatile computed properties: 0 properties in 0 services
observers: 0 properties in 0 services
concatenated or merged properties: 0 (?)
actions: 0

Я должен был упомянуть раньше, что слишком много людей используют скрипт ... Я не понимал, какие «конкатенированные или объединенные свойства» должны были представлять, чтобы всегда выводить «0 (?)» На данный момент! Если кто-то может сказать мне, что это означает, я могу обновить сценарий.

Я также могу попытаться добавить информацию о Evented Mixin, если это будет полезно. И я подумал, что было бы неплохо отличить службы, определенные в приложении, от служб, определенных в надстройках?

Объединенные и объединенные свойства - это особенность объектной модели, которая в основном используется для компонентов, контроллеров и маршрутов. Примеры: actions и classNames , когда вы определяете их в подклассе, они объединяются со значением суперкласса вместо его перезаписи.

На самом деле возможно (но _ очень_ не рекомендуется) определить ваши _own_ свойства, которые делают это. Мы не ожидали, что кто-то будет использовать эту функцию, но хотели убедиться.

Я не был уверен, как они проявились в сервисах, но, похоже, во всех сервисах есть свойства concatenatedProperties и mergedProperties которые во всех случаях представляют собой пустой массив в моем тестовом приложении.

Я обновил свой скрипт, чтобы вывести информацию об этом, и вот обновленный список из одного из наших приложений:

Total services: 72
is an object proxy: 0
injects another service: 58 properties in 46 services
computed properties: 148 properties in 52 services
alias: 5 properties in 4 services
readonly: 4 properties in 2 services
involatile computed properties: 147 properties in 52 services
volatile computed properties: 1 properties in 1 services
observers: 1 properties in 1 services
concatenated properties: 0 properties in 0 services
merged properties: 0 properties in 0 services
actions: 0

@wycats Есть ли канал в Discord, на котором продолжается эта работа?

Мы будем координировать эту работу по поводу нехватки комьюнити. Вы можете присоединиться к каналу # st-es-class-services.

@pixelhandler, большая часть активной работы сейчас происходит в #st-native-classes , и есть новая проблема с квестом, которая содержит самую последнюю информацию о состоянии собственных классов, # 16927

Цели немного сместились с простых сервисов без базового класса на использование собственных классов с моделью Ember Object на данный момент, с более долгосрочной перспективой, изложенной в RFC.

@pzuraq следует закрыть?

Я так думаю, мы должны дважды проверить с помощью @wycats, но я думаю, что необоснованные собственные классы все еще нуждаются в конкретизации и, возможно, в RFCd, прежде чем мы сможем двигаться дальше с ними

Сыр был тщательно перемещен, и этот выпуск можно считать несвежим.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги