Storybook: Storybookで絶対パスでインポートできません

作成日 2018年07月24日  ·  25コメント  ·  ソース: storybookjs/storybook

バージョン

  • @ storybook / addon-actions:3.4.8
  • @ storybook / addon-links:3.4.8
  • @ storybook / addon-storyshots:3.4.8
  • @ storybook / addons:3.4.8
  • @ storybook / react:3.4.8
  • 反応:16.4.2
  • TypeScript:2.9.2

動作

以下のコンポーネントを作成すると、ストーリーブックにエラーが表示されます。

# src/components/organisms/ParentComponent/index.tsx
import * as React from 'react';
import ChildrenComponent from 'src/components/molecules/ChildrenComponent/index';

const ParentComponent: React.SFC<{}> = ({ ...props }) => (
  <ChildrenComponent />
);

エラー
Module not found: Error: Can't resolve 'src/components/molecules/ChildrenComponent/index' in '/AppRoot/src/components/organisms/ParentComponent'

これは絶対パスでの読み込みが原因のようですので、以下を行うと問題なく動作します。
import ChildrenComponent from '../../molecules/ChildrenComponent/index';

ただし、この方法は極力避けたいと思います。 相対パスで指定する以外にエラーなしでストーリーブックを開始する方法はありませんか?

絶対パスの適用は、以下のtsconfig.json説明に基づいています。

"compilerOptions": {
  "outDir": "build/dist",
  "rootDir": "src",
  "baseUrl": "."
}

また、今回は、ストーリーブックのコンパイル済みbuild/distディレクトリではなく、コンパイル済みsrcディレクトリにtsx拡張子で記述されたstoriesファイルをインポートします。

これは./storybook/configに設定されていますが、 build/distに設定すると同様の結果が得られます。

このプロジェクトはアトミックデザインを使用しているため、おおよそ次のディレクトリ構造になっています。

src
├── components
│    ├── molecules
│    │   ├── ChildrenComponent
│    │   │   ├── index.tsx
│    │   │   └── index.stories.tsx
│    ├── organisms
│    │   ├── ParentComponent
│    │   │   ├── index.tsx
│    │   │   └── index.stories.tsx

関連する問題

関連する問題のようなものがあったようです。
しかし、それは解決に至りませんでした。

333、#3438

余談

余談ですが、この問題を解決するには2つの方法があると思います。

ここで最初に質問したいのは、「ストーリーブックを使用して絶対パスコンポーネントをインポートする」ことです。次に、インポートしたtsxファイルを絶対パスでインポートするjsファイルにコンパイルします。相対パスとして。 その後、インポートしたjsファイルをストーリーブックへの相対パスとともに適用します。

後者については、ここで聞くのは適切ではないと思いますが、ご存知の方はその方法についてもお伺いしたいと思います。

御時間ありがとうございます。

react question / support typescript

最も参考になるコメント

ストーリーブック5で誰かがこれを見ている場合に備えて

const path = require('path');

module.exports = ({ config }) => {
  config.resolve.modules.push(path.resolve(__dirname, "../src"));
  return config;
};

全てのコメント25件

通常のアプリでどのように機能するかはわかりませんが(セットアップはどのようなものですか?)、cwdを(-> cwd/src/components/....仮定して) resolve.modules拡張されたwebpack.configでは、おそらく問題は解決するはずです(Angularアプリで確認しましたが、実際には問題ではありません)

私の.storybook/webpack.config.jsファイルは次のように記述されています。
ここに問題はありますか?

const genDefaultConfig = require('@storybook/react/dist/server/config/defaults/webpack.config.js');

module.exports = (baseConfig, env) => {
    const config = genDefaultConfig(baseConfig, env);

    config.module.rules.push({
        test: /\.(ts|tsx)?$/,
        exclude: /node_modules/,
        include: [/stories/, /src/],
        loader: 'ts-loader'
    });
    config.resolve.extensions.push('.ts', '.tsx');

    return config;
};

次のようなものを追加してみてください。

const path = require('path');

// blah blah code

module.exports = (baseConfig, env) => {

  // blah blah code

  config.resolve.modules = [
    ...(config.resolve.modules || []),
    path.resolve('./'),
  ];
}

ちゃんと動いた!!
あなたには感謝してもしきれません!!!!!!!

u-r-welcome

@ igor-dv私は同様の問題を抱えており、あなたの提案(上記)と、resource.requestパスを変更するNormalModuleReplacementPluginを試しました。 どちらも機能していません

他に何か提案はありますか?

コード例/webpack.config.jsを共有していただけますか?

.storybook / webpack.config.js

