Home > Enterprise >  Next js webpack module not found in npm local package
Next js webpack module not found in npm local package

Time:03-14

I'm making a Next Js app that has it's mongoose models in a local npm package, so they can be shared with other parts of the backend. But I'm getting these errors:

Module not found: Can't resolve 'supports-color' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/debug/src'

../shared-stuff/node_modules/mongodb/lib/bson.js
Module not found: Can't resolve 'bson-ext' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

../shared-stuff/node_modules/mongodb/lib/deps.js
Module not found: Can't resolve 'kerberos' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

../shared-stuff/node_modules/mongodb/lib/deps.js
Module not found: Can't resolve 'snappy' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

../shared-stuff/node_modules/mongodb/lib/deps.js
Module not found: Can't resolve 'snappy/package.json' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

../shared-stuff/node_modules/mongodb/lib/deps.js
Module not found: Can't resolve 'aws4' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

../shared-stuff/node_modules/mongodb/lib/encrypter.js
Module not found: Can't resolve 'mongodb-client-encryption' in '/Users/akopyl/Projects/my-project/shared-stuff/node_modules/mongodb/lib'

My guess is that this is caused by webpack trying to find the dependencies of the shared-stuff package in the my-project/app directory, instead of the my-project/shared-stuff directory.

The project file structure:

my-project
├── app (This is the Next Js app that has errors)
│   ├── lib
│   ├── next.config.js
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── pages
│   ├── public
│   └── styles
├── gather
│   ├── ecosystem.config.js
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   └── src
└── shared-stuff
    ├── index.js
    ├── models
    ├── node_modules
    ├── package-lock.json
    └── package.json

The app/package.json file:

{
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start"
  },
  "dependencies": {
    "mongoose": "^6.2.6",
    "next": "latest",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "sass": "^1.49.9",
    "shared-stuff": "file:../shared-stuff"
  },
  "devDependencies": {
    "eslint": "^8.11.0",
    "eslint-config-next": "^12.1.0"
  }
}

The shared-stuff/package.json file:

{
  "name": "shared-stuff",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "mongoose": "^6.2.6"
  }
}

Also an interesting thing I noticed is that while both packages have only mongoose as a dependency, the shared-stuff/node_modules folder contains a mongodb folder, but app/node_modules doesn't.

Also another package in the gather directory also has shared-stuff as a dependency, but it runs as expected, since it doesn't use webpack.

I've ran npm ci in every one of the 3 projects, tried to disable eslint, tried to use the webpack.IgnorePlugin in next.config.js to ignore shared-stuff, but to no success.

CodePudding user response:

So the solution I found is to initialize the parent directory my-project as a npm project itself and define the subfolders as its workspaces.

my-project $ npm init -y
my-project $ npm install

Then add the following line to my-project/package.json:

"workspaces": ["./app", "./gather", "./shared-stuff"]

After these steps the dependencies of the local folder package are resolved properly.

  • Related