⚙️
tsconfigにbaseUrlを設定したプロジェクトで Storybookからcomponentを使う
はじめに
Next.jsでTypscriptのプロジェクトを扱う際に、
tsconfig.jsonのbaseUrlを設定することで、
各モジュールで絶対パス指定でimportできる、という仕組みがあります。
こちらの設定をしているcomponentをそのままStorybookで読み込もうとすると、
Module not found: Error: Can't resolve *** in ***
というエラーになっていまします。
本記事はこの設定をしたまま、Storybookでモジュールを読みこむための設定の仕方を記載しています。
設定方法
こちらのStorybookのissueを参考にしました。
- tsconfig-paths-webpack-pluginの導入
- main.jsの書き換え
の2ステップで設定します。
tsconfig-paths-webpack-pluginの導入
webpackのプラグインで、tsconfigの設定を利用することができるようになる、というもののようです。
インストールは
yarn add --dev tsconfig-paths-webpack-plugin
or
npm install --save-dev tsconfig-paths-webpack-plugin
でOK
main.jsの書き換え
本家のプラグインはwebpack.config.jsを編集するようですが、今回はStorybookの設定ファイルの.storybook/main.jsを編集します。
.storybook/main.js
+const path = require('path')
+const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin')
module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
  ],
+  webpackFinal(config) {
+    config.resolve.modules = [
+      ...(config.resolve.modules || []),
+      path.resolve(__dirname, '../src')
+    ]
+    config.resolve.plugins = [
+      ...(config.resolve.plugins || []),
+      new TsconfigPathsPlugin()
+    ]
+    return config;
+  },
  "framework": "@storybook/react"
}
こちらでnpm run storybookでエラーが出無くなれば成功です!
おわりに
main.jsの設定は こちらと併用する場合は
const path = require('path')
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin')
module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
  ],
  webpackFinal(config) {
    delete config.resolve.alias['emotion-theming'];
    delete config.resolve.alias['@emotion/styled'];
    delete config.resolve.alias['@emotion/core'];
    config.resolve.modules = [
      ...(config.resolve.modules || []),
      path.resolve(__dirname, '../src')
    ]
    config.resolve.plugins = [
      ...(config.resolve.plugins || []),
      new TsconfigPathsPlugin()
    ]
    return config;
  },
  "framework": "@storybook/react"
}
こんな感じになるかと思います。
現状問題なく併用できているのでMUIをお使いの方は参考にどうぞ!





Discussion
この記事が解決の糸口になりました!ありがとうございます。
だた最近のStorybookだと
main.jsがmain.tsなっていてちょっと詰みました。tsconfig-paths-webpack-pluginをキーワードに探していたら公式ドキュメントに解決方法が書いてありました!書き方がちょっと違うみたいですね。