Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate frontend to ESM #6717

Open
PyvesB opened this issue Jul 9, 2021 · 1 comment
Open

Migrate frontend to ESM #6717

PyvesB opened this issue Jul 9, 2021 · 1 comment
Labels
core Server, BaseService, GitHub auth frontend The React app and the infrastructure that supports it

Comments

@PyvesB
Copy link
Member

PyvesB commented Jul 9, 2021

This is related to #6651, in particular #6651 (comment).

Problem

Gatsby does not support ESM. See gatsbyjs/gatsby#23705 and linked discussions for more information.

In particular, when running npm start midway through migrating the whole code to ESM, I was getting errors similar to the following:

[frontend] TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension "" for C:...\workspace\shields.cache\tmp-5248-0orlJ0tI72FY

npm run build was also producing different kinds of errors.

Current workaround

The solution was to break the frontend down into a separate module with its own frontend/package.json. Unlike Shields' top-level package.json, frontend/package.json does not contain the mention "type": "module", in other words it is still a CommonJS module.

In addition to mandating the extra frontend/package.json, the solution has the following caveats:

  • the Babel configuration must be specified in frontend/package.json.
  • the gatsby dependency must be specified in both package.json and frontend/package.json, Gatsby will otherwise complain that the frontend package is not a Gatsby project.
  • the start and build scripts from package.json have an extra cd frontend step so that Gatsby is run from frontend/package.json.
  • in line with the directory where Gatsby is now run, gatsby-browser.js, gatsby-config.js and gatsby-node.js have been moved to the frontend directory.
  • the supported-features.json and service-definitions.yml files are now produced in the frontend directory. This is only a minor detail to make relative paths simpler.
  • the result of the build script, i.e. the public folder, is moved up one level back into the project's root. Gatsby produces public in the frontend directory where it's run and that can't be changed (Configurable output folder gatsbyjs/gatsby#1878), and Heroku expects public to be in the project's root and that can't be changed (
    Support running an app from a subdirectory heroku/heroku-buildpack-nodejs#385). Additionally, our Cypress end-to-end setup will expect public to be in the root as well.
  • the require-hacker dependency and the mocha-ignore-pngs.js file were removed, as not compatible with ESM. These probably aren't needed anymore, as the ESM loader ignores PNGs anyway if my understanding is correct.
  • the import statements in make-badge-url.js must be carefully tested, as they are used both by the ESM loader and Typescript loader, which have slightly different behaviours. For example, import { URL } from 'url' won't work there.

Future work

Once Gatsby becomes compatible with ESM, we would simply need to revert all aforementioned workarounds (apart from the require-hacker one), and potentially convert gatsby-browser.js, gatsby-config.js and gatsby-node.js to ESM formats as well. Additionally, it is my understanding that we will need to add js file extensions to the existing relative imports in the frontend code.

@PyvesB PyvesB added frontend The React app and the infrastructure that supports it core Server, BaseService, GitHub auth labels Jul 9, 2021
@chris48s
Copy link
Member

chris48s commented Jun 18, 2023

This issue is kind of still relevant but has changed substantially.

Now that we are off of Gatsby, all the detail above has changed, but having migrated to Docusaurus, we do still have some CommonJS frontend code (but a lot less). See #9014 (comment)

The relevant upstream issues are now:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Server, BaseService, GitHub auth frontend The React app and the infrastructure that supports it
Projects
None yet
Development

No branches or pull requests

2 participants