Storybook: Je ne peux pas importer avec un chemin absolu dans Storybook

CrĂ©Ă© le 24 juil. 2018  Â·  25Commentaires  Â·  Source: storybookjs/storybook

Version

  • @ storybook / addon-actions: 3.4.8
  • @ storybook / addon-links: 3.4.8
  • @ storybook / addon-storyshots: 3.4.8
  • @ livre d'histoires / addons: 3.4.8
  • @ livre d'histoires / react: 3.4.8
  • RĂ©agir: 16.4.2
  • TypeScript: 2.9.2

Comportement

Une erreur sera affichée dans le livre de contes lors de la création des composants suivants.

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

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

Cela semble ĂȘtre causĂ© par le chargement avec un chemin absolu, donc si vous faites ce qui suit, cela fonctionne bien.
import ChildrenComponent from '../../molecules/ChildrenComponent/index';

Cependant, je voudrais éviter cette méthode autant que possible. N'y a-t-il aucun moyen de démarrer un livre d'histoires sans erreurs autres que la spécification par chemin relatif?

L'application du chemin absolu est basée sur la description suivante de tsconfig.json .

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

De plus, cette fois, nous importons un fichier stories écrit en extension tsx dans le répertoire src compilé plutÎt que le répertoire compilé build/dist sur le livre de contes cette fois.

Ceci est défini dans ./storybook/config , mais le définir sur build/dist produira des résultats similaires.

Comme ce projet utilise la conception atomique, il a à peu prÚs la structure de répertoires suivante.

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

ProblÚmes liés

Il semblait y avoir quelque chose comme la question pertinente.
Cependant, il n’a pas trouvĂ© de solution.

333, # 3438

Digression

En passant, je crois qu'il y a deux façons de résoudre ce problÚme.

La premiÚre chose que je voudrais demander ici est de "Importer un composant de chemin absolu avec un livre de contes", la seconde est de compiler dans un fichier js qui importe le fichier tsx importé avec un chemin absolu comme chemin relatif. AprÚs cela, appliquez le fichier importé js avec le chemin relatif du livre de contes.

En ce qui concerne ce dernier, je pense qu'il n'est pas approprié d'écouter ce problÚme ici, mais si vous le connaissez, je voudrais également vous poser des questions sur cette méthode.

Merci pour votre temps.

react question / support typescript

Commentaire le plus utile

Au cas oĂč quelqu'un regarde ceci pour le livre d'histoires 5

const path = require('path');

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

Tous les 25 commentaires

Je ne sais pas comment cela fonctionne pour vous dans votre application réguliÚre (comme quelle est votre configuration?), Mais si vous allez mettre votre cwd (en supposant -> cwd/src/components/.... ) dans le resolve.modules dans l'extension webpack.config , cela devrait probablement résoudre votre problÚme (je l'ai vérifié avec une application Angular, mais cela n'a pas vraiment d'importance)

Mon fichier .storybook/webpack.config.js est décrit comme suit.
Y a-t-il un problĂšme ici?

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

Essayez d'ajouter quelque chose comme ceci:

const path = require('path');

// blah blah code

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

  // blah blah code

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

Cela a fonctionné correctement !!
Je ne vous remercierai jamais assez!!!!!!!

u-r-welcome

@ igor-dv J'ai un problÚme similaire et j'ai essayé votre suggestion (ci-dessus), ainsi que le NormalModuleReplacementPlugin qui modifie le chemin resource.request. Ni l'un ni l'autre n'ont fonctionné

Avez-vous d'autres suggestions?

Pouvez-vous s'il vous plaĂźt partager vos exemples de code / webpack.config.js?

.storybook / webpack.config.js

const path = require ('chemin'); `
// 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 = {
rĂšgles: [
{
test: /.tsx$/,
chargeurs: ["ts-loader"],
inclure: path.resolve (__ dirname, '../app/xv/')
},
{
test: /.scss$/,
chargeurs: [
'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$/,
exclure: [path.join (__ dirname, 'app / components'), / node_modules /],
chargeur: 'ng-annotate-loader'
},
{
test: /.js$/,
exclure: [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 * comme React de 'react';

import {autobind} depuis 'xv / util / decorators';

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

// Erreur

`ERREUR dans ./app/xv/ui/components/ActionIcon.tsx

Module non trouvé: Erreur: Impossible de résoudre «xv / util / decorators» dans «/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components»

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

avec / xv / mappé à la base du projet (root / app / xv / *) dans la construction habituelle du webpack dev (non storybook)

désolé pour le formatage

J'ai essayé différentes variantes du remplacement de l'expression réguliÚre avec NormalModuleReplacementPlugin, certaines trouvées dans des fils / problÚmes similaires sur le livre de contes ne gérant pas les chemins absolus

exemple:

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

me donne cette erreur:

`ERREUR dans ./.storybook/stories/actionIcons.js

Module introuvable: Erreur: impossible de résoudre «../../app//ui/components/Tooltip» dans «/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories»

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

et ce changement (ajouter / xv / Ă  la chaĂźne de remplacement)

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

donne

`ERREUR dans ./.storybook/stories/actionIcons.js

Module introuvable: Erreur: impossible de résoudre «../../app/xv//ui/components/Tooltip» dans «/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories»

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

lorsque j'ai le bon remplacement de chemin pour les chemins absolus, non seulement les chemins relatifs sont perturbés, mais le chemin est `` correct '' et une erreur persiste:

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'

Quel est votre répertoire de travail (cwd)?

racine/

  • .storybook
  • app
    - xv
    --- ui
    ----Composants
    --- utils

Je démarre le livre d'histoires à partir de NeXgen-UI (aka racine du projet)

Donc, ayant ce import { autobind } from 'xv/util/decorators'; vous devriez probablement ajouter path.resolve('./app') au resolve.modules

bien, donc j'ai maintenant ceci

»
config.resolve = {

    modules: [

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

        path.resolve('./app'),

        path.resolve('./')

    ]
};

return config;

»

et j'obtiens la mĂȘme chose:

`ERREUR dans ./app/xv/ui/components/ActionIcon.tsx

Module non trouvé: Erreur: Impossible de résoudre «xv / util / decorators» dans «/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components»
»

Il semble que vous deviez Ă©galement ajouter config.resolve.extensions.push('.ts', '.tsx');

@ igor-dv J'ai essayĂ© ça aussi, mĂȘme erreur. Merci pour l'aide Ă  ce sujet

đŸ€” Je pense que j'ai besoin de voir la reproduction, alors. Avez-vous un repo public?

Pour moi, cela a fonctionné en ajoutant __dirname à path.resolve dans ma configuration webpack, comme ceci: (je travaille sur une configuration create-react-app + TypeScript):

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

Ma structure de fichiers, ajustez la vÎtre en conséquence:

''
/racine
/.storybook
webpack.config.js
/ src

La chose stupide que je n'ai pas réussi à réaliser est que j'ai oublié d'ajouter un ../ à ma configuration resolve.modules .

Voici ce qui fonctionne pour moi:

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

C'est parce que ma configuration webpack de storybook se trouve 1 répertoire plus profond dans le répertoire par défaut .storybook .

Au cas oĂč quelqu'un regarde ceci pour le livre d'histoires 5

const path = require('path');

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

Belle personne @ kexinlu1121. Cela a parfaitement fonctionné, merci.

La solution de @glocore Ă©tait l'indice dont j'avais besoin pour que cela fonctionne. Merci!

J'ai eu un problĂšme similaire oĂč mon importation absolue fonctionne dans start-storybook mais pas lorsque je construis. Je vais simplement le mettre ici pour rĂ©fĂ©rence si quelqu'un veut une rĂ©fĂ©rence.

J'utilise @src pour l'importation absolue et je l'ai fait fonctionner en ajoutant cette ligne:

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

Pour le contexte, mon répertoire de projet ressemble à ceci:

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

J'espĂšre que cela aide :)

@wzulfikar Merci pour votre solution!

J'ai eu ce problÚme aprÚs avoir utilisé la CLI et j'ai pu le résoudre en modifiant mon .storybook / main.js en:

const path = require('path');

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

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

    return config;
  },

}

Bonjour
J'utilise React / TS
J'ai eu le mĂȘme problĂšme avec mon .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;
  },
}

ma structure

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

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

Le problÚme vient de src/components parce que je fais src/components/ChildrenComponent ça marche.

Je ne comprends pas j'ai tout essayé ici et # 333 # 3291 et bien d'autres

Une capture d'Ă©cran de l'erreur
image

Quelqu'un peut-il aider?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

MrOrz picture MrOrz  Â·  3Commentaires

wahengchang picture wahengchang  Â·  3Commentaires

ZigGreen picture ZigGreen  Â·  3Commentaires

sakulstra picture sakulstra  Â·  3Commentaires

purplecones picture purplecones  Â·  3Commentaires