У меня есть общая (React) библиотека компонентов, которую я создаю.Есть компонент PrivateRoute
, который я хочу включить.Однако, когда я импортирую компонент из библиотеки модулей в другое приложение, я получаю сообщение об ошибке:
Ошибка: сбой инварианта: вы не должны использовать вне
Компонент PrivateRoute
оборачивает компонент react-router/Route
логикой аутентификации и перенаправляет неаутентифицированные запросы на вход в систему:
библиотека компонентов
import { Route, Redirect } from 'react-router';
/* ... */
class PrivateRoute extends Component {
/* ... */
render() {
const {
component: Comp, authState, loginPath, ...rest
} = this.props;
return (
<Route
{...rest}
render={props => authState === SIGNED_IN ? (
<Comp {...props} />
) : (
<Redirect
to={{
pathname: loginPath,
}}
/>
)}
/>
);
}
}
Затем я импортирую компонент в отдельный (React) проект:
create-реагировать-приложение
import { Router } from 'react-router';
import { PrivateRoute } from 'component-library';
/* ... */
class App extends Component {
// "history" is passed in via props from the micro frontend controller.
/* ... */
render() {
return (
<Router history={this.props.history}>
{/* ... */}
<PrivateRoute path="/protected" component={ProtectedView} />
</Router>
);
}
}
Это будет работать, как ожидается, если компонент PrivateRoute
определяется в приложении create-реакции-app .Однако перемещение этого компонента в разделяемую библиотеку приводит к ошибке.
Я попытался создать библиотеку с выводом веб-пакета libraryTarget
, установленным на commonjs2 .Но я также попробовал umd .Я также попробовал с Rollup.Все с одинаковыми результатами.
webpack.config.js
module.exports = {
//...
output: {
path: path.resolve(__dirname, 'dist/'),
publicPath: '',
filename: '[name].js',
libraryTarget: 'commonjs2',
},
//...
};
Я предполагаю, что проблема заключается в построении библиотеки компонентов, поскольку выдается ошибка инварианта.когда Redirect
не может найти RouterContext
.Хотя библиотека собирается без ошибок, кажется, что импорт скомпилированного / встроенного кода является проблемой.
Может также быть два экземпляра React, вызывающих проблему с API контекста.Однако react-router
не использует Context API.Он использует mini-create-react-context
polyfill.
Есть мысли или идеи, как решить эту проблему?