eslint-plugin-import 한국어 번역
[공지사항] 푸샤 깃허브 블로그 업데이트 사항
해당 플러그인은 ES2015+(ES6+) 가져오기(import)/내보내기(export) 구문의 린트(Lint)를 지원하고 파일 경로 및 가져오기 이름의 철자 오류 문제를 방지합니다. ES2015+ 정적 모듈 구문이 제공하는 모든 장점들이 편집기에서 표시됩니다.
만약 import 목록들 순서를 보기 좋게 그룹화 및 자동정렬 하고 싶다면 꼭 사용하기를 추천한다.
설치방법
npm install eslint-plugin-import -g
혹은 ESLint을 dev(개발) dependency(종속성) 관리하고 싶다면:
# 프로젝트의 작업 트리 내부
npm install eslint-plugin-import --save-dev
모든 규칙들은 기본적으로 해제되어있습니다. 단, 당신의 .eslintrc.(yml|json|js)
파일에서 수동으로 구성을 설정할 수 있습니다.
---
extends:
- eslint:recommended
- plugin:import/recommended
# 또는, 'recommended' 는 다음 두 규칙 집합의 조합입니다:
- plugin:import/errors
- plugin:import/warnings
# 혹은 수동으로 설정하세요:
plugins:
- import
rules:
import/no-unresolved: [2, { commonjs: true, amd: true }]
import/named: 2
import/namespace: 2
import/default: 2
import/export: 2
# 그외...
TypeScript
다음 단축키를 사용하거나 아래에 설명된 세부 설정을 사용하여 고유한 조합을 설정할 수 있습니다.
@typescript-eslint/parser
가 당신의 구성에서 설치가 되어있는지 확인하세요. 불행하게도 NPM은 선택정으로 종속성을 나열 할 수 없습니다.
extends:
- eslint:recommended
- plugin:import/recommended
- plugin:import/typescript # 해당 라인은 속임수입니다.
또한 Typescript resolver를 설치하고 구성해야 합니다.
eslint-import-resolver-typescript
.
import/order: 모듈(module) 가져오기(import) 순서(order) 규칙 적용하기
require()
/ import
구문을 사용하여 순서 규칙을 적용합니다. +(수정가능) [명령어 라인(command line)]에서 --fix
옵션은 보고된 문제들을 자동적으로 수정합니다.
groups
의 ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type"]
로 된 설정은 다음 예제의 순서와 같습니다.
// 1. 노드 "builtin" 모듈
import fs from 'fs';
import path from 'path';
// 2. "외부(external)" 모듈
import _ from 'lodash';
import chalk from 'chalk';
// 3. "내부(internal)" modules
// (내부 경로를 다르게 처리하도록 경로 또는 웹팩을 구성한 경우)
import foo from 'src/foo';
// 4. "상위(부모, parent)" 디렉토리 모듈
import foo from '../foo';
import qux from '../../foo/qux';
// 5. 동일하거나 "형제(sibling)" 디렉토리 모듈
import bar from './bar';
import baz from './bar/baz';
// 6. "index" 현재 디렉토리
import main from './';
// 7. "object"-imports (오직 TypeScript에서만 사용 가능합니다)
import log = console.log;
// 8. "type" imports (오직 Flow 이나 TypeScript에서 사용 가능합니다)
import type { Foo } from 'foo';
할당되지 않은 import(가져오기)들은 가져오는 순서가 중요할 수 있으므로 무시됩니다. ES6 import
구문은 반드시 require()
구문 앞에 써야합니다.
틀린 경우(Fail)
import _ from "lodash";
import path from "path"; // `path` 는 `lodash` 이전에 반드시 import 해야합니다.
// -----
var _ = require("lodash");
var path = require("path"); // `path` 는 `lodash` 이전에 반드시 import 해야합니다.
// -----
var path = require("path");
import foo from "./foo"; // `import` 는 `require` 이전에 써야합니다.
맞는 경우(Pass)
import path from "path";
import _ from "lodash";
// -----
var path = require("path");
var _ = require("lodash");
// -----
// ̀`babel-register` 가 먼저 사용해야합니다.
require("babel-register");
var path = require("path");
// -----
// `import` 는 `require` 이전에 사용해야 합니다.
import foo from "./foo";
var path = require("path");
Options
이 규칙들은 아래의 옵션들을 지원합니다:
groups: [array]
:
어떻게 그룹을 정의하고 순서를 정하는지 알아보십다. groups
은 반드시 string(문자열)
혹은 [string
]이여야 합니다. 유일하게 허용되는 string
은 다음과 같습니다. "builtin(내장)"
, "external(외부)"
, "internal(내부)"
, "unknown(알수없음)"
, "parent(부모)"
, "sibling(형제)"
, "index(인덱스)"
, "object(객체)"
, "type(타입)"
. 적용되는 순서는 그룹의 각 element와 동일합니다. 생략된 유형은 마지막 요소로 함께 그룹화됩니다.
[
"builtin", // 내장 유형이 첫번째입니다.
["sibling", "parent"], // 그런 다음 형제 및 부모 유형이 옵니다. 해당 유형들은 섞일 수 있습니다
"index", // 그런 다음 인덱스 파일
"object",
// 그런 다음 나머지: 내부 및 외부 유형
];
기본 값은 ["builtin", "external", "parent", "sibling", "index"]
입니다.
다음과 같이 옵션 설정을 할 수도 있습니다:
"import/order": ["error", {"groups": ["index", "sibling", "parent", "internal", "external", "builtin", "object", "type"]}]
pathGroups: [array of objects]
:
To be able to group by paths mostly needed with aliases pathGroups can be defined.
Properties of the objects
property | required | type | description |
---|---|---|---|
pattern | x | string | minimatch pattern for the paths to be in this group (will not be used for builtins or externals) |
patternOptions | object | options for minimatch, default: { nocomment: true } | |
group | x | string | one of the allowed groups, the pathGroup will be positioned relative to this group |
position | string | defines where around the group the pathGroup will be positioned, can be ‘after’ or ‘before’, if not provided pathGroup will be positioned like the group |
{
"import/order": [
"error",
{
"pathGroups": [
{
"pattern": "~/**",
"group": "external"
}
]
}
]
}
pathGroupsExcludedImportTypes: [array]
:
This defines import types that are not handled by configured pathGroups. This is mostly needed when you want to handle path groups that look like external imports.
Example:
{
"import/order": [
"error",
{
"pathGroups": [
{
"pattern": "@app/**",
"group": "external",
"position": "after"
}
],
"pathGroupsExcludedImportTypes": ["builtin"]
}
]
}
You can also use patterns
(e.g., react
, react-router-dom
, etc).
Example:
{
"import/order": [
"error",
{
"pathGroups": [
{
"pattern": "react",
"group": "builtin",
"position": "before"
}
],
"pathGroupsExcludedImportTypes": ["react"]
}
]
}
The default value is ["builtin", "external"]
.
newlines-between: [ignore|always|always-and-inside-groups|never]
:
Enforces or forbids new lines between import groups:
- If set to
ignore
, no errors related to new lines between import groups will be reported (default). - If set to
always
, at least one new line between each group will be enforced, and new lines inside a group will be forbidden. To prevent multiple lines between imports, coreno-multiple-empty-lines
rule can be used. - If set to
always-and-inside-groups
, it will act likealways
except newlines are allowed inside import groups. - If set to
never
, no new lines are allowed in the entire import section.
With the default group setting, the following will be invalid:
/* eslint import/order: ["error", {"newlines-between": "always"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
/* eslint import/order: ["error", {"newlines-between": "always-and-inside-groups"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
/* eslint import/order: ["error", {"newlines-between": "never"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
while those will be valid:
/* eslint import/order: ["error", {"newlines-between": "always"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
/* eslint import/order: ["error", {"newlines-between": "always-and-inside-groups"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
/* eslint import/order: ["error", {"newlines-between": "never"}] */
import fs from "fs";
import path from "path";
import index from "./";
import sibling from "./foo";
alphabetize: {order: asc|desc|ignore, caseInsensitive: true|false}
:
Sort the order within each group in alphabetical manner based on import path:
order
: useasc
to sort in ascending order, anddesc
to sort in descending order (default:ignore
).caseInsensitive
: usetrue
to ignore case, andfalse
to consider case (default:false
).
Example setting:
alphabetize: {
order: 'asc', /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */
caseInsensitive: true /* ignore case. Options: [true, false] */
}
This will fail the rule check:
/* eslint import/order: ["error", {"alphabetize": {"order": "asc", "caseInsensitive": true}}] */
import React, { PureComponent } from "react";
import aTypes from "prop-types";
import { compose, apply } from "xcompose";
import * as classnames from "classnames";
import blist from "BList";
While this will pass:
/* eslint import/order: ["error", {"alphabetize": {"order": "asc", "caseInsensitive": true}}] */
import blist from "BList";
import * as classnames from "classnames";
import aTypes from "prop-types";
import React, { PureComponent } from "react";
import { compose, apply } from "xcompose";
warnOnUnassignedImports: true|false
:
- default:
false
Warns when unassigned imports are out of order. These warning will not be fixed
with --fix
because unassigned imports are used for side-effects and changing the
import of order of modules with side effects can not be done automatically in a
way that is safe.
This will fail the rule check:
/* eslint import/order: ["error", {"warnOnUnassignedImports": true}] */
import fs from "fs";
import "./styles.css";
import path from "path";
While this will pass:
/* eslint import/order: ["error", {"warnOnUnassignedImports": true}] */
import fs from "fs";
import path from "path";
import "./styles.css";
Related
-
import/external-module-folders
setting -
import/internal-regex
setting
개인 적용예시
.eslintrc.js
설정 예시
// .eslintrc.js
module.exports = {
extends: ["next", "prettier"],
rules: {
"import/order": [
"error",
{
groups: ["builtin", "external", "parent", "sibling", "index", "object"],
pathGroups: [
{
pattern: "~/**",
group: "external",
position: "before",
},
{ pattern: "@*", group: "external", position: "after" },
{ pattern: "@*/**", group: "external", position: "after" },
],
pathGroupsExcludedImportTypes: ["react"],
"newlines-between": "always",
alphabetize: {
order: "asc",
caseInsensitive: true,
},
},
],
},
};
파일 적용 후
// 적용 후
import React from "react";
import { connect } from "react-redux";
import CustomerModel from "@Components/Api/Customer/Models/CustomerModel";
import ErrorsModel from "@Components/Api/Error/Model/ErrorsModel";
import { trackException } from "@Components/ApplicationInsights";
import CustomerNavigation from "@Components/Customer/Components/CustomerNavigation/CustomerNavigation";
import { getGlobalDYCampaignChoiceResponse } from "@Components/DY/Api/utils";
import ApiDownExceptionModel from "@Components/ErrorTemplates/ApiDownExceptionModel";
import PageNotFound from "@Components/ErrorTemplates/PageNotFound";
import Layout from "@Components/Layout/Layout";
import MetaFormatter from "@Components/Meta/MetaFormatter";
import Service from "@Components/Service/Service";
import Topic from "@Components/Topic/Topic";
import TopicApi from "@Components/Topic/TopicApi";
import TopicModel from "@Components/Topic/TopicModel";
import { getDYChoiceResponseForTopic } from "@Components/Topic/TopicUtils";
import ApiStatus from "@Enum/ApiStatus";
import CustomerStatus from "@Enum/CustomerStatus";
import PageContextType from "@Enum/PageContextType";
import PageType from "@Enum/Pagetype";
import TopicPageInterface from "../../pageInterfaces/TopicPageInterface";
import { getServerSideProps as MainGetServerSideProps } from "../../src/MainPage";
import { wrapper } from "../../src/store/Store";
요약
요약
- 1.
- 자세한 설정은 공식문서를 참조하자
- 3.
댓글남기기