Storybook: Saya tidak dapat mengimpor dengan jalur absolut di Buku Cerita

Dibuat pada 24 Jul 2018  Β·  25Komentar  Β·  Sumber: storybookjs/storybook

Versi: kapan

  • @ buku cerita / addon-tindakan: 3.4.8
  • @ buku cerita / addon-links: 3.4.8
  • @ buku cerita / addon-storyshots: 3.4.8
  • @ buku cerita / addons: 3.4.8
  • @ buku cerita / bereaksi: 3.4.8
  • Bereaksi: 16.4.2
  • TypeScript: 2.9.2

Tingkah laku

Kesalahan akan ditampilkan di buku cerita saat membuat komponen berikut.

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

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

Hal ini tampaknya disebabkan oleh pemuatan dengan jalur absolut, jadi jika Anda melakukan hal berikut ini berfungsi dengan baik.
import ChildrenComponent from '../../molecules/ChildrenComponent/index';

Namun, saya ingin menghindari metode ini sebisa mungkin. Apakah tidak ada cara untuk memulai buku cerita tanpa kesalahan selain menentukan berdasarkan jalur relatif?

Penerapan jalur absolut didasarkan pada deskripsi tsconfig.json .

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

Juga, kali ini kita mengimpor file stories ditulis dalam ekstensi tsx dalam direktori src dikompilasi daripada menyusun direktori build/dist pada buku cerita kali ini.

Ini disetel di ./storybook/config , tetapi menyetelnya ke build/dist akan menghasilkan hasil yang serupa.

Karena proyek ini menggunakan desain atom, kira-kira memiliki struktur direktori berikut.

src
β”œβ”€β”€ components
β”‚    β”œβ”€β”€ molecules
β”‚    β”‚   β”œβ”€β”€ ChildrenComponent
β”‚    β”‚   β”‚   β”œβ”€β”€ index.tsx
β”‚    β”‚   β”‚   └── index.stories.tsx
β”‚    β”œβ”€β”€ organisms
β”‚    β”‚   β”œβ”€β”€ ParentComponent
β”‚    β”‚   β”‚   β”œβ”€β”€ index.tsx
β”‚    β”‚   β”‚   └── index.stories.tsx

Masalah terkait

Sepertinya ada sesuatu seperti masalah yang relevan.
Namun, itu tidak mencapai solusi.

333, # 3438

Penyimpangan

Selain itu, saya yakin ada dua cara untuk mengatasi masalah ini.

Hal pertama yang saya ingin bertanya di sini adalah untuk "komponen path absolut Impor dengan buku cerita", yang kedua adalah untuk mengkompilasi ke js berkas yang impor mengimpor tsx berkas dengan path absolut sebagai jalur relatif. Setelah itu, terapkan file js diimpor dengan jalur relatif ke buku cerita.

Mengenai yang terakhir, menurut saya tidak tepat untuk mendengarkan masalah ini di sini, tetapi jika Anda mengetahuinya, saya ingin bertanya tentang metode itu juga.

Terima kasih atas waktunya.

react question / support typescript

Komentar yang paling membantu

Jika ada yang melihat ini untuk buku cerita 5,

const path = require('path');

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

Semua 25 komentar

Saya tidak tahu bagaimana cara kerjanya untuk Anda di aplikasi reguler Anda (seperti apa pengaturan Anda?), Tetapi jika Anda akan meletakkan cwd Anda (dengan asumsi -> cwd/src/components/.... ) ke resolve.modules dalam perpanjangan webpack.config , itu mungkin akan menyelesaikan masalah Anda (saya telah memeriksanya dengan aplikasi Angular, tetapi itu tidak terlalu penting)

File .storybook/webpack.config.js dijelaskan sebagai berikut.
Apakah ada masalah disini?

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

Coba tambahkan sesuatu seperti ini:

const path = require('path');

// blah blah code

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

  // blah blah code

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

Ini bekerja dengan baik !!
Saya tidak bisa cukup berterima kasih !!!!!!!

u-r-welcome

@ igor-dv Saya mengalami masalah serupa, dan telah mencoba saran Anda (di atas), serta NormalModuleReplacementPlugin yang mengubah jalur resource.request. Tidak ada yang berhasil

Apakah Anda punya saran lain?

Bisakah Anda membagikan contoh kode / webpack.config.js Anda?

.storybook / webpack.config.js

const path = membutuhkan ('path']; `
// const webpack = membutuhkan ('webpack');
const genDefaultConfig = membutuhkan ('@ buku cerita / react / dist / server / config / defaults / webpack.config.js');

module.exports = (baseConfig, env) => {
const config = genDefaultConfig (baseConfig, env);
config.module = {
aturan: [
{
tes: /.tsx$/,
pemuat: ["ts-loader"],
termasuk: path.resolve (__ dirname, '../app/xv/')
},
{
test: /.scss$/,
pemuat: [
'style-loader',
'css-loader',
'sass-loader? includePaths [] =' + encodeURIComponent (path.resolve (__ dirname, '../app/'))
]
},
{
test: /.css$/,
loader: 'style-loader! css-loader'
},
{
tes: /.less$/,
loader: 'style-loader! css-loader! less-loader'
},
{
tes: /.jsi>.ts$/,
kecualikan: [path.join (__ dirname, 'app / components'), / node_modules /],
loader: 'ng-annotate-loader'
},
{
tes: /.js$/,
kecualikan: [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;
//     })
// ]

} `

