lunarphase-js icon indicating copy to clipboard operation
lunarphase-js copied to clipboard

bug: NexJS build: `problem ReferenceError: exports is not defined in ES module scope`

Open mendesbarreto opened this issue 3 months ago • 6 comments

Description

Hello @jasonsturges, I just updated the package to 2.0.2 and I am receiving this error below,

Collecting page data  ...ReferenceError: exports is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension and '/Users/douglasmendes/Git/xpertsea/web-insights/node_modules/lunarphase-js/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///Users/douglasmendes/Git/xpertsea/web-insights/node_modules/lunarphase-js/dist/index.cjs.js:1:36
    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)
    at async importModuleDynamicallyWrapper (node:internal/vm/module:430:15)

I think this change might be impacting the build for nextJS for production:

https://github.com/jasonsturges/lunarphase-js/commit/38fca43a8a09105bd3d8790a7f895510c421ac7b#diff-7ae45ad102eab3b6d7e7[…]470d7bc6507b6481575d519R19

Renaming the file from index.cjs.js to index.cjs resolved the build issue successfully locally.

mendesbarreto avatar Mar 01 '24 17:03 mendesbarreto

Strangely I don't receive this in Next.js

image

jasonsturges avatar Mar 01 '24 22:03 jasonsturges

Both TypeScript and JavaScript are functional in Next.js, with different targets.

Even before when I used Rollup directly, CommonJS has always been distributed as .js image

Can you give some insights to your Next.js config, and TSConfig if you're using TypeScript?

Are you using this as import or require?

jasonsturges avatar Mar 01 '24 22:03 jasonsturges

@mendesbarreto Try version 2.0.3 - this removes the module type specifier.

Perhaps I'm missing something here, but I'd like to understand what's occurring in your environment. If you could share some details would help to trace this.

jasonsturges avatar Mar 01 '24 22:03 jasonsturges

@jasonsturges It's working now, thank you so much for your help.

Now your questions:

Are you using this as import or require?

We are using import like:

import { Moon } from 'lunarphase-js';

It's quite odd because I've never encountered this issue with your library before. It only started happening after this recent change,

The command I am running is:

 NODE_ENV=production next build

Let me know any specific details about our project here you want to know.

mendesbarreto avatar Mar 04 '24 13:03 mendesbarreto

@mendesbarreto Thanks for the information.

Some issue interpreting ES Modules vs Common JS... I'll continue to trace it, and hopefully will match a similar environment with the issue.

jasonsturges avatar Mar 04 '24 19:03 jasonsturges

Ah, finally able to replicate this in a Node.js environment - I suppose that makes sense for Next.js

index.cjs.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which declares all .js files in that package scope as ES modules.

...although strangely I don't experience this issue in Next.js

This defeats the purpose of configuration, though:

  "main": "dist/index.cjs.js",
  "module": "dist/index.es.js",

Need to research how other packages are handling this.

jasonsturges avatar Mar 04 '24 20:03 jasonsturges