Storybook: рдореИрдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдкреВрд░реНрдг рдкрде рдХреЗ рд╕рд╛рде рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЬреБрд▓ре░ 2018  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: storybookjs/storybook

рд╕рдВрд╕реНрдХрд░рдг

  • @ рд╕реНрдЯреЛрд░реАрдмреБрдХ / рдПрдбрдСрди-рдПрдХреНрд╢рди: 3.4.8
  • @ рд╕реНрдЯреЛрд░реАрдмреБрдХ / рдПрдбрдСрди-рд▓рд┐рдВрдХ: 3.4.8
  • @ рд╕реНрдЯреЛрд░реАрдмреБрдХ / рдПрдбрдСрди-рд╕реНрдЯреЛрд░реАрд╢реЙрдЯреНрд╕: 3.4.8
  • @ рд╕реНрдЯреЛрд░реАрдмреБрдХ / Addons: 3.4.8
  • @ рд╕реНрдЯреЛрд░реАрдмреБрдХ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: рей.рек.
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛: 16.4.2
  • рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ: 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

рд╡рд┐рд╖рдпрд╛рдВрддрд░

рдПрдХ рддрд░рдл, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдореИрдВ рдпрд╣рд╛рдБ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рд╡рд╣ рд╣реИ "рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдкрде рдШрдЯрдХ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛", рджреВрд╕рд░рд╛ рдПрдХ js рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЖрдпрд╛рддрд┐рдд tsx рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкреВрд░реНрдг рдкрде рдХреЗ рд╕рд╛рде рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдкрде рдХреЗ рд░реВрдк рдореЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХреЗ рд╕рд╛рде рдЖрдпрд╛рддрд┐рдд 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 , рдЗрд╕реЗ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдХреЛрдгреАрдп рдРрдк рдХреЗ рд╕рд╛рде рдЬрд╛рдБрдЪ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)

рдореЗрд░реА .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 рдореИрдВ рдПрдХ рд╕рдорд╛рди рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ (рдКрдкрд░), рд╕рд╛рде рд╣реА рд╕рд╛рде NormalModuleReplacementPlugin рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдЬреЛ resource.request рдкрде рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рди рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ

рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдФрд░ рд╕реБрдЭрд╛рд╡ рд╣реИ?

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг / webpack.config.js рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

.storybook / webpack.config.js

const path = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдкрде'); `
// const webpack = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('webpack');
const genDefaultConfig = рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ('@ рд╕реНрдЯреЛрд░реАрдмреБрдХ / рд░рд┐рдПрдХреНрд╢рди / рдбрд┐рд╕реНрдЯ / рд╕рд░реНрд╡рд░ / рдХреЙрдиреНрдлрд┐рдЧ / рдбрд┐рдлреЙрд▓реНрдЯ / рд╡реЗрдмрдкреИрдХ .config.js');

рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ (рдмреЗрд╕рдХреЙрдиреНрдлрд┐рдЧ, рдПрдирд╡реА) => {
const config = genDefaultConfig (baseConfig, env);
config.module = {
рдирд┐рдпрдо: [
{
рдкрд░реАрдХреНрд╖рдг: /.tsx$/,
рд▓реЛрдбрд░: ["рдЯреАрдПрд╕-рд▓реЛрдбрд░"],
рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ: path.resolve (__ dirname, '../app/xv/')
},
{
рдкрд░реАрдХреНрд╖рдг: /.scss$/,
рд▓реЛрдбрд░: [
'рд╢реИрд▓реА-рд▓реЛрдбрд░',
'рд╕реАрдПрд╕рдПрд╕-рд▓реЛрдбрд░',
'sass-loader? рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВPaths [] =' + encodeURIComponent (path.resolve (__ dirname, '../app/'))
]
},
{
рдкрд░реАрдХреНрд╖рдг: / .css//,
рд▓реЛрдбрд░: 'рд╕реНрдЯрд╛рдЗрд▓-рд▓реЛрдбрд░! рд╕реАрдПрд╕рдПрд╕-рд▓реЛрдбрд░'
},
{
рдкрд░реАрдХреНрд╖рдг: /.less$/,
рд▓реЛрдбрд░: 'рд╕реНрдЯрд╛рдЗрд▓-рд▓реЛрдбрд░! рд╕реАрдПрд╕рдПрд╕-рд▓реЛрдбрд░! рдХрдо рд▓реЛрдбрд░'
},
{
рдкрд░реАрдХреНрд╖рдг: /.jspg.ts$/,
рдмрд╛рд╣рд░ рдХрд░реЗрдВ: [path.join (__ dirname, 'app / Components'), / node_modules /],
рд▓реЛрдбрд░: 'рдПрди-рдПрдиреЛрдЯреЗрдЯ-рд▓реЛрдбрд░'
},
{
рдкрд░реАрдХреНрд╖рдг: /.js$/,
рдмрд╛рд╣рд░ рдХрд░реЗрдВ: [path.join (__ dirname, 'app / Components'), / node_modules /],
рд▓реЛрдбрд░: 'babel- рд▓реЛрдбрд░; рдкреНрд░реАрд╕реЗрдЯреНрд╕ [] = es2015 рдФрд░ рдкреНрд░реАрд╕реЗрдЯреНрд╕]] = рд╕реНрдЯреЗрдЬ -1 рдФрд░ рдкреНрд░реАрд╕реЗрдЯреНрд╕ [] = рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдХреИрд╢рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА'
}
]
};

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

} `

// рдХреЛрдб

`рдЖрдпрд╛рдд * 'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ;

'xv / рдЙрдкрдпреЛрдЧ / рд╕рдЬреНрдЬрд╛рдХрд╛рд░' рд╕реЗ {autobind} рдЖрдпрд╛рдд рдХрд░реЗрдВ;

рдЖрдпрд╛рдд '../ рд╢реИрд▓рд┐рдпрд╛рдБ / ActionIcon.scss'; `

// рддреНрд░реБрдЯрд┐

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

рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛: рддреНрд░реБрдЯрд┐: '/ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рд▓реБрдХрд╛рд╕рдВрджрд░реНрд╕рди / рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ / рдиреЗрдХреНрд╕рдЬреЗрди-рдпреВрдЖрдИ / рдРрдк / xv / ui / рдШрдЯрдХреЛрдВ' рдореЗрдВ 'xv / рдЙрдкрдпреЛрдЧ / рд╕рдЬреНрдЬрд╛рдХрд╛рд░' рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@ ./app/xv/ui/compenders/ActionIcon.tsx 31: 0-46
@ ./storybook/stories/actionIcons.js
@ ./storybook/config.js
@ рдмрд╣реБ ./node_modules/@storybook/react/dist/server/config/polyfills.js ./node_modules/@storybook/react/dist/serf/globals.js (webpack) -hot-рдорд┐рдбрд▓рд╡реЗрдпрд░ / рдХреНрд▓рд╛рдЗрдВрдЯ.рдЬреЗрдПрд╕ reload = true ./ред рд╕реНрдЯреЛрд░реАрдмреБрдХ / config.js`

рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдмрдкреИрдХ рджреЗрд╡ (рдЧреИрд░ рд╕реНрдЯреЛрд░реАрдмреБрдХ) рдмрд┐рд▓реНрдб рдореЗрдВ / xv / рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмреЗрд╕ (рд░реВрдЯ / рдРрдк / xv / *) рд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ

рдореИрдВрдиреЗ NormalModuleReplacementPlugin рдХреЗ рд╕рд╛рде рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдкрд╛рдП рдЧрдП / рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреВрд░реНрдг рдкрдереЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓ рд░рд╣реА рд╣реИрдВ

рдЙрджрд╛рд╣рд░рдг:

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

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

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

рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛: рддреНрд░реБрдЯрд┐: '/ ../app//ui/compenders/Tooltip' /'User/lukasanderson/workspace/NeXgen-UI/.storybook/stories 'рдореЗрдВ рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛

@/.storybook/stories/actionIcons.js 5: 0-47
@ ./storybook/config.js
@ рдмрд╣реБ ./node_modules/@storybook/react/dist/server/config/polyfills.js ./node_modules/@storybook/react/dist/serf/globals.js (webpack) -hot-рдорд┐рдбрд▓рд╡реЗрдпрд░ / рдХреНрд▓рд╛рдЗрдВрдЯ.рдЬреЗрдПрд╕ reload = true ./.storybook/config.js
`

рдФрд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди (рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ / xv / рдЬреЛрдбрд╝рдХрд░)

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

рджреЗрддрд╛ рд╣реИ

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

рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛: рддреНрд░реБрдЯрд┐: '../../app/xv//ui/compenders/Tooltip' рдХреЛ '/Users/lukasanderson/workspace/NeXgen-UI/.storybook-stories' рдореЗрдВ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

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

рдореИрдВ рдиреЗрдХреНрд╕рдЬреЗрди-рдпреВрдЖрдИ (рдЙрд░реНрдл рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ) рд╕реЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ

рдЗрд╕рд▓рд┐рдП рдЗрд╕ import { autobind } from 'xv/util/decorators'; рдЖрдкрдХреЛ path.resolve('./app') рдХреЛ resolve.modules path.resolve('./app') рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рдпрд╣ рд╣реИ

`
config.resolve = {

    modules: [

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

        path.resolve('./app'),

        path.resolve('./')

    ]
};

return config;

`

рдФрд░ рд╡рд╣реА рд╣реЛ рд░рд╣рд╛ рд╣реИ:

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

рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛: рддреНрд░реБрдЯрд┐: '/ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рд▓реБрдХрд╛рд╕рдВрджрд░реНрд╕рди / рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ / рдиреЗрдХреНрд╕рдЬреЗрди-рдпреВрдЖрдИ / рдРрдк / xv / ui / рдШрдЯрдХреЛрдВ' рдореЗрдВ 'xv / рдЙрдкрдпреЛрдЧ / рд╕рдЬреНрдЬрд╛рдХрд╛рд░' рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
`

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ config.resolve.extensions.push('.ts', '.tsx'); рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@ igor-DV рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдПрдХ рдЬрд╛рдирд╛ рднреА, рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ред рдЗрд╕ рдкрд░ рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

Then рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкреНрд░рдЬрдирди рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддрдмред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реЗрдкреЛ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕рдиреЗ рдореЗрд░реЗ webpack config рдореЗрдВ __dirname рд╕реЗ path.resolve рдЬреЛрдбрд╝рдХрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рдЗрд╕ рддрд░рд╣: (рдореИрдВ рдПрдХ create-react-app + рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрдЯрдЕрдк рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ):

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"],
  }
}

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╡реЗрдмрдкреИрдХ рдбрд┐рдлреЙрд▓реНрдЯ .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 рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд╕реАрдПрд▓рдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдпрд╣ рдореБрджреНрджрд╛ рдорд┐рд▓рд╛ рдФрд░ рдореИрдВ рдЕрдкрдиреА .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;
  },

}

рдирдорд╕реНрддреЗ
рдореИрдВ рд░рд┐рдПрдХреНрдЯ / рдЯреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдореБрдЭреЗ рд╡рд╣реА рдореБрджреНрджрд╛ рдорд┐рд▓рд╛ рд╣реИред рдореЗрд░реА .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 рд╕реЗ рдЖрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ src/components/ChildrenComponent рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдФрд░ # 333 # 3291 рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА

рддреНрд░реБрдЯрд┐ рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрди рд╢реЙрдЯ
image

рдХреНрдпрд╛ рдХреЛрдИ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

rpersaud picture rpersaud  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ZigGreen picture ZigGreen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

levithomason picture levithomason  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xogeny picture xogeny  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MrOrz picture MrOrz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