What's the difference between node:process and process?
Asked Answered
A

2

9

When I import node:process it works fine. However, when I try to require the same, it gives an error.

This works fine:

import process from 'node:process';

But when I try to require the same, it throws an error:

const process = require('node:process');

Error: Cannot find module 'node:process'

I am curious as to what is the difference between process, which works in both, commonjs and module, vs node:process.

Also, a follow-up, I am using webpack to bundle my js, and I discovered this error when I tried to run my bundled code and realised, that chalk imports node:process, node:os and node:tty. How do I solve that now?

Archaism answered 14/3, 2022 at 19:39 Comment(0)
T
2

"node:" is an URL scheme for loading ECMAScript modules. As such it started for "import", not "require".

"node:process" is just an alternative name to load the built-in "process" module.

See also Node.js documentation - you can find the lowest supporting Node.js version inside the "History" tag (12.20.0, 14.13.1)

With newer Node.js it should be available for "require" as well (14.18.0, 16.0.0).

Some more details can be found here: node:process always prefers the built-in core module, while process could be loaded from a file.

Trichology answered 14/3, 2022 at 19:55 Comment(1)
If you install an node modules package with the same name as the core module, it appears that importing 'process' will still load the native built-in module and ignore the one in node modules directory. But if the nodejs runtime (or some other JS runtime) didn't have the process module built-in, then it would load it from the node modules directory if it understands commonjs/ES module standards.Thermocline
T
6

import process from 'node:process'; and import process from 'process'; are equivalent.

The node: exists since version 12 for import.

node: URLs are supported as an alternative means to load Node.js builtin modules. This URL scheme allows for builtin modules to be referenced by valid absolute URL strings.

The idea behind node: is to make clear that it is actually a buildin module and not one installed and to avoid name conflicts, with 3rd party modules.

The node: protocol was first added only for import so a particular node version might support node: with import but not with require.

In v16.13.0 (not sure since which v16 version) you can also use it with require. And was also backported to v14 since v14.18: module: add support for node:‑prefixed require(…) calls

Tillich answered 14/3, 2022 at 19:55 Comment(0)
T
2

"node:" is an URL scheme for loading ECMAScript modules. As such it started for "import", not "require".

"node:process" is just an alternative name to load the built-in "process" module.

See also Node.js documentation - you can find the lowest supporting Node.js version inside the "History" tag (12.20.0, 14.13.1)

With newer Node.js it should be available for "require" as well (14.18.0, 16.0.0).

Some more details can be found here: node:process always prefers the built-in core module, while process could be loaded from a file.

Trichology answered 14/3, 2022 at 19:55 Comment(1)
If you install an node modules package with the same name as the core module, it appears that importing 'process' will still load the native built-in module and ignore the one in node modules directory. But if the nodejs runtime (or some other JS runtime) didn't have the process module built-in, then it would load it from the node modules directory if it understands commonjs/ES module standards.Thermocline

© 2022 - 2024 — McMap. All rights reserved.