投稿日:2023年3月1日
この記事ではeslintを使用してNest.jsアプリケーションで相対パスのimportを禁止して絶対パスのimportを許可する方法について詳しく解説しています。
typescriptではimport { AppModule } from '../app.module';のような相対パスでのimportと、import { AppModule } from 'src/app.module';絶対パスでのimportの両方をサポートしていますが、前者はディレクトリの構造が変化した場合のimport文の変更や、ローカルのモジュールを作成した場合の自動importなどで、少々ややこしいことになることがあります。
どちらのimportでも扱えるのは柔軟という意味では強いのですが、複数人で開発する際にはどちらを使用するのかルールを厳格に決めておくのが良さそうです。
個人的には冒頭に説明した理由から絶対パスのimportによりメリットを感じているため、この記事では、eslintを使用して相対パスを禁止する方法について解説します。
この記事のコードは以下の環境で確認されました。
まずはパッケージをインストールします。
$ npm i -D eslint-plugin-no-relative-import-paths
次にeslintの設定を追加します。
module.exports = {
// [...]
// no-relative-import-pathsを追加
plugins: ['@typescript-eslint/eslint-plugin', 'no-relative-import-paths'],
// [...]
rules: {
// [...]
'no-relative-import-paths/no-relative-import-paths': [
'error',
{
'allowSameFolder': false,
'rootDir': './'
}
]
// [...]
pluginに'no-relative-import-paths'とrulesに'no-relative-import-paths/no-relative-import-paths'のルールを追加すればOKです。
ルールについては公式のドキュメントを見ていただくと良いと思います。
ここで'no-relative-import-paths/no-relative-import-paths'の設定するrootDirのパスはtsconfigのcompilerOptions.baseUrlと一致するようにしてください。
{
"compilerOptions": {
"baseUrl": "./"
}
}