const path = require( 'path'); `
// const webpack = require( 'webpack');
const genDefaultConfig = require( '@ storybook / react / dist / server / config / defaults / webpack.config.js');

module.exports =(baseConfig、env)=> {
const config = genDefaultConfig(baseConfig、env);
config.module = {
ルール:[
{{
テスト:/。tsx $ /、
ローダー:["ts-loader"]、
インクルード:path.resolve(__ dirname、 '.. / app / xv /')
}、
{{
テスト:/。scss $ /、
ローダー:[
「スタイルローダー」、
'css-loader'、
'sass-loader?includePaths [] =' + encodeURIComponent(path.resolve(__ dirname、 '.. / app /'))
]
}、
{{
テスト:/。css $ /、
ローダー: 'style-loader!css-loader'
}、
{{
テスト:/。less $ /、
ローダー: 'style-loader!css-loader!less-loader'
}、
{{
テスト:/。js | .ts $ /、
除外:[path.join(__ dirname、 'app / components')、/ node_modules /]、
ローダー: 'ng-annotate-loader'
}、
{{
テスト:/。js $ /、
除外:[path.join(__ dirname、 'app / components')、/ node_modules /]、
ローダー: 'babel-loader?presets [] = es2015&presets [] = stage-1&presets [] = react&cacheDirectory'
}
]
};

config.resolve.modules = [
    ...(config.resolve.modules || []),
    path.resolve('./'),
];

return config;
// ,
// plugins: [
//     new webpack.NormalModuleReplacementPlugin(/xv/, function(resource) {
//         resource.request = resource.request.includes('xv/') ? '../../app/' + resource.request : resource.request;
//     })
// ]

} `

//コード

`import * as React from'react ';

'xv / util / decorators'から{autobind}をインポートします。

import '../ styles / ActionIcon.scss'; `

//エラー

`./app/xv/ui/components/ActionIcon.tsxのエラー

モジュールが見つかりません:エラー:「/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components」の「xv / util / decorators」を解決できません

@ ./app/xv/ui/components/ActionIcon.tsx 31:0-46
@。/。storybook / stories / actionIcons.js
@。/。storybook / config.js
@ multi ./node_modules/@storybook/react/dist/server/config/polyfills.js ./node_modules/@storybook/react/dist/server/config/globals.js(webpack)-hot-middleware / client.js? reload = true ./。storybook / config.js`

/ xv /は、通常のwebpack dev(ストーリーブック以外)ビルドのプロジェクトのベース(root / app / xv / *)にマップされます

フォーマットしてすみません

NormalModuleReplacementPluginで正規表現の置換のさまざまなバリエーションを試しましたが、ストーリーブックが絶対パスを処理しないことに関する同様のスレッド/問題で見つかったものもあります

例:

plugins: [ new webpack.NormalModuleReplacementPlugin(/xv/, function(resource) { resource.request = resource.request.replace(/xv/, '../../app/'); }) ]

私にこのエラーを与えます:

`./.storybook/stories/actionIcons.jsのエラー

モジュールが見つかりません:エラー: '/ Users / lukasanderson / workspace / NeXgen-UI / .storybook / stories'の '../../app//ui/components/Tooltip'を解決できません

@。/。storybook / stories / actionIcons.js 5:0-47
@。/。storybook / config.js
@ multi ./node_modules/@storybook/react/dist/server/config/polyfills.js ./node_modules/@storybook/react/dist/server/config/globals.js(webpack)-hot-middleware / client.js? reload = true./.storybook/config.js
`

そしてこの変更(置換文字列に/ xv /を追加)

plugins: [ new webpack.NormalModuleReplacementPlugin(/xv/, function(resource) { resource.request = resource.request.replace(/xv/, '../../app/xv/'); }) ]

与える

`./.storybook/stories/actionIcons.jsのエラー

モジュールが見つかりません:エラー: '/ Users / lukasanderson / workspace / NeXgen-UI / .storybook / stories'の '../../app/xv//ui/components/Tooltip'を解決できません

@。/。storybook / stories / actionIcons.js 5:0-47
`

絶対パスの正しいパス置換があると、相対パスが台無しになるだけでなく、パスが「正しい」ため、エラーが発生します。

ERROR in ./.storybook/stories/actionIcons.js Module not found: Error: Can't resolve '../../app/xv/ui/components/Tooltip' in '/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories'

作業ディレクトリ(cwd)は何ですか?

ルート/

  • .storybook
  • アプリ
    --xv
    --- ui
    ----コンポーネント
    --- utils

NeXgen-UI(別名プロジェクトルート)からストーリーブックを開始します

したがって、このimport { autobind } from 'xv/util/decorators';場合は、おそらくpath.resolve('./app')resolve.modules追加する必要があります。

さて、私は今これを持っています

`
config.resolve = {

    modules: [

        ...(config.resolve.modules || []),

        path.resolve('./app'),

        path.resolve('./')

    ]
};

return config;

`

