Sitecore / jss

Software development kit for JavaScript developers building web applications with Sitecore Experience Platform
https://jss.sitecore.com
Apache License 2.0
259 stars 270 forks source link

NextJs template not building with Yarn #1789

Open SLTKA opened 3 months ago

SLTKA commented 3 months ago

Describe the Bug

When using YARN instead of NPM on freshly created NextJS template (using create-sitecore-jss) it fails to build due to missing dependencies. Tested with 21.7.1. missing modules @sitecore-feaas/clientside and others

To Reproduce

run npx create-sitecore-jss@21.7.1 nextjs remove package-lock file run yarn using yarn v1.22.x run yarn start:connected

Expected Behavior

Yarn 1.x doesn't handle peerDependencies on imported packages and require them to be listed as dev or normal dependencies https://github.com/yarnpkg/yarn/issues/1503

NextJS Template should explicitly install all Peer Dependencies (as it was before in 21.6.3) OR all peerDependencies should be optional and not use require in bundled code. At the same time version of deps should be should be lenient. (https://nodejs.org/en/blog/npm/peer-dependencies).

Possible Fix

No response

Provide environment information

sc-addypathania commented 3 months ago

@SLTKA seems like this is related to a previously reported issue. Please refer to the last comment to work around this.

SLTKA commented 3 months ago

@SLTKA seems like this is related to a previously reported issue. Please refer to the last comment to work around this.

Hi @sc-addypathania thank you for the link. I'm not sure how this helps with yarn 1.x which always works as npm would with legacy-peer-deps flag and there is no option to change this.

One obvious solution would be to use npm instead of yarn and we would not have any issue. Or add missing things manually (which we did), but both approaches are not resolving the core issue on this bug report.

Below is just an opinion please don't read it as any guidance or desire for action:

Consumer (the sample projects) of packages need to ensure that they install all peer dependencies. Other dependencies should be TRULY optional and should not cause any issue (which is not the case now). On the other hand, peer dependencies can be still required (not optional), so possibly you need to consider including what is not optional into package.json's dependencies or devDependencies lists (like it was before, but "optimized" in recent versions) to ensure that those peers installed correctly.

In summary, peerDependancies of your package should be explicitly visible in consumer's package.json to ensure consumers well aware of versions they selected for them since you delegated control to them (by using peer and not default dependencies). What is not there should not demand installation and code should handle absence of the package safely.

The other way is to ignore people preferences on package manager and to clearly document that other (not npm) package manages are not supported with your solution.

sc-addypathania commented 3 months ago

@SLTKA I understand your concern now. I have added this to our backlog, we will soon make a decision on how to handle this issue with yarn.