Skip to content

import/no-commonjs ​

Reports require([string]) function calls. Will not report if >1 argument, or single argument is not a literal string.

Reports module.exports or exports.*, also.

Intended for temporary use when migrating to pure ES6 modules.

Rule Details ​

This will be reported:

js
var mod = require('./mod')
  , common = require('./common')
  , fs = require('fs')
  , whateverModule = require('./not-found')

module.exports = { a: "b" }
exports.c = "d"

Allow require ​

If allowRequire option is set to true, require calls are valid:

js
/*eslint no-commonjs: [2, { allowRequire: true }]*/
var mod = require('./mod');

but module.exports is reported as usual.

Allow conditional require ​

By default, conditional requires are allowed:

js
var a = b && require("c")

if (typeof window !== "undefined") {
  require('that-ugly-thing');
}

var fs = null;
try {
  fs = require("fs")
} catch (error) {}

If the allowConditionalRequire option is set to false, they will be reported.

If you don't rely on synchronous module loading, check out dynamic import.

Allow primitive modules ​

If allowPrimitiveModules option is set to true, the following is valid:

js
/*eslint no-commonjs: [2, { allowPrimitiveModules: true }]*/

module.exports = "foo"
module.exports = function rule(context) { return { /* ... */ } }

but this is still reported:

js
/*eslint no-commonjs: [2, { allowPrimitiveModules: true }]*/

module.exports = { x: "y" }
exports.z = function boop() { /* ... */ }

This is useful for things like ESLint rule modules, which must export a function as the module.

When Not To Use It ​

If you don't mind mixing module systems (sometimes this is useful), you probably don't want this rule.

It is also fairly noisy if you have a larger codebase that is being transitioned from CommonJS to ES6 modules.

Contributors ​

Special thanks to @xjamundx for donating the module.exports and exports.* bits.

Further Reading ​

Released under the Apache License 2.0.