Storybook: Ich kann nicht mit absolutem Pfad in Storybook importieren

Erstellt am 24. Juli 2018  ·  25Kommentare  ·  Quelle: storybookjs/storybook

Ausführung

  • @ Storybook / Addon-Aktionen: 3.4.8
  • @ storybook / addon-links: 3.4.8
  • @ storybook / addon-storyshots: 3.4.8
  • @ storybook / addons: 3.4.8
  • @ storybook / reagieren: 3.4.8
  • Reaktion: 16.4.2
  • TypeScript: 2.9.2

Verhalten

Beim Erstellen der folgenden Komponenten wird im Storybook ein Fehler angezeigt.

# 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 />
);

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

Dies scheint durch das Laden mit einem absoluten Pfad verursacht zu werden. Wenn Sie also Folgendes tun, funktioniert dies einwandfrei.
import ChildrenComponent from '../../molecules/ChildrenComponent/index';

Ich möchte diese Methode jedoch so weit wie möglich vermeiden. Gibt es keine andere Möglichkeit, das Storybook ohne Fehler zu starten, als durch den relativen Pfad anzugeben?

Die Anwendung des absoluten Pfads basiert auf der folgenden Beschreibung von tsconfig.json .

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

Außerdem importieren wir dieses Mal eine stories -Datei, die in der tsx-Erweiterung in das kompilierte Verzeichnis src anstatt dieses Mal das Verzeichnis build/dist im Storybook zu kompilieren.

Dies ist in ./storybook/config , aber wenn Sie es auf build/dist werden ähnliche Ergebnisse erzielt.

Da dieses Projekt atomares Design verwendet, hat es ungefähr die folgende Verzeichnisstruktur.

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

Verwandte Themen

Es schien so etwas wie das relevante Thema zu geben.
Es wurde jedoch keine Lösung gefunden.

333, # 3438

Abschweifung

Abgesehen davon glaube ich, dass es zwei Möglichkeiten gibt, dieses Problem zu lösen.

Das erste, was ich hier fragen möchte, ist "Absolute Pfadkomponente mit Storybook importieren". Das zweite ist das Kompilieren in eine js -Datei, die die importierte tsx -Datei mit einem absoluten Pfad importiert als relativer Weg. Wenden Sie danach die importierte js -Datei mit dem relativen Pfad zum Storybook an.

In Bezug auf Letzteres halte ich es nicht für angebracht, dieses Problem hier anzuhören, aber wenn Sie es wissen, möchte ich auch nach dieser Methode fragen.

Vielen Dank für Ihre Zeit.

react question / support typescript

Hilfreichster Kommentar

Für den Fall, dass jemand nach Storybook 5 sucht,

const path = require('path');

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

Alle 25 Kommentare

Ich weiß nicht, wie es für Sie in Ihrer regulären App funktioniert (wie ist Ihr Setup?), Aber wenn Sie Ihren cwd (unter der Annahme -> cwd/src/components/.... ) auf resolve.modules im erweiterten webpack.config sollte es wahrscheinlich Ihr Problem lösen (ich habe es zwar mit einer Angular-App überprüft, aber es spielt keine Rolle)

Meine .storybook/webpack.config.js -Datei wird wie folgt beschrieben.
Gibt es hier ein Problem?

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;
};

Versuchen Sie Folgendes hinzuzufügen:

const path = require('path');

// blah blah code

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

  // blah blah code

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

Es hat richtig funktioniert !!
Ich kann Ihnen nicht genug danken!!!!!!!

u-r-welcome

@ igor-dv Ich habe ein ähnliches Problem und habe Ihren Vorschlag (oben) sowie das NormalModuleReplacementPlugin ausprobiert, mit dem der Pfad resource.request geändert wird. Weder haben gearbeitet

Haben Sie weitere Vorschläge?

Können Sie bitte Ihre Codebeispiele / webpack.config.js teilen?

.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 = {
Regeln: [
{
Test: /.tsx$/,
Lader: ["ts-loader"],
include: path.resolve (__ dirname, '../app/xv/')
},
{
Test: /.scss$/,
Lader: [
'Style-Loader',
'CSS-Loader',
'sass-loader? includePaths [] =' + encodeURIComponent (path.resolve (__ dirname, '../app/'))
]]
},
{
Test: /.css$/,
loader: 'style-loader! css-loader'
},
{
Test: /.less$/,
loader: 'style-loader! css-loader! less-loader'
},
{
Test: /.js|.ts$/,
ausschließen: [path.join (__ dirname, 'app / components'), / node_modules /],
Loader: 'ng-annotate-loader'
},
{
Test: /.js$/,
ausschließen: [path.join (__ dirname, 'app / components'), / node_modules /],
loader: '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;
//     })
// ]

} `

// Code

`import * as React from 'react';

{autobind} aus 'xv / util / decorators' importieren;

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

// Error

`ERROR in ./app/xv/ui/components/ActionIcon.tsx

Modul nicht gefunden: Fehler: 'xv / util / decorators' in '/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components' kann nicht aufgelöst werden.

@ ./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`

mit / xv / wird der Basis des Projekts (root / app / xv / *) im üblichen Webpack-Entwickler-Build (kein Storybook) zugeordnet

Entschuldigung für die Formatierung

Ich habe verschiedene Varianten des Regex-Ersatzes mit NormalModuleReplacementPlugin ausprobiert, einige davon in ähnlichen Threads / Problemen über Storybooks, die keine absoluten Pfade verarbeiten

Beispiel:

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

gibt mir diesen Fehler:

`ERROR in ./.storybook/stories/actionIcons.js

Modul nicht gefunden: Fehler: '../../app//ui/components/Tooltip' in '/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories' kann nicht aufgelöst werden.

@ ./.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
`

und diese Änderung (Hinzufügen von / xv / zur Ersatzzeichenfolge)

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

gibt

`ERROR in ./.storybook/stories/actionIcons.js

Modul nicht gefunden: Fehler: '../../app/xv//ui/components/Tooltip' in '/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories' kann nicht behoben werden.

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

Wenn ich den richtigen Pfadersatz für absolute Pfade habe, sind nicht nur die relativen Pfade durcheinander, sondern der Pfad ist 'korrekt' und ein Fehler bleibt bestehen:

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'

Was ist Ihr Arbeitsverzeichnis (cwd)?

Wurzel/

  • .storybook
  • App
    - xv
    --- ui
    ---- Komponenten
    --- Utensilien

Ich starte das Storybook von NeXgen-UI (auch bekannt als Projektstamm).

Wenn Sie also dieses import { autobind } from 'xv/util/decorators'; , sollten Sie wahrscheinlich path.resolve('./app') zu den resolve.modules hinzufügen

Okay, also habe ich das jetzt

`
config.resolve = {

    modules: [

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

        path.resolve('./app'),

        path.resolve('./')

    ]
};

return config;

`

und bekomme das gleiche:

`ERROR in ./app/xv/ui/components/ActionIcon.tsx

Modul nicht gefunden: Fehler: 'xv / util / decorators' in '/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components' kann nicht aufgelöst werden.
`

Sieht so aus, als müssten Sie auch config.resolve.extensions.push('.ts', '.tsx'); hinzufügen

@ igor-dv Ich habe das auch ausprobiert, der gleiche Fehler. Danke für die Hilfe dazu

🤔 Ich denke, ich muss dann die Reproduktion sehen. Hast du ein öffentliches Repo?

Für mich funktionierte es, indem ich __dirname zu path.resolve in meiner Webpack-Konfiguration hinzufügte, wie folgt: (Ich arbeite an einem Setup zum Erstellen, Reagieren und App + TypeScript-Setup):

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

Meine Dateistruktur, passen Sie Ihre entsprechend an:

`` `
/Wurzel
/.storybook
webpack.config.js
/ src

Das Dumme, was ich nicht realisiert habe, ist, dass ich vergessen habe, meiner resolve.modules -Konfiguration ein führendes ../ hinzuzufügen.

Folgendes funktioniert bei mir:

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

Dies liegt daran, dass sich meine Storybook-Webpack-Konfiguration 1 Verzeichnis tiefer im Standardverzeichnis .storybook .

Für den Fall, dass jemand nach Storybook 5 sucht,

const path = require('path');

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

Du schöne Person @ kexinlu1121. Es hat perfekt funktioniert, danke.

Die Lösung von @glocore war der Hinweis, den ich brauchte, damit es funktioniert. Vielen Dank!

Ich hatte ein ähnliches Problem, bei dem mein absoluter Import in start-storybook funktioniert, aber nicht beim Erstellen. Ich werde es hier nur als Referenz einfügen, wenn jemand eine Referenz möchte.

Ich verwende @src für den absoluten Import und habe es durch Hinzufügen dieser Zeile zum Laufen gebracht:

# /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;
};

Für den Kontext sieht mein Projektverzeichnis folgendermaßen aus:

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

Ich hoffe es hilft :)

@wzulfikar Vielen Dank für Ihre Lösung!

Ich habe dieses Problem nach der Verwendung von CLI erhalten und konnte es beheben, indem ich meine .storybook / main.js wie folgt geändert habe:

const path = require('path');

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

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

    return config;
  },

}

Hallo
Ich benutze React / TS
Ich habe das gleiche Problem mit meinem .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;
  },
}

meine Struktur

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

Eine ParentComponent-Komponente

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>
  );
};

Das Problem kommt von src/components weil ich src/components/ChildrenComponent mache, es funktioniert.

Ich verstehe es nicht, ich habe hier alles versucht und # 333 # 3291 und viele andere

Ein Screenshot des Fehlers
image

Kann jemand helfen ?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen