dynamically import a React Component if that file exists, otherwise show a default message
I want to conditionally import a React Component if the file exists and if not do something else. For example show a default view or message.
I tried this:
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
However the linter is complaining that I should not try to dynamicaly require a file, but use a string literal instead.
Is there a cleaner approach to to what I'm trying to achieve?
javascript reactjs webpack jsx eslint
add a comment |
I want to conditionally import a React Component if the file exists and if not do something else. For example show a default view or message.
I tried this:
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
However the linter is complaining that I should not try to dynamicaly require a file, but use a string literal instead.
Is there a cleaner approach to to what I'm trying to achieve?
javascript reactjs webpack jsx eslint
add a comment |
I want to conditionally import a React Component if the file exists and if not do something else. For example show a default view or message.
I tried this:
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
However the linter is complaining that I should not try to dynamicaly require a file, but use a string literal instead.
Is there a cleaner approach to to what I'm trying to achieve?
javascript reactjs webpack jsx eslint
I want to conditionally import a React Component if the file exists and if not do something else. For example show a default view or message.
I tried this:
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
However the linter is complaining that I should not try to dynamicaly require a file, but use a string literal instead.
Is there a cleaner approach to to what I'm trying to achieve?
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
let Recipe;
try
Recipe = require(`docs/app/Recipes/$props.componentName`);
catch (e)
Recipe = () => <div>Not found</div>;
javascript reactjs webpack jsx eslint
javascript reactjs webpack jsx eslint
edited Nov 16 '18 at 6:56
rubentd
asked Nov 15 '18 at 19:06
rubentdrubentd
1,089922
1,089922
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
The problem is this approach is that it kills bundle optimizations and includes all files from docs/app/Recipes/
into a bundle, even if they aren't used.
A better way to write this is to use <React.Suspense>
and React.lazy
:
const Recipe = React.lazy(() =>
import(`docs/app/Recipes/$props.componentName`)
.catch(() => ( default: () => <div>Not found</div> ))
);
Which is used as:
<React.Suspense fallback='loading...'><Recipe/></React.Suspense>
A cleaner way to do this and avoid linter error is to have a map of possible components:
import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...
const componentsMap = Foo, Bar ;
...
const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;
In this case props.componentName
can be validated if needed.
add a comment |
in fact there is. With the recent release of React v16.6.0 "lazy code splitting" was introduced. This is how it works, it makes sense to use it together with reacts' 'suspense':
import React, lazy, Suspense from 'react';
const Recipe = lazy(() =>import(`./docs/app/Recipes/$props.componentName`));
function SomeComponent()
return (
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
);
To handle the case that the component isn't found you can use Error Boundaries. You would wrap your component with it like this:
<ErrorBoundary>
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
</ErrorBoundary>
Best you read more about it directly on the react docs I linked above.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326353%2fdynamically-import-a-react-component-if-that-file-exists-otherwise-show-a-defau%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The problem is this approach is that it kills bundle optimizations and includes all files from docs/app/Recipes/
into a bundle, even if they aren't used.
A better way to write this is to use <React.Suspense>
and React.lazy
:
const Recipe = React.lazy(() =>
import(`docs/app/Recipes/$props.componentName`)
.catch(() => ( default: () => <div>Not found</div> ))
);
Which is used as:
<React.Suspense fallback='loading...'><Recipe/></React.Suspense>
A cleaner way to do this and avoid linter error is to have a map of possible components:
import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...
const componentsMap = Foo, Bar ;
...
const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;
In this case props.componentName
can be validated if needed.
add a comment |
The problem is this approach is that it kills bundle optimizations and includes all files from docs/app/Recipes/
into a bundle, even if they aren't used.
A better way to write this is to use <React.Suspense>
and React.lazy
:
const Recipe = React.lazy(() =>
import(`docs/app/Recipes/$props.componentName`)
.catch(() => ( default: () => <div>Not found</div> ))
);
Which is used as:
<React.Suspense fallback='loading...'><Recipe/></React.Suspense>
A cleaner way to do this and avoid linter error is to have a map of possible components:
import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...
const componentsMap = Foo, Bar ;
...
const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;
In this case props.componentName
can be validated if needed.
add a comment |
The problem is this approach is that it kills bundle optimizations and includes all files from docs/app/Recipes/
into a bundle, even if they aren't used.
A better way to write this is to use <React.Suspense>
and React.lazy
:
const Recipe = React.lazy(() =>
import(`docs/app/Recipes/$props.componentName`)
.catch(() => ( default: () => <div>Not found</div> ))
);
Which is used as:
<React.Suspense fallback='loading...'><Recipe/></React.Suspense>
A cleaner way to do this and avoid linter error is to have a map of possible components:
import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...
const componentsMap = Foo, Bar ;
...
const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;
In this case props.componentName
can be validated if needed.
The problem is this approach is that it kills bundle optimizations and includes all files from docs/app/Recipes/
into a bundle, even if they aren't used.
A better way to write this is to use <React.Suspense>
and React.lazy
:
const Recipe = React.lazy(() =>
import(`docs/app/Recipes/$props.componentName`)
.catch(() => ( default: () => <div>Not found</div> ))
);
Which is used as:
<React.Suspense fallback='loading...'><Recipe/></React.Suspense>
A cleaner way to do this and avoid linter error is to have a map of possible components:
import Foo from 'docs/app/Recipes/Foo';
import Bar from 'docs/app/Recipes/Bar';
...
const componentsMap = Foo, Bar ;
...
const Recipe = componentsMap[props.componentName] || () => <div>Not found</div>;
In this case props.componentName
can be validated if needed.
edited Jan 14 at 9:34
answered Nov 15 '18 at 19:43
estusestus
77.4k23114234
77.4k23114234
add a comment |
add a comment |
in fact there is. With the recent release of React v16.6.0 "lazy code splitting" was introduced. This is how it works, it makes sense to use it together with reacts' 'suspense':
import React, lazy, Suspense from 'react';
const Recipe = lazy(() =>import(`./docs/app/Recipes/$props.componentName`));
function SomeComponent()
return (
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
);
To handle the case that the component isn't found you can use Error Boundaries. You would wrap your component with it like this:
<ErrorBoundary>
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
</ErrorBoundary>
Best you read more about it directly on the react docs I linked above.
add a comment |
in fact there is. With the recent release of React v16.6.0 "lazy code splitting" was introduced. This is how it works, it makes sense to use it together with reacts' 'suspense':
import React, lazy, Suspense from 'react';
const Recipe = lazy(() =>import(`./docs/app/Recipes/$props.componentName`));
function SomeComponent()
return (
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
);
To handle the case that the component isn't found you can use Error Boundaries. You would wrap your component with it like this:
<ErrorBoundary>
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
</ErrorBoundary>
Best you read more about it directly on the react docs I linked above.
add a comment |
in fact there is. With the recent release of React v16.6.0 "lazy code splitting" was introduced. This is how it works, it makes sense to use it together with reacts' 'suspense':
import React, lazy, Suspense from 'react';
const Recipe = lazy(() =>import(`./docs/app/Recipes/$props.componentName`));
function SomeComponent()
return (
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
);
To handle the case that the component isn't found you can use Error Boundaries. You would wrap your component with it like this:
<ErrorBoundary>
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
</ErrorBoundary>
Best you read more about it directly on the react docs I linked above.
in fact there is. With the recent release of React v16.6.0 "lazy code splitting" was introduced. This is how it works, it makes sense to use it together with reacts' 'suspense':
import React, lazy, Suspense from 'react';
const Recipe = lazy(() =>import(`./docs/app/Recipes/$props.componentName`));
function SomeComponent()
return (
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
);
To handle the case that the component isn't found you can use Error Boundaries. You would wrap your component with it like this:
<ErrorBoundary>
<Suspense fallback=<Spinner/>>
<Recipe />
</Suspense>
</ErrorBoundary>
Best you read more about it directly on the react docs I linked above.
answered Nov 15 '18 at 19:35
Fabian HinsenkampFabian Hinsenkamp
1716
1716
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326353%2fdynamically-import-a-react-component-if-that-file-exists-otherwise-show-a-defau%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown