Serve a static pre-rendered version of a create-react-app app only to web crawlers2019 Community Moderator ElectionAngular data-binding not working with Jadecreate-react-app build doen't work in sub directory pathDeploying create-react-app - Statically vs. Dynamically?Serve another(standalone) page or static file in website built with reactHow to use react within Express?How to make express serve static files from another upper directory?Other endpoints are ignored when using express.staticStatic images are not loading after npm run build in create-react-appWhy does React routes doesn't work on server properly?React-snap and register service worker

Why don't MCU characters ever seem to have language issues?

Peter's Strange Word

Force user to remove USB token

Replacing Windows 7 security updates with anti-virus?

The bar has been raised

Why is there a voltage between the mains ground and my radiator?

Are babies of evil humanoid species inherently evil?

Rejected in 4th interview round citing insufficient years of experience

Do f-stop and exposure time perfectly cancel?

What are some noteworthy "mic-drop" moments in math?

What is wrong with Escaped Shapeshifter's original wording?

In the late 1940’s to early 1950’s what technology was available that could melt a LOT of ice?

My story is written in English, but is set in my home country. What language should I use for the dialogue?

Making a sword in the stone, in a medieval world without magic

"One can do his homework in the library"

BitNot does not flip bits in the way I expected

Why is this plane circling around the Lucknow airport every day?

Could a cubesat be propelled to the moon?

They call me Inspector Morse

Algorithm to convert a fixed-length string to the smallest possible collision-free representation?

Does "variables should live in the smallest scope as possible" include the case "variables should not exist if possible"?

How do anti-virus programs start at Windows boot?

Examples of a statistic that is not independent of sample's distribution?

Solving "Resistance between two nodes on a grid" problem in Mathematica



Serve a static pre-rendered version of a create-react-app app only to web crawlers



2019 Community Moderator ElectionAngular data-binding not working with Jadecreate-react-app build doen't work in sub directory pathDeploying create-react-app - Statically vs. Dynamically?Serve another(standalone) page or static file in website built with reactHow to use react within Express?How to make express serve static files from another upper directory?Other endpoints are ignored when using express.staticStatic images are not loading after npm run build in create-react-appWhy does React routes doesn't work on server properly?React-snap and register service worker










1















I have built a web app using create-react-app and react-router. It is served by an express server on the backend which also runs a GraphQL API. The front end of the website is served by express using the following code:



// Sending React Frontend Build
app.use(express.static(`$__dirname/../frontend/build`))
app.get('/*', (req, res) =>
res.sendFile(path.join(__dirname, '../frontend/build/index.html'))
)


I have now come to the realisation that when using CRA, web crawlers and social media websites can't access the information easily as the content of the page is injected by javascript.



It's too late in this project for me to go back and start with something like nextjs.



A simple solution seems to be create a prerendered version of the website using a headless browser, and serve this version only to crawlers via their user agent.



For this I tried using react-snap, which runs post yarn build of the front end to create static HTML files. While this mostly works (especially from a web crawler perspective) it does seem to break some functionality, as such for human users I still want to serve the SPA bundle created by yarn build and only serve the static HTML version to crawlers.



Implemented by something like this on the backend:



// Sending React Frontend Build
app.use(express.static(`$__dirname/../frontend/build`))
app.get('/*', (req, res) =>
if (crawlerUserAgents.includes(req.headers['user-agent']))
// serve pre-rendered static HTML version of the web app
else
// serve normal injected version of the web app
res.sendFile(path.join(__dirname, '../frontend/build/index.html'))

)


But the output of react-snap doesn't seem to be able to create an isolated static version of the site in a separate folder within the build folder. So I can't seem to serve one version to humans and one to web crawlers.



Is there a way to serve a static version of the website via Express using react-snap or something similar? I am aware of commerical solutions to this but would prefer something simple via express.










share|improve this question


























    1















    I have built a web app using create-react-app and react-router. It is served by an express server on the backend which also runs a GraphQL API. The front end of the website is served by express using the following code:



    // Sending React Frontend Build
    app.use(express.static(`$__dirname/../frontend/build`))
    app.get('/*', (req, res) =>
    res.sendFile(path.join(__dirname, '../frontend/build/index.html'))
    )


    I have now come to the realisation that when using CRA, web crawlers and social media websites can't access the information easily as the content of the page is injected by javascript.



    It's too late in this project for me to go back and start with something like nextjs.



    A simple solution seems to be create a prerendered version of the website using a headless browser, and serve this version only to crawlers via their user agent.



    For this I tried using react-snap, which runs post yarn build of the front end to create static HTML files. While this mostly works (especially from a web crawler perspective) it does seem to break some functionality, as such for human users I still want to serve the SPA bundle created by yarn build and only serve the static HTML version to crawlers.



    Implemented by something like this on the backend:



    // Sending React Frontend Build
    app.use(express.static(`$__dirname/../frontend/build`))
    app.get('/*', (req, res) =>
    if (crawlerUserAgents.includes(req.headers['user-agent']))
    // serve pre-rendered static HTML version of the web app
    else
    // serve normal injected version of the web app
    res.sendFile(path.join(__dirname, '../frontend/build/index.html'))

    )


    But the output of react-snap doesn't seem to be able to create an isolated static version of the site in a separate folder within the build folder. So I can't seem to serve one version to humans and one to web crawlers.



    Is there a way to serve a static version of the website via Express using react-snap or something similar? I am aware of commerical solutions to this but would prefer something simple via express.










    share|improve this question
























      1












      1








      1








      I have built a web app using create-react-app and react-router. It is served by an express server on the backend which also runs a GraphQL API. The front end of the website is served by express using the following code:



      // Sending React Frontend Build
      app.use(express.static(`$__dirname/../frontend/build`))
      app.get('/*', (req, res) =>
      res.sendFile(path.join(__dirname, '../frontend/build/index.html'))
      )


      I have now come to the realisation that when using CRA, web crawlers and social media websites can't access the information easily as the content of the page is injected by javascript.



      It's too late in this project for me to go back and start with something like nextjs.



      A simple solution seems to be create a prerendered version of the website using a headless browser, and serve this version only to crawlers via their user agent.



      For this I tried using react-snap, which runs post yarn build of the front end to create static HTML files. While this mostly works (especially from a web crawler perspective) it does seem to break some functionality, as such for human users I still want to serve the SPA bundle created by yarn build and only serve the static HTML version to crawlers.



      Implemented by something like this on the backend:



      // Sending React Frontend Build
      app.use(express.static(`$__dirname/../frontend/build`))
      app.get('/*', (req, res) =>
      if (crawlerUserAgents.includes(req.headers['user-agent']))
      // serve pre-rendered static HTML version of the web app
      else
      // serve normal injected version of the web app
      res.sendFile(path.join(__dirname, '../frontend/build/index.html'))

      )


      But the output of react-snap doesn't seem to be able to create an isolated static version of the site in a separate folder within the build folder. So I can't seem to serve one version to humans and one to web crawlers.



      Is there a way to serve a static version of the website via Express using react-snap or something similar? I am aware of commerical solutions to this but would prefer something simple via express.










      share|improve this question














      I have built a web app using create-react-app and react-router. It is served by an express server on the backend which also runs a GraphQL API. The front end of the website is served by express using the following code:



      // Sending React Frontend Build
      app.use(express.static(`$__dirname/../frontend/build`))
      app.get('/*', (req, res) =>
      res.sendFile(path.join(__dirname, '../frontend/build/index.html'))
      )


      I have now come to the realisation that when using CRA, web crawlers and social media websites can't access the information easily as the content of the page is injected by javascript.



      It's too late in this project for me to go back and start with something like nextjs.



      A simple solution seems to be create a prerendered version of the website using a headless browser, and serve this version only to crawlers via their user agent.



      For this I tried using react-snap, which runs post yarn build of the front end to create static HTML files. While this mostly works (especially from a web crawler perspective) it does seem to break some functionality, as such for human users I still want to serve the SPA bundle created by yarn build and only serve the static HTML version to crawlers.



      Implemented by something like this on the backend:



      // Sending React Frontend Build
      app.use(express.static(`$__dirname/../frontend/build`))
      app.get('/*', (req, res) =>
      if (crawlerUserAgents.includes(req.headers['user-agent']))
      // serve pre-rendered static HTML version of the web app
      else
      // serve normal injected version of the web app
      res.sendFile(path.join(__dirname, '../frontend/build/index.html'))

      )


      But the output of react-snap doesn't seem to be able to create an isolated static version of the site in a separate folder within the build folder. So I can't seem to serve one version to humans and one to web crawlers.



      Is there a way to serve a static version of the website via Express using react-snap or something similar? I am aware of commerical solutions to this but would prefer something simple via express.







      javascript reactjs web-crawler serverside-rendering react-snap






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Mar 6 at 15:56









      BML91BML91

      7442726




      7442726






















          0






          active

          oldest

          votes











          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
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55027245%2fserve-a-static-pre-rendered-version-of-a-create-react-app-app-only-to-web-crawle%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















          draft saved

          draft discarded
















































          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.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55027245%2fserve-a-static-pre-rendered-version-of-a-create-react-app-app-only-to-web-crawle%23new-answer', 'question_page');

          );

          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







          Popular posts from this blog

          Save data to MySQL database using ExtJS and PHP [closed]2019 Community Moderator ElectionHow can I prevent SQL injection in PHP?Which MySQL data type to use for storing boolean valuesPHP: Delete an element from an arrayHow do I connect to a MySQL Database in Python?Should I use the datetime or timestamp data type in MySQL?How to get a list of MySQL user accountsHow Do You Parse and Process HTML/XML in PHP?Reference — What does this symbol mean in PHP?How does PHP 'foreach' actually work?Why shouldn't I use mysql_* functions in PHP?

          Compiling GNU Global with universal-ctags support Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Tags for Emacs: Relationship between etags, ebrowse, cscope, GNU Global and exuberant ctagsVim and Ctags tips and trickscscope or ctags why choose one over the other?scons and ctagsctags cannot open option file “.ctags”Adding tag scopes in universal-ctagsShould I use Universal-ctags?Universal ctags on WindowsHow do I install GNU Global with universal ctags support using Homebrew?Universal ctags with emacsHow to highlight ctags generated by Universal Ctags in Vim?

          Add ONERROR event to image from jsp tldHow to add an image to a JPanel?Saving image from PHP URLHTML img scalingCheck if an image is loaded (no errors) with jQueryHow to force an <img> to take up width, even if the image is not loadedHow do I populate hidden form field with a value set in Spring ControllerStyling Raw elements Generated from JSP tagds with Jquery MobileLimit resizing of images with explicitly set width and height attributeserror TLD use in a jsp fileJsp tld files cannot be resolved