// kode

`import * as React from 'react';

impor {autobind} dari 'xv / util / decorators';

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

// kesalahan

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

Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan 'xv / util / decorators' di '/ 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`

dengan / xv / dipetakan ke dasar proyek (root / app / xv / *) di build dev webpack biasa (bukan buku cerita)

maaf untuk formatnya

Saya telah mencoba berbagai variasi penggantian regex dengan NormalModuleReplacementPlugin, beberapa ditemukan di utas / masalah serupa tentang buku cerita yang tidak menangani jalur absolut

contoh:

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

beri saya kesalahan ini:

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

Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan '../../app//ui/components/Tooltip' di '/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
`

dan perubahan ini (menambahkan / xv / ke string pengganti)

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

memberi

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

Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan '../../app/xv//ui/components/Tooltip' in '/Users/lukasanderson/workspace/NeXgen-UI/.storybook/stories'

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

ketika saya memiliki pengganti jalur yang benar untuk jalur absolut, tidak hanya jalur relatifnya yang kacau, tetapi juga jalurnya 'benar' dan kesalahan terus berlanjut:

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'

Apa direktori kerja Anda (cwd)?

akar/

  • .storybook
  • aplikasi
    - xv
    --- ui
    ---- komponen
    --- utils

Saya memulai buku cerita dari NeXgen-UI (alias root proyek)

Jadi memiliki import { autobind } from 'xv/util/decorators'; Anda mungkin harus menambahkan path.resolve('./app') ke resolve.modules

baiklah, jadi sekarang saya punya ini

`
config.resolve = {

    modules: [

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

        path.resolve('./app'),

        path.resolve('./')

    ]
};

return config;

`

dan saya mendapatkan yang sama:

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

Modul tidak ditemukan: Kesalahan: Tidak dapat menyelesaikan 'xv / util / decorators' di '/ Users / lukasanderson / workspace / NeXgen-UI / app / xv / ui / components'
`

Sepertinya Anda juga perlu menambahkan config.resolve.extensions.push('.ts', '.tsx');

@ igor-dv Saya mencobanya juga, kesalahan yang sama. Terima kasih atas bantuannya

πŸ€” Kalau begitu, saya pikir saya perlu melihat reproduksinya. Apakah Anda memiliki repo publik?

Bagi saya, ini bekerja dengan menambahkan __dirname ke path.resolve di konfigurasi webpack saya, seperti ini: (Saya sedang mengerjakan pengaturan create-react-app + TypeScript):

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

Struktur file saya, sesuaikan milik Anda:

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

Hal bodoh yang gagal saya sadari adalah saya lupa menambahkan ../ ke konfigurasi resolve.modules .

Inilah yang berhasil untuk saya:

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

Ini karena konfigurasi webpack buku cerita saya terletak 1 direktori lebih dalam di default .storybook dir.

Jika ada yang melihat ini untuk buku cerita 5,

const path = require('path');

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

Anda orang cantik @ kexinlu1121. Ini bekerja dengan sempurna, terima kasih.

Solusi @glocore adalah petunjuk yang saya butuhkan agar berfungsi. Terima kasih!

Saya memiliki masalah serupa di mana impor absolut saya berfungsi dalam start-storybook tetapi tidak saat saya membuatnya. Saya hanya akan menaruhnya di sini untuk referensi jika seseorang menginginkan referensi.

Saya menggunakan @src untuk impor absolut dan membuatnya berfungsi dengan menambahkan baris ini:

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

Untuk konteksnya, direktori proyek saya terlihat seperti ini:

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

Semoga membantu :)

@wzulfikar Terima kasih atas solusinya!

Saya mendapatkan masalah ini setelah menggunakan CLI dan saya dapat mengatasinya dengan memodifikasi .storybook / main.js saya menjadi:

const path = require('path');

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

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

    return config;
  },

}

Halo
Saya menggunakan React / TS
Saya mendapat masalah yang sama .storybook / main.js saya:

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

struktur saya

.storybook
src
β”œβ”€β”€ components
|     index.ts
β”‚   β”œβ”€β”€ ChildrenComponent
β”‚    β”‚  β”œβ”€β”€ index.tsx
β”‚    β”‚  └── index.stories.tsx
β”‚   β”œβ”€β”€ ParentComponent
β”‚    β”‚    β”œβ”€β”€ index.tsx
β”‚    β”‚    └── index.stories.tsx
β”œβ”€β”€ stories

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

Masalahnya datang dari src/components karena saya melakukan src/components/ChildrenComponent itu berhasil.

Saya tidak mengerti, saya mencoba semuanya di sini dan # 333 # 3291 dan banyak lainnya

Tangkapan layar kesalahan
image

Adakah yang bisa membantu?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

rpersaud picture rpersaud  Β·  3Komentar

dnlsandiego picture dnlsandiego  Β·  3Komentar

shilman picture shilman  Β·  3Komentar

arunoda picture arunoda  Β·  3Komentar

sakulstra picture sakulstra  Β·  3Komentar