-
Notifications
You must be signed in to change notification settings - Fork 46
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(loaders): hover decorator #466
Conversation
красава! очень хорошая идея для нашего движка метапрограммирования. Насчет реализации: У нас уже есть 2 плагина, которые занимаются похожими вещами, и конфликтуют с твоим функционалом, поэтому надо скорее всего подумать как встроить твой функционал в них:
Общие замечания: 1.
Но инлайново его не пиши, так как бабелевские плагины должны быть максимально оптимизированы на перформанс. А парсинг твоего темплейта и преобразование его в параметризованный шаблон AST занимает время. Инициализируй шаблон заранее, а потом просто его используй. Как я это вот тут делаю, например. 2.По Но в твоем случае этот метод не очень подходит, и надо игнорить функции с маленькой буквы, потому что в компоненте может быть что-то типа 3.Главная архитектурная проблема заключается в том, что мы хотим, чтобы желательно все было реактивным и с хот-релоадингом. И к тому же мы не хотим компилить дважды файл Такой, что если впринципе И здесь мы приходим к следующим проблемам:
Я думаю решение здесь это придумать какой-то универсальный хук, который будет всегда подключаться автоматом вверху компонента, и в котором будет храниться состояние для каждого инстанса
И прокидывать эту переменную в функцию Эта функция:
|
Ну и любые бабелевские плагины надо писать по TDD, так что если начнешь по моим замечаниям расширять функционал плагина Оба тестов запускаются просто через Чтобы обновить снапшоты jest для тестов бабель плагина, надо запустить через |
а, ну и как ты понял, этот функционал должен быть не вебпак лоадером, а бабелевским плагином. А точнее расширением функционала плагина |
Т.е. как заранее подготовленные константы, щас у меня получается для каждого файла будет заново темплейп парситься в AST?
Об этом методе не знал, по идеи мне нужно найти функцию выше которой по дереву будут уже идти аргументы из body, т.е. функция должна быть аргументом body. Вроде как юзать хуки в компонентах которые лежат в теле компонента не канает, нужно именно в родителя инитить.
Щас я сделал чтобы каждому присваивался свой хук. Типа hoverProps1, hoverProps2 и т.д. Ну + - идею доработки я понял, нужно вникнуть в код babel-plugin-rn-stylename-to-style, ну и вообще все что связанно с компиляцией css на startupjs |
@simonprod угумс, Так что можешь просто в наш форк сделать потом ПР, чтобы оно и Угу, создай таску в трелло, это полезная фича, чтобы ей серьезно заняться, ну и плюс ты заодно разберешься как ща наши плюшки с прекомпиляцией реализованы на бабеле. Вот еще тебе кстати хороший проект, чтобы посмотреть как через бабель реализовывать всякие штуки для препроцессинга стилей в реакте: Там чувак похожей модификацией кода через автодобавление хуков, вообще даже анимации смог реализовать и динамические css переменные через реактовский контекст. Это наверн самый крутой проект по метапрограммированию, который я видел, реализованный на бабеле. Еще можешь посмотреть как |
ага, ща он у тебя для каждого файла темплейт распарсивает, а может даже и чаще.
ну я там не говорил об обьявлении компонента внутри другого компонента, это какая-то дичь выходит) Я говорил именно о функциях типа Ну и да, хук в этой функции На самом деле можно потом алгоритм поиска улучшить тем, что просто искать ближайшую функцию, которая либо именованная и с большой буквы, либо обернута в
здесь проблема в том, что если мы хотим, чтобы работал хот-релоадинг css из отдельного файла, то на этапе препроцессинга хуки создавать не получится. Надо чтобы со стороны JS файла уже изначально был код скомпилен с учетом потенциально ховера, причем учитывая что его может вообще не быть в этом компоненте, а может быть и много. Вариант делать useHover1 useHover2 на самом деле тоже хороший, так как именно на этапе компиляции создается только то, что собственно и нужно компоненту. Для продакшена твой вариант вообще отличный, потому что чем больше кода можно для продакшена прекомпилировать и сделать статическим, тем лучше. Ну а то, что компилить css придется 2 раза, для продакшена пофиг. Так что если окажется, что динамический вариант (то есть с поддержкой хот-релоада) сделать будет сложно, то можно оставить твою реализацию текущую. Или еще лучше - сделать 2 опции в бабелевском плагине для компиляции И кстати это недоработка бабеля, что нельзя явно зависимости указать у файлов для перекомпилирования. Если вот это пофиксят в бабеле, то нам не нужно будет костыли городить, и твой статический вариант будет прекрасно работать с хот релоадингом.
на это в предыдущем комменте ответил) |
Это больше как эксперимент, интересно было сделать свой loader для вебпака
Идея в том чтобы в styl писать как обычно :hover. Поскольку те лоадеры которые юзаются щас для css, игнорят все декораторы и псевдоклассы, я написал хук useHover и внедряю его в код при компиляции
Оно работает, но если менять стили в :hover - авторелоада вебпака не будет, т.к. лоадер для .js файлов, соответсвенно изменения прилетают в бандл когда меняется js
Так же возможно не все кейсы AST дерева я учел, и лучше это делать не как лоадер, а как webpack plugin