`if __name__ == '__main__'` equivalent in javascript es6 modules
Solution 1:
An alternative for ES6 modules is now supported in Node. Using the new import.meta
builtin. (Don't forget to set "type": "module"
in package.json
.)
Example
// main.js
import "./lib.js"
import { fileURLToPath } from "url";
if (process.argv[1] === fileURLToPath(import.meta.url)) {
console.log("I print to stdout!");
}
// lib.js
import { fileURLToPath } from "url";
if (process.argv[1] === fileURLToPath(import.meta.url)) {
console.log("I don't run, because I'm an imported module.");
}
$ node main.js
output:
I print to stdout!
Utility function
I like to just import { isMain } from "./lib/utils.js"
and pass import.meta.url
to isMain()
.
import { argv } from "process"
import { fileURLToPath } from "url"
/**
* Check if a module is the main module launched with the node process.
* Meaning the module is NOT imported by another module,
* but was directly invoked by `node`, like this: `$ node main.js`
*
* @example
* ```js
* // main.js
* import lib from "./lib.js"
* import { isMain } from "./utils.js"
*
* if (isMain(import.meta.url)) {
* console.log("I print to stdout")
* }
*
* // lib.js
* import { isMain } from "./utils"
*
* if (isMain(import.meta.url)) {
* console.log("I don't run, because I'm an imported module")
* }
* ```
*
* @param {string} moduleUrl needs to be `import.meta.url`
* @returns {boolean} true if the module is the main module
*/
export function isMain(moduleUrl) {
const modulePath = fileURLToPath(moduleUrl)
const [_binPath, mainScriptPath] = argv
return modulePath === mainScriptPath
}
Solution 2:
module.parent
will help you:
if(module.parent) {
console.log('required module')
} else {
console.log('main')
}