そして同じようになっています:

`./app/xv/ui/components/ActionIcon.tsxのエラー

モジュールが見つかりません:エラー:「/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components」の「xv / util / decorators」を解決できません
`

config.resolve.extensions.push('.ts', '.tsx');も追加する必要があるようです

@ igor-dv私もそれを試してみましたが、同じエラーです。 これについての助けをありがとう

🤔それでは、複製を見る必要があると思います。 公開リポジトリはありますか?

私にとっては、次のように、webpack構成のpath.resolve__dirnameを追加することで機能しました:(私はcreate-react-app + TypeScriptセットアップに取り組んでいます):

config.resolve.modules = [
  ...(config.resolve.modules || []),
  path.resolve(__dirname, "../"),
  path.resolve(__dirname, "../src")
];

私のファイル構造、それに応じてあなたのファイル構造を調整してください:

`` `
/ルート
/.storybook
webpack.config.js
/ src

私が気づかなかった愚かなことは、先頭の../resolve.modulesに追加するのを忘れたことです。

これが私のために働くものです:

// .storybook/webpack.config.js
module.exports = {
  ...,
  resolve: {
    modules: [path.resolve(__dirname, "../src"), "node_modules"],
  }
}

これは、私のストーリーブックwebpack構成が、デフォルトの.storybookディレクトリの1ディレクトリ深い場所にあるためです。

ストーリーブック5で誰かがこれを見ている場合に備えて

const path = require('path');

module.exports = ({ config }) => {
  config.resolve.modules.push(path.resolve(__dirname, "../src"));
  return config;
};

あなたは美しい人@ kexinlu1121。 それは完璧に機能しました、ありがとう。

@glocoreのソリューションは、それが機能するために必要なヒントでした。 ありがとう!

絶対インポートがstart-storybookが、ビルド時に機能しないという同様の問題がありました。 誰かが参照を必要とする場合は、参照用にここに配置します。

絶対インポートに@srcを使用しており、次の行を追加して機能させています。

# /root/.storybook/webpack.config.js

const path = require("path");

module.exports = ({ config }) => {
  // ...

  // Add absolute path.resolve so storybook can handle absolute import (eg. @src/resources/...)
  config.resolve.alias = {
    ...config.resolve.alias,
    "@src": path.resolve(__dirname, "../src"),
  };

  return config;
};

コンテキストとして、私のプロジェクトディレクトリは次のようになります。

/root
  .storybook/
    webpack.config.js
  src/
    components/

それが役に立てば幸い :)

@wzulfikar解決策をありがとう!

CLIを使用した後にこの問題が発生し、.storybook /main.jsを次のように変更することで解決できました。

const path = require('path');

module.exports = {
  ...other settings....,

  webpackFinal: async (config) => {
    config.resolve.modules = [
      ...(config.resolve.modules || []),
      path.resolve(__dirname, "../src"),
    ];

    return config;
  },

}

こんにちは
React / TSを使用しています
.storybook /main.jsで同じ問題が発生しました。

const path = require('path');

module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/preset-create-react-app",
    "@storybook/addon-knobs",
  ],
  webpackFinal: async (config) => {

    config.resolve.alias = {
      ...config.resolve.alias,
      'fs': path.resolve(__dirname, 'fsMock.js'),
      'child_process': path.resolve(__dirname, 'fsMock.js'),
      'net': path.resolve(__dirname, 'fsMock.js'),
      'tls': path.resolve(__dirname, 'fsMock.js'),
      // "src/types": path.resolve(__dirname, "../src/types"),
      // "src/components": path.resolve(__dirname, "../src/components"),
    };

    config.resolve.modules = [
      ...(config.resolve.modules || []),
      path.resolve(__dirname, "../src"),
    ];

    // config.resolve.extensions.push('.ts', '.tsx');

    return config;
  },
}

私の構造

.storybook
src
├── components
|     index.ts
│   ├── ChildrenComponent
│    │  ├── index.tsx
│    │  └── index.stories.tsx
│   ├── ParentComponent
│    │    ├── index.tsx
│    │    └── index.stories.tsx
├── stories

ParentComponentコンポーネント

import React from "react";
import { ChildrenComponent } from "src/components";
import { ItemType } from "src/types";

export default ({ item }: { item: ItemType }) => {
  return (
    <p className="hello">
      <ChildrenComponent type={item.type} />
      <span className="ellipsis">{item.title}</span>
    </p>
  );
};

私はsrc/components/ChildrenComponentを実行しているので、問題はsrc/componentsから発生します。

私はそれを理解していません私はここですべてを試しましたそして#333 #3291と他の多く

エラーのスクリーンショット
image

誰か助けてもらえますか?

このページは役に立ちましたか?
0 / 5 - 0 評価