1

I am trying to use Server-side-rendering in create-react-application but i have been getting the following error. I have tried to update the babel version and change the type : 'commonjs' in package.json but is of no use.

This is the link i have been refering to implement ssr in my project link A hands-on guide for a Server-Side Rendering React app

Must use import to load ES Module:/Users/*path/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
require() of ES modules is not supported.
require() of /Users/*path/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js from /Users/Rajat/Desktop/ebullientech_ssr_example/ebullientech_io_reactjs/node_modules/react-spring/renderprops.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename objectWithoutPropertiesLoose.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /Users/*path/node_modules/@babel/runtime/helpers/esm/package.json.

My server.js file is as follows

require("@babel/register")({
  presets: ["@babel/preset-env", "@babel/preset-react"],
  plugins: [
    "@babel/plugin-proposal-class-properties",
    [
      "transform-assets",
      {
        extensions: ["css", "svg", "png"],
        name: "static/media/[name].[hash:8].[ext]",
      },
    ],
  ],
});
const React = require("react");
const ReactDOMServer = require("react-dom/server");
const App = require("../src/App").default;
const express = require("express");
const path = require("path");
const fs = require("fs");


const app = express();

app.get("/*", (req, res, next) => {
  console.log(`Request URL = ${req.url}`);
  if (req.url !== "/") {
    return next();
  }
  const reactApp = ReactDOMServer.renderToString(React.createElement(App));
  console.log(reactApp);

  const indexFile = path.resolve("build/index.html");
  fs.readFile(indexFile, "utf8", (err, data) => {
    if (err) {
      const errMsg = `There is an error: ${err}`;
      console.error(errMsg);
      return res.status(500).send(errMsg);
    }

    return res.send(
      data.replace('<div id="root"></div>', `<div id="root">${reactApp}</div>`)
    );
  });
});

app.use(express.static(path.resolve(__dirname, "../build")));

app.listen(8080, () =>
  console.log("Express server is running on localhost:8080")
);

My Package.json file is as follows:

{
  "name": "",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@fortawesome/fontawesome-free": "^5.13.0",
    "@fortawesome/fontawesome-svg-core": "^1.2.28",
    "@fortawesome/free-solid-svg-icons": "^5.13.0",
    "@fortawesome/react-fontawesome": "^0.1.9",
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.5.0",
    "@testing-library/user-event": "^7.2.1",
    "@types/babel-types": "^7.0.9",
    "axios": "^0.19.2",
    "babel-plugin-transform-assets": "^1.0.2",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-register": "^6.26.0",
    "bootstrap": "^4.4.1",
    "concurrently": "^5.2.0",
    "express": "^4.17.1",
    "fontawesome": "^5.6.3",
    "jquery": "^3.5.0",
    "nodemon": "^2.0.6",
    "package.json": "^2.0.1",
    "popper": "^1.0.1",
    "react": "^16.13.1",
    "react-bootstrap": "^1.0.1",
    "react-dom": "^16.13.1",
    "react-google-recaptcha": "^2.0.1",
    "react-google-recaptcha-v3": "^1.5.1",
    "react-helmet": "^6.0.0",
    "react-owl-carousel": "^2.3.1",
    "react-recaptcha-v3": "^1.1.0",
    "react-router": "^5.2.0",
    "react-router-dom": "^5.2.0",
    "react-router-sitemap": "^1.2.0",
    "react-scripts": "^3.4.3",
    "react-spring": "^8.0.27",
    "react-visibility-sensor": "^5.1.1",
    "reactstrap": "^8.4.1",
    "styled-components": "^5.1.0",
    "typescript": "^3.8.3"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "sitemap": "babel-node ./src/Sitemap_files/sitemap.js",
    "predeploy": "npm run sitemap",
    "nodemon": "nodemon ./server/index.cjs"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@babel/cli": "^7.11.6",
    "@babel/node": "^7.10.5",
    "@babel/plugin-proposal-class-properties": "^7.12.1",
    "@babel/preset-env": "^7.12.10",
    "@babel/preset-react": "^7.12.10",
    "@babel/register": "^7.12.10",
    "babel-cli": "^6.26.0",
    "babel-plugin-transform-assets": "^1.0.2",
    "generate-robotstxt": "^8.0.3"
  }
}

I get a different error if i try to serve the server.js without nodemon i.e:

/Users/*path/src/App.js:1
import React from 'react';
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1054:16)
    at Module._compile (internal/modules/cjs/loader.js:1102:27)
    at Module._compile (/Users/Rajat/Desktop/ebullientech_ssr_example/ebullientech_io_reactjs/node_modules/pirates/lib/index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Object.newLoader [as .js] (/Users/Rajat/Desktop/ebullientech_ssr_example/ebullientech_io_reactjs/node_modules/pirates/lib/index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Module.require (internal/modules/cjs/loader.js:1026:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (/Users/Rajat/Desktop/ebullientech_ssr_example/ebullientech_io_reactjs/server/index.cjs:16:13)

Any Help would be appreciated..Thankyou!

2 Answers 2

1

Try adding "type": "module" to your package.json.

Sign up to request clarification or add additional context in comments.

3 Comments

Hello @kuka0len ..This is the error that poped up after "ExperimentalWarning: The ESM module loader is experimental"
You should probably upgrade your Node.js
I did that...still nothing
0

Solved it. Please do add the following plugin "@babel/plugin-proposal-class-properties" using npm or yarn and refer to it in the babel/register configuration settings. Like so:

require('@babel/register')({
    ignore: [/(node_module)/],
    presets: ['@babel/preset-env', '@babel/preset-react'],
    "plugins": [
        "@babel/plugin-proposal-class-properties",
        {
            "transform-assets",
            {
              "extensions": [
                "css",
                "svg"
              ],
              "name": "static/media/[name].[hash:8].[ext]"
            }
          }
      ]
})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.