компоненты фичи, я в index.ts файле реэкспортирую эти компоненты(рис. 1)
Aside простой компонент
export const Aside = ({className}: Props) => {
return <div className={className}>Aside</div>;
};
Хочу его стилизовать через styled-components.
Делаю так
import {Aside} from 'features/Layouts';
export const StyledAside = styled(Aside)`
width: 300px;
`;
Получаю ошибку Cannot read properties of undefined (reading 'Aside')
Если импортировать с полным путем до Aside, то компонент стилизуется
Вот так:
import {Aside} from 'features/Layouts/components/Aside';
Не пойму.. Вебпак не смог пути правильные вывести или стайлед компонент не смог их понять?
Выводил в консоль.лог
import * as Layouts from 'features/Layouts';
console.log(Layouts);
Вроде есть этот Aside (рис. 2)
Сделай console.log(Aside) в случае с импортом из index.tsx, перед тем как предеавать его в styled(Aside)
Та же ошибка будет. Вопрос почему..) Cannot read properties of undefined (reading 'Aside')
Ну сделай import * as blablabla from 'features/Layouts'; console.log(blablabla) Посмотри что модуль вообще экпортирует
На втором скрине) Самое последнее предложение
import {Aside} from 'features/Layouts'; console.log(Aside) Что будет в логе? undefined?
Ошибка будет говорю же)
А стек у этой ошибки есть?
Да, он ведет до места где используется export const StyledAside = styled(Aside)` width: 300px; `;
ну хоршо, убери это строку и воткни там console.log(Aside), в нем будет undefined?
А у тебя там случайно нет циклической зависимости? ну что-то типо index.tsx -> styled.ts -> index.tsx?
Ну как сказать. Вроде нет. И лейаут и асайд реэкспортируются из index.tsx А уже в лейауте(styles.ts) имотрируется асайд
Это vscode? Нет плагина который бы следил за этим (всяко лучше чем самому по файлам бегать)
styles.ts ты как импортируешь, покажи
В лейуте мне нужны стили которые описал в styles)
У тебя циклическая зависимость
У тебя L/styles.tsx ссылается на index.tsx L/Index.tsx на L/styles.tsx index.tsx на L/index.tsx
Не очень понятно, но спасибо, посижу покурю это)
Вообще если используешь eslint для него можешь поставить правило https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-cycle.md
Добавил правило. Не ругается import {Aside} from 'features/Layouts';
Аналогично)
"import/no-cycle": 2 а так? Ну странно ну проверь руками есть ли цикл, перейди, по файликам выше как я писал, если вернешься к тому же файлику с которого начинал, значит цикл есть=) Может правило не отрабатывает, а может я ошибся и цикла нет
С Aside перейти? import {Aside} from 'features/Layouts';
Да можешь с любого начинать, если это цикл ты в любом случае по всем по ним пройдешься
Обсуждают сегодня