How to Configure the `import/order` Rule for Organized Imports with Airbnb ESLint
Airbnb's ESLint configuration enforces a minimal three-group import order by default, but you can override the import/order rule in your project's ESLint config to add alphabetical sorting, custom path aliases, and strict newline separation while preserving the rest of the style guide.
The import/order rule is essential for maintaining consistent import organization across JavaScript codebases. Airbnb's shareable ESLint config provides a sensible baseline for this rule in eslint-config-airbnb-base, but many teams require stricter conventions for large applications. This guide explains how the default import/order rule for organized imports with Airbnb ESLint works and how to extend it for custom project requirements without forking the entire configuration.
Understanding Airbnb's Default import/order Configuration
Airbnb distributes its ESLint rules across two packages: eslint-config-airbnb-base for core JavaScript and eslint-config-airbnb which extends the base with React-specific rules. The import/order rule lives in the base package at packages/eslint-config-airbnb-base/rules/imports.js.
At line 149 of this file, Airbnb defines a deliberately minimal configuration:
'import/order': ['error', { groups: [['builtin', 'external', 'internal']] }],
This configuration groups imports into three buckets—builtin (Node.js modules), external (npm packages), and internal (local project files)—and requires each bucket to appear as a contiguous block. The philosophy here is to provide sensible defaults without being overly opinionated about ordering within each group, leaving room for teams to adopt more detailed conventions through extension.
The rule is aggregated into the final configuration through packages/eslint-config-airbnb-base/index.js, which exports all rule objects including the imports module. When ESLint loads the config, it merges this rule set with any user-provided overrides according to ESLint's configuration cascading rules.
Extending the import/order Rule for Strict Organization
To achieve a fully organized import layout, create a project-level ESLint configuration that overrides Airbnb's default. Because the base config already enables eslint-plugin-import, you only need to supply a richer options object in your .eslintrc.js file.
Key options for customizing import organization include:
pathGroups– Define custom groups for path aliases (e.g.,@components/**)pathGroupsExcludedImportTypes– Exclude specific import types from built-in classificationalphabetize– Sort members within each group usingorder: 'asc'or'desc'newlines-between– Enforce blank lines between groups (always,never, orignore)warnOnUnassignedImports– Warn when imports have no assigned variables
When you override the rule, ESLint hands your custom options object to eslint-plugin-import's order rule, which validates the file-by-file import layout during linting.
Practical Implementation Examples
Default Airbnb Import Grouping
Out of the box, Airbnb enforces only the three-group block structure. Valid code looks like this:
// example.js
import fs from 'fs'; // builtin
import React from 'react'; // external
import myUtil from './myUtil'; // internal
Any deviation—such as placing a relative import before an external package—will raise an error because it violates the contiguous block rule defined in the base config.
Custom Configuration with Path Aliases and Alphabetization
For teams using path aliases (e.g., @/utils) and requiring alphabetical ordering within groups, override the rule as follows:
// .eslintrc.js
module.exports = {
extends: ['airbnb-base'],
rules: {
'import/order': [
'error',
{
groups: [
['builtin', 'external'], // Node modules and npm packages
['internal', 'parent', 'sibling', 'index'], // Local imports
],
pathGroups: [
{
pattern: '@/**',
group: 'internal',
position: 'before',
},
],
pathGroupsExcludedImportTypes: ['builtin'],
alphabetize: { order: 'asc', caseInsensitive: true },
'newlines-between': 'always',
warnOnUnassignedImports: true,
},
],
},
};
This configuration enforces the following layout:
// example.js
import fs from 'fs'; // builtin
import path from 'path'; // builtin
import react from 'react'; // external
import lodash from 'lodash'; // external
import utils from '@utils'; // internal alias (pathGroups)
import myUtil from './myUtil'; // sibling
import { helper } from '../helper'; // parent
Directory-Specific Overrides
To apply strict ordering only in certain directories while keeping the default Airbnb config elsewhere, use the overrides feature:
// .eslintrc.js
module.exports = {
extends: ['airbnb-base'],
overrides: [
{
files: ['src/**/*.js'],
rules: {
'import/order': [
'error',
{
groups: [['builtin', 'external', 'internal']],
alphabetize: { order: 'asc', caseInsensitive: true },
'newlines-between': 'always',
},
],
},
},
],
};
Now the strict ordering applies only to files under src/, while the rest of the codebase follows Airbnb's original, looser enforcement.
Summary
- Airbnb's default
import/orderconfiguration inpackages/eslint-config-airbnb-base/rules/imports.jsenforces only three contiguous groups: builtin, external, and internal. - The rule is exposed through
packages/eslint-config-airbnb-base/index.jsand requireseslint-plugin-importas a dependency. - You can override the rule in your project's ESLint config to add alphabetization, path aliases, and newline enforcement without modifying the base package.
- Use ESLint's
overridesfeature to apply custom import ordering to specific directories only.
Frequently Asked Questions
What is the default import/order rule in Airbnb's ESLint config?
According to the source code in packages/eslint-config-airbnb-base/rules/imports.js at line 149, Airbnb enforces a minimal configuration that groups imports into three categories—builtin, external, and internal—and requires each group to appear as a contiguous block. This default does not enforce alphabetical ordering or handle custom path aliases.
How do I add path aliases like @/components to import/order with Airbnb?
Add a pathGroups array to your rule override specifying the pattern (e.g., @/**), the group (internal), and the position (before). Combine this with pathGroupsExcludedImportTypes: ['builtin'] to ensure the alias is recognized correctly. This extends the base eslint-config-airbnb without forking it.
Can I apply different import ordering rules to different folders?
Yes. Use the overrides key in your .eslintrc.js to target specific file patterns (e.g., files: ['src/**/*.js']) and provide a custom import/order configuration for those files only. This allows legacy code to remain unchanged while new code follows stricter organization rules.
Does eslint-config-airbnb include the import/order rule or do I need to install it separately?
The import/order rule is included via eslint-config-airbnb-base, which both the base and React-specific packages depend on. The base package lists eslint-plugin-import as a dependency in its package.json, so the rule is available as long as you extend the Airbnb config. You do not need to manually install the plugin, only override the rule configuration.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →