LoginSignup
8
12

More than 5 years have passed since last update.

webpack, Jest, Flowのimportの相対パスを綺麗にする

Last updated at Posted at 2017-04-25

ES2015とwebpackで何も考えずにコードを書いていたら、以下のような相対パス指定のimportをちらほら見かけるようになった。

import Lib from '../../lib/Lib';

ぱっと見で辛いし、Jestでmoduleをmockしたいときにも辛いので、もろもろの設定をしてimportを綺麗にした。基本的には、各種ツールにnode_moduleのdirectory指定オプションがあるので、それを利用する。

import Lib from '../../lib/Lib' と書いてたやつが
import Lib from 'lib/Lib' と書けるようになる。

余談だけど、JestのAutomockingはバージョン15からはデフォルトでdisabledになったらしい。なので、デフォルト設定でmoduleをmockするならjest.mock('module_path')を書かないといけない。
https://facebook.github.io/jest/blog/2016/09/01/jest-15.html#disabled-automocking

各ツールのバージョンはこんな感じ。

  • webpack: 2.4.1
  • Jest: 19.0.2
  • flow: 0.44.2

ファイル構成

.
└── src
    ├── lib
    │   └── Lib.js
    └── main
        └── foo
            ├── bar.js
            └── bar.test.js

Lib.js

// @flow
export default class Lib {
    log() {
        console.log('log lib.');
    }
};

bar.js

// @flow
import Lib from '../../lib/Lib';

export default function bar() {
    const lib: Lib = new Lib();
    lib.log();
}

bar();

bar.test.js

import bar from './bar';
import Lib from '../../lib/Lib';
jest.mock('../../lib/Lib');

test('jest', () => {
    bar();
    expect(Lib.prototype.log).toBeCalled();
});

各種ツールの設定

以下の設定をすることでimport pathをいい感じにできる。
srcディレクトリをmodule directoryとして認識させることで、import Lib from 'lib/Lib'とかけるようになる。(元はimport Lib from '../../lib/Lib'

webpack

// webpack.confing.js
resolve: {
  modules: [
    path.resolve(__dirname, 'src'),
    'node_modules'
  ]
}

Jest

// package.json
"jest": {
  "moduleDirectories": [
    "src",
    "node_modules"
  ]
}

Flow

# .flowconfig
[options]
module.system.node.resolve_dirname=src
module.system.node.resolve_dirname=node_modules

最終的なコード

Lib.js

変更なしなので省略。

bar.js

importのpathだけ変更。

// @flow
import Lib from 'lib/Lib';

export default function bar() {
    const lib: Lib = new Lib();
    lib.log();
}

bar();

bar.test.js

importのpathとjest.mockのpathを変更。

import bar from './bar';
import Lib from 'lib/Lib';
jest.mock('lib/Lib');

test('jest', () => {
    bar();
    expect(Lib.prototype.log).toBeCalled();
});

動かせるサンプルコード

調査に使ったコードはこちらのリポジトリにあるのでご興味あれば。
https://github.com/mwatanabe/cleanup-messy-imports-poc

おまけ:IntelliJ IDEA

あまりいないかもしれないけど、IntelliJでJSを書いている人は、IntelliJのProject Structureの設定から、Source Folderとしてsrcディレクトリを指定すると、importの補完がいい感じになる。
こんな感じ。

intellij.png

8
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12