Using Node.js require vs. ES6 import/export Using Node.js require vs. ES6 import/export javascript javascript

Using Node.js require vs. ES6 import/export


Update

Since Node v12 (April 2019), support for ES modules is enabled by default, and since Node v15 (October 2020) it's stable (see here). Files including node modules must either end in .mjs or the nearest package.json file must contain "type": "module". The Node documentation has a ton more information, also about interop between CommonJS and ES modules.

Performance-wise there is always the chance that newer features are not as well optimized as existing features. However, since module files are only evaluated once, the performance aspect can probably be ignored. In the end you have to run benchmarks to get a definite answer anyway.

ES modules can be loaded dynamically via the import() function. Unlike require, this returns a promise.


Previous answer

Are there any performance benefits to using one over the other?

Keep in mind that there is no JavaScript engine yet that natively supports ES6 modules. You said yourself that you are using Babel. Babel converts import and export declaration to CommonJS (require/module.exports) by default anyway. So even if you use ES6 module syntax, you will be using CommonJS under the hood if you run the code in Node.

There are technical differences between CommonJS and ES6 modules, e.g. CommonJS allows you to load modules dynamically. ES6 doesn't allow this, but there is an API in development for that.

Since ES6 modules are part of the standard, I would use them.


There are several usage / capabilities you might want to consider:

Require:

  • You can have dynamic loading where the loaded module name isn'tpredefined /static, or where you conditionally load a module only ifit's "truly required" (depending on certain code flow).
  • Loading issynchronous. That means if you have multiple requires, they areloaded and processed one by one.

ES6 Imports:

  • You can usenamed imports to selectively load only the pieces you need. That cansave memory.
  • Import can be asynchronous (and in current ES6 Module Loader, it in fact is) and can perform a little better.

Also, the Require module system isn't standard based. It's is highly unlikely to become standard now that ES6 modules exist. In the future there will be native support for ES6 Modules in various implementations which will be advantageous in terms of performance.


As of right now ES6 import, export is always compiled to CommonJS, so there is no benefit using one or other. Although usage of ES6 is recommended since it should be advantageous when native support from browsers released. The reason being, you can import partials from one file while with CommonJS you have to require all of the file.

ES6 → import, export default, export

CommonJS → require, module.exports, exports.foo

Below is common usage of those.

ES6 export default

// hello.jsfunction hello() {  return 'hello'}export default hello// app.jsimport hello from './hello'hello() // returns hello

ES6 export multiple and import multiple

// hello.jsfunction hello1() {  return 'hello1'}function hello2() {  return 'hello2'}export { hello1, hello2 }// app.jsimport { hello1, hello2 } from './hello'hello1()  // returns hello1hello2()  // returns hello2

CommonJS module.exports

// hello.jsfunction hello() {  return 'hello'}module.exports = hello// app.jsconst hello = require('./hello')hello()   // returns hello

CommonJS module.exports multiple

// hello.jsfunction hello1() {  return 'hello1'}function hello2() {  return 'hello2'}module.exports = {  hello1,  hello2}// app.jsconst hello = require('./hello')hello.hello1()   // returns hello1hello.hello2()   // returns hello2