Webpackでパス解決を幸せにする

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー
SEGAさん、DIVAの筐体ください(ズザー

さて、今やすっかりReact(+Redux)の虜になりつつある智史之介です。おはようございます。
今日は、import時のパス解決に関するお話を少ししたいなあと。

みよ、この乱雑なimport達を

と、言うのもですね。
まだ、それほどガッツリ実装を進めたという訳ではないのに、この惨状です。

1
2
3
4
5
6
7
8
9
10
11
import React, { Component, PropTypes } from 'react';
import { Link } from 'react-router';
import Section, { Section1, Section2 } from '../components/Section';
import Button from '../components/Button';
import Icon from '../components/Icon';
import TodayWeather from '../components/IndexPage/TodayWeather';
import Adsense from '../components/Ads/Adsense';
import SomeCommentList from '../components/Some/SomeCommentList';
import SomeReviewList from '../components/Some/SomeReviewList';
import ImageList from '../components/Image/ImageList';
import { Tab, Tabs, TabList, TabPanel } from '../components/Tabs';

いやあぁぁぁぁぁああああぁぁぁ
なにこの相対パスとか、階層の深さとか、気持ちわるいよぉ
パスの変更とかあったらどうするんだよぉ(パスの変更作業をして泣きながら)

となること請け合いです。

webpackの設定で幸せになろう

webpackを使用して幸せになれることはとても多いですが、この件もwebpackならとてもスマートに解決してくれます。

webpackにパス解決のための設定を加える

1
2
3
4
5
6
7
8
9
const config = {
  resolve: {
    modules: [
      pathLib.resolve('./app/components'),
      pathLib.resolve('./app/containers'),
      pathLib.resolve('./node_modules')
    ]
  }
}

なんてことはない、とてもシンプルな設定です。

するとimportはこうなる!

1
2
3
4
5
6
7
8
9
10
11
import React, { Component, PropTypes } from 'react';
import { Link } from 'react-router';
import Section, { Section1, Section2 } from 'Section';
import Button from 'Button';
import Icon from 'Icon';
import TodayWeather from 'IndexPage/TodayWeather';
import Adsense from 'Ads/Adsense';
import SomeCommentList from 'Some/SomeCommentList';
import SomeReviewList from 'Some/SomeReviewList';
import ImageList from 'Image/ImageList';
import { Tab, Tabs, TabList, TabPanel } from 'Tabs';

ああ!なにこの幸せな感じは!

いいですね。僕はとても幸せです。

みなさんもいい夢を。
Have a good night !

追記(2017.04.13 20:34)

scssに関しても、同様の問題があるかと思います。
その場合、webpackに下記のような設定を加えることで、幸せになれます!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const config = {
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader?sourceMap',
          loader: [
            'css-loader?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
            'postcss-loader',
            {
              loader: 'sass-loader',
              options: {
                sourceMap: true,
                // ここが重要
                includePaths: [pathLib.resolve('./app/styles')],
              }
            },
          ],
        }),
      }
    ]
  }
}

そうすることで…

before

1
@import '../../styles/common';

after

1
@import 'common';

こんなに幸せになれます!