In my package.json file I've specified that my nodejs
app is of type module
, because if I do not do that, it seems that I can not use import
statements. This is how it looks like now:
{
"name": "...",
"version": "1.0.0",
"description": "....",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "...."
},
"author": "",
"license": "ISC",
"devDependencies": {
"lodash": "^4.17.15"
},
"type": "module"
}
But if I add the "type": "module"
to my package.json file, I can't use require
statements anymore, because I get a ReferenceError: require is not defined
error.
If I remove the "type": "module"
line from package.json, and rewrite all of my imports to requires, everything works without an error.
I can't seem to find any indication, that import
and require
can not be mixed or used together in the same script, am I missing something here, or I am having some other bug? How could I resolve to use these two kind of statements in the same script?
Why I would need this, is because I want to require
some config files based on dynamic paths, and only if the files exists, which I think I can not do with import
.
DISCLAIMER: I am rather new to nodejs server side programming, so it is possible that I am approaching this situation very wrongly, if that's the case, please advice me something, based on the Why I've mentioned above.
NOTE: I am running this node script from the server terminal, and not from the browser.
This usually happens because your JavaScript environment doesn't understand how to handle the call to require() function you defined in your code. Here are some known causes for this error: Using require() in a browser without RequireJS. Using require() in Node.
In NodeJS, require() is a built-in function to include external modules that exist in separate files. require() statement basically reads a JavaScript file, executes it, and then proceeds to return the export object.
It happens when you declare your package type as module in your package. json . If you do this, certain CommonJS variables can't be used, including require . To fix this, remove "type": "module" from your package.
But if I add the
"type": "module"
to mypackage.json
file, I can't userequire
statements anymore, because I get aReferenceError: require is not defined error
.
Right. It's either/or. Either you use ESM (JavaScript modules, type = "module") or you use CJS (CommonJS-like Node.js native modules, require
).
But, if you're using type="module"
:
You can still use CJS modules, you just import them via import
instead of require
(or via import()
[dynamic import] if necessary). See details here and here.
You can use createRequire
to effectively get a require
function you can use in your ESM module, which brings us to...
Why I would need this, is because I want to
require
some config files based on dynamic paths, and only if the files exists, which I think I can not do withimport
.
That's right. You have to use createRequire
for that instead (or readFile
and JSON.parse
), more here.
createRequire
version:
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const yourData = require("./your.json");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With