Storybook: 였λ₯˜: 내보내기가 μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 04μ›” 03일  Β·  78μ½”λ©˜νŠΈ  Β·  좜처: storybookjs/storybook

μŠ€ν† λ¦¬λΆμ€ 처음 μ¨λ³΄λŠ”λ° κ°€μ΄λ“œλ₯Ό λ”°λΌν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.
μ˜ˆμ œμ™€ ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ ν•  수 μžˆμ§€λ§Œ λ‚΄ ꡬ성 μš”μ†Œλ₯Ό κ°€μ Έμ˜€μž 마자 __exportsκ°€ μ •μ˜λ˜μ§€ μ•ŠμŒ__이 ν‘œμ‹œλ©λ‹ˆλ‹€.
_"λΉ λ₯Έ μ‹œμž‘ κ°€μ΄λ“œ"_ λ˜λŠ” _"느린 μ‹œμž‘ κ°€μ΄λ“œ(React)"_λ₯Ό μ‚¬μš©ν•˜λ“  상관없이 항상 λ™μΌν•œ 도움이 λ˜μ§€ μ•ŠλŠ” 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

수좜이 μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

ReferenceError: 내보내기가 μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
κ°œμ²΄μ—μ„œ.(http://localhost:6006/static/preview.bundle.js:43176:23)
__webpack_require__μ—μ„œ (http://localhost:6006/static/preview.bundle.js:679:30)
fnμ—μ„œ (http://localhost:6006/static/preview.bundle.js:89:20)
κ°œμ²΄μ—μ„œ.(http://localhost:6006/static/preview.bundle.js:43132:76)
κ°œμ²΄μ—μ„œ.(http://localhost:6006/static/preview.bundle.js:43142:30)
__webpack_require__μ—μ„œ (http://localhost:6006/static/preview.bundle.js:679:30)
fnμ—μ„œ (http://localhost:6006/static/preview.bundle.js:89:20)
loadStoriesμ—μ„œ (http://localhost:6006/static/preview.bundle.js:40160:3)
ConfigApi._renderMainμ—μ„œ (http://localhost:6006/static/preview.bundle.js:41134:20)
λ Œλ”λ§ μ‹œ (http://localhost:6006/static/preview.bundle.js:41092:17)
ConfigApi.configureμ—μ„œ (http://localhost:6006/static/preview.bundle.js:41117:9)
κ°œμ²΄μ—μ„œ.(http://localhost:6006/static/preview.bundle.js:40164:68)
Object.defineProperty.valueμ—μ„œ (http://localhost:6006/static/preview.bundle.js:40165:30)
__webpack_require__μ—μ„œ (http://localhost:6006/static/preview.bundle.js:679:30)
fnμ—μ„œ (http://localhost:6006/static/preview.bundle.js:89:20)
Object.window.STORYBOOK_REACT_CLASSESμ—μ„œ (http://localhost:6006/static/preview.bundle.js:38867:18)
__webpack_require__μ—μ„œ (http://localhost:6006/static/preview.bundle.js:679:30)
http://localhost:6006/static/preview.bundle.js:725:39μ—μ„œ
http://localhost:6006/static/preview.bundle.js:728:10μ—μ„œ

κ·Έ 였λ₯˜λŠ”λ³„λ‘œ λ„μ›€μ΄λ˜μ§€ μ•ŠμœΌλ©° 였λ₯˜λ₯Ό μ‘°νšŒν•˜λ©΄ μž‘λ…„λΆ€ν„°μ΄ λ¬Έμ œκ°€ νŒ¨μΉ˜λ˜μ—ˆλ‹€κ³  λ§ν•˜λŠ” λͺ‡ 가지 λ¬Έμ œκ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
μŠ€ν† λ¦¬λΆμ΄ μ’‹μ•„ν•˜μ§€ μ•ŠλŠ” λ°©μ‹μœΌλ‘œ λ‚΄λ³΄λ‚΄λŠ” 것은 μ•„λ§ˆλ„ λ‚΄ ꡬ성 μš”μ†ŒμΌ κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚΄κ°€ μ–»λŠ” 것은 __exportsκ°€ μ •μ˜λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ—__ (stacktrace의 엉망과 ν•¨κ»˜) λ””λ²„κ·Έν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” typescriptλ₯Ό μ‚¬μš©ν•˜κ³  있으며 ν‰λ²”ν•œ 였래된 tsc둜 μ»΄νŒŒμΌν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

//tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "jsx": "react",
    "declaration": true,
    "sourceMap": true,
    "outDir": "./dist",
    "esModuleInterop": true
  },
  "include": [
    "./src/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

그런 λ‹€μŒ 컴파일된 jsλ₯Ό μŠ€ν† λ¦¬λΆμœΌλ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

//index.stories.jsx
import React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';

import { MatrixEffect } from '../dist/index';

storiesOf('MatrixEffect', module)
  .add('100x100', () => 
    <MatrixEffect height={100} width={100} />
  );

버전

  • @storybook/react 3.4.0
  • @storybook/addon-actions 3.4.0
  • babel-core 6.26.0
  • react 16.3.0

λ‚΄κ°€ 무엇을 λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
(λ§Œμ•½ tsλ₯Ό λ°”λ‘œ κ°€μ Έμ˜¬ 수 μžˆλŠ” 방법이 μžˆλ‹€λ©΄ 더 쒋을 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 곡식적인 λ¬Έμ„œλ₯Ό 찾지 λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— 이것이 μ§€κΈˆκΉŒμ§€ 얻은 κ²ƒμž…λ‹ˆλ‹€)

babel / webpack compatibility with other tools has workaround high priority typescript

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 λ¬Έμ œλŠ” .babelrc νŒŒμΌμ— μ˜¬λ°”λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. tsconfig νŒŒμΌμ€ commonjs ν˜Έν™˜ λͺ¨λ“ˆμ„ μƒμ„±ν•˜λ„λ‘ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ μ ˆν•œ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

{
    "env": {
        "test": {
            "plugins": ["instanbul"]
        }
    },
    "plugins": ["@babel/plugin-syntax-dynamic-import", "@babel/plugin-transform-modules-commonjs"]
}

이것은 λ‚΄ .babelrc νŒŒμΌμ— μžˆλŠ” 것이며 λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€. μ •ν™•νžˆ λ™μΌν•œ μ˜΅μ…˜κ³Ό 값을 가진 tsconfig 파일이 μžˆμŠ΅λ‹ˆλ‹€.

"@babel/core" "^7.1.0"
"@storybook/react" ^4.0.0-μ•ŒνŒŒ.2"
"react" "^16.4.0"

μ°Έκ³ : 이 μ†”λ£¨μ…˜μ€ λ‹€λ₯Έ μ’…λ₯˜μ˜ λͺ¨λ“ˆμ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. https://babeljs.io/docs/en/next/plugins#modules

λͺ¨λ“  78 λŒ“κΈ€

ν„°λ―Έλ„μ—μ„œ export 'MatrixEffect' was not found in '../dist/index' λ₯Ό λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 일반 λ…Έλ“œ λŸ°νƒ€μž„μ—μ„œ λͺ¨λ“ˆμ„ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€(μ‚¬μš©ν•  μˆ˜λŠ” μ—†μ§€λ§Œ 적어도 κ°€μ Έμ˜¬ 수 μžˆλ‹€λŠ” 것은 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€).

아직 곡식 λ¬Έμ„œκ°€ μ—†κΈ° λ•Œλ¬Έμ— 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. https://github.com/storybooks/storybook/issues/3270

이것은 μ—¬μ „νžˆ β€‹β€‹μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ ...

lerna ν”„λ‘œμ νŠΈμ—μ„œ 원사 μž‘μ—… 곡간을 μΌ  ν›„ μŠ€ν† λ¦¬λΆμ—μ„œ λ™μΌν•œ 였λ₯˜ λ©”μ‹œμ§€μ™€ ν•¨κ»˜ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 νŒ¨ν‚€μ§€ λ‘œλ”© 문제둜 μΈν•œ 것이라고 μƒκ°ν•©λ‹ˆλ‹€. μΆ”κ°€ 쑰사 μ€‘μž…λ‹ˆλ‹€.

같은 λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

문제λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν–ˆλ‹€λ©΄ .jsμ—μ„œ .ts νŒŒμΌμ„ ν•΄κ²°ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ? (ν•˜μ§€λ§Œ dist μ—μ„œ ꡬ성 μš”μ†Œλ₯Ό κ°€μ Έμ˜€λŠ” 이유λ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.)

ν™•μž₯ μŠ€ν† λ¦¬λΆ webpack.config의 resolve.extensions 에 .ts / .tsx λ₯Ό μΆ”κ°€ν•΄μ•Ό ν• κΉŒμš”?

@igor-dv μ•„λ‹ˆμš”, JSλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ–΄μ¨Œλ“ , λ³€μˆ˜ μ‹λ³„μž( variable to Variable )λ₯Ό λ³€κ²½ν•˜λ©΄ μ–΄λ–»κ²Œλ“  μž‘λ™ν•©λ‹ˆλ‹€.

TypeScriptλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  바닐라 JS만 μ‚¬μš©ν•˜λŠ” 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

.storybook webpack.config.js μ—μ„œ babel loaderλ₯Ό μ œκ±°ν–ˆλŠ”λ° 이제 μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. λ‚˜λŠ” Typescriptλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ—μ„œ exports is not defined λ₯Ό μ–»μ—ˆμ§€λ§Œ ν„°λ―Έλ„μ—μ„œ `"export 'default'('[ComponentName]'둜 κ°€μ Έμ˜΄)λ₯Ό '@[namespace]/[μ—μ„œ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€. νŒ¨ν‚€μ§€ 이름]'"

  • λ₯΄λ‚˜ μ‚¬μš©ν•˜κΈ°
  • μŠ€ν† λ¦¬λΆ 3.4.7
  • λ‚΄λΆ€ 쒅속성이 μ—†λŠ” ꡬ성 μš”μ†Œμ— λŒ€ν•΄ λͺ¨λ“  것이 μ •μƒμž…λ‹ˆλ‹€.
  • project/packages 의 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μ’…μ†λœ λͺ¨λ“ˆμ„ κ°€μ Έμ˜€λ €κ³  ν•˜λ©΄ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.
  • λ‚΄ λΉŒλ“œ 슀크립트λ₯Ό μ‹€ν–‰ μ€‘μ΄λ―€λ‘œ νŒ¨ν‚€μ§€μ˜ common-js 버전을 κ°€μ Έμ˜€λ €κ³  ν•©λ‹ˆλ‹€.

λ‚΄λΆ€ μ’…μ†μ„±μ˜ package.json κΈ°λ³Έ ꡬ성을 λΉŒλ“œλ˜μ§€ μ•Šμ€ μ†ŒμŠ€λ‘œ λ³€κ²½ν•˜λ©΄ λͺ¨λ“  것이 μž‘λ™ν•©λ‹ˆλ‹€.

κ·Έλž˜μ„œ μŠ€ν† λ¦¬λΆμ˜ webpack 섀정에 λ¬Έμ œκ°€ 있고 cjsλ₯Ό es λͺ¨λ“ˆ μ½”λ“œλ‘œ κ°€μ Έμ˜€λŠ” 것, μ•„λ‹ˆλ©΄ λ­”κ°€ ...

λ‚΄ μˆ˜μ •

κ·Έλž˜μ„œ λ‚˜λŠ” μ‹€μˆ˜λ‘œ λ‚΄ λΉŒλ“œμ˜ ES λͺ¨λ“ˆ 버전을 κ°€λ¦¬ν‚€λŠ” package.json "module" ν•„λ“œλ₯Ό μ‚­μ œν–ˆμŒμ„ κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μΆ”κ°€ν•˜λ©΄ λͺ¨λ“  것이 λ‹€μ‹œ μž‘λ™ν•©λ‹ˆλ‹€. μ—¬μ „νžˆ μŠ€ν† λ¦¬λΆμ€ cjs 버전을 λŒμ–΄μ˜¬ 수 μžˆμ„ 것 κ°™μ§€λ§Œ λ‚΄ λ¬Έμ œλŠ” ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€ πŸ€·πŸ½β€β™‚οΈ

이것은 babel 7.0.0이 μžˆλŠ” v4.0.0-alpha.20μ—μ„œ μ—¬μ „νžˆ λ°œμƒν•©λ‹ˆλ‹€.

@tony도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. κ·Έλž˜λ„ μ €λŠ” Flowλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

@ryanflorence μŠ€ν† λ¦¬λΆμ— λŒ€ν•œ λ™μΌν•œ lerna μ„€μ •κ³Ό 내보내기 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
UI μš”μ†Œμ˜ λΉŒλ“œ 버전을 λ…ΈμΆœν•˜λŠ” νŒ¨ν‚€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.
μ£„μ†‘ν•˜μ§€λ§Œ "module" field that pointed to the ES module version of my builds, adding that back in makes everything work again. 라고 λ§μ”€ν•˜μ‹€ λ•Œ 더 μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œλŠ” .babelrc νŒŒμΌμ— μ˜¬λ°”λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. tsconfig νŒŒμΌμ€ commonjs ν˜Έν™˜ λͺ¨λ“ˆμ„ μƒμ„±ν•˜λ„λ‘ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ μ ˆν•œ ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

{
    "env": {
        "test": {
            "plugins": ["instanbul"]
        }
    },
    "plugins": ["@babel/plugin-syntax-dynamic-import", "@babel/plugin-transform-modules-commonjs"]
}

이것은 λ‚΄ .babelrc νŒŒμΌμ— μžˆλŠ” 것이며 λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€. μ •ν™•νžˆ λ™μΌν•œ μ˜΅μ…˜κ³Ό 값을 가진 tsconfig 파일이 μžˆμŠ΅λ‹ˆλ‹€.

"@babel/core" "^7.1.0"
"@storybook/react" ^4.0.0-μ•ŒνŒŒ.2"
"react" "^16.4.0"

μ°Έκ³ : 이 μ†”λ£¨μ…˜μ€ λ‹€λ₯Έ μ’…λ₯˜μ˜ λͺ¨λ“ˆμ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. https://babeljs.io/docs/en/next/plugins#modules

λ‚˜μ—κ²Œ 이 λ¬Έμ œλŠ” 4.0.0.alpha에 babel-loaderλ₯Ό ν¬ν•¨ν•˜λ„λ‘ 졜근 λ³€κ²½λœ μ‚¬ν•­μœΌλ‘œ 인해 λ°œμƒν•©λ‹ˆλ‹€. κΈ°λ³Έ μ„œλ²„ μ›ΉνŒ© κ΅¬μ„±μ—λŠ” commonjs 컴파일(νŒ¨ν‚€μ§€, μž‘μ—… 곡간)이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
https://github.com/storybooks/storybook/blob/b2b73596f9dd97b4ba8c03340bd36f868e836772/lib/core/src/server/config/utils.js#L3

λ‚˜λ₯Ό μœ„ν•΄ μˆ˜μ •μ€ κΈ°λ³Έ ν”ŒλŸ¬κ·ΈμΈ 선언을 μ‚¬μš©μž μ •μ˜ webpack.dev.js둜 μž¬μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

https://github.com/psychobolt/react-rollup-boilerplate/blob/d9cb9179cb7c00baab486646c504110bf7e2f50a/.storybook/webpack.config.js#L7

// exclude 'babel-loader' so we can override it later
...defaultConfig.module.rules.filter(rule => !(
    (rule.use && rule.use.length && rule.use.find(({ loader }) => loader === 'babel-loader'))
)),

https://github.com/psychobolt/react-rollup-boilerplate/blob/d9cb9179cb7c00baab486646c504110bf7e2f50a/.storybook/webpack.config.js#L11

{
  test: /\.jsx?$/,
  include: require('path').resolve('./'),
  exclude: /(node_modules|dist)/, // exclude any commonjs files
  loader: 'babel-loader',
},

include λ₯Ό μƒλž΅ν•΄λ„ λ¬Έμ œκ°€ ν•΄κ²°λ˜κ³  λΆ€μž‘μš©μ΄ μ—†μŠ΅λ‹ˆλ‹€.

무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”μ§€ μ΄ν•΄ν•˜λŠ” 것 κ°™μ•„μš”.

@psychobolt κ°€ λ§ν•˜λŠ” 것은 100% λ§žμŠ΅λ‹ˆλ‹€.

monorepo μ‚¬μš©μžλ₯Ό μœ„ν•΄ 더 잘 ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μœ„μ˜ 일이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ κΈ°λ³Έ webpack ꡬ성을 λ§Œλ“œμ‹­μ‹œμ˜€.

include: includePaths, λ₯Ό μ œκ±°ν•˜λ©΄ λ¬Έμ œκ°€ 해결될 것이라고 μƒκ°ν•˜μ§€λ§Œ λ¬Έμ œλŠ” μ„±λŠ₯ λΉ„μš©μ΄ μ–Όλ§ˆμΈμ§€μž…λ‹ˆλ‹€.

이 문제λ₯Ό κ°€μž₯ 잘 ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•œ 쒋은 μ œμ•ˆμ΄ μžˆλŠ” μ‚¬λžŒμ€ λˆ„κ΅¬μž…λ‹ˆκΉŒ?

μš°λ¦¬λŠ” λ˜ν•œ 이 문제λ₯Ό μš°μ—°νžˆ λ°œκ²¬ν–ˆκ³  그것이 무엇인지 μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ ꡬ성과 μ‹Έμš°λŠ” 데 λ°˜λ‚˜μ ˆ 이상이 κ±Έλ ΈμŠ΅λ‹ˆλ‹€. 😒

@cilice μ–΄λ–»κ²Œ ν•΄κ²°ν•˜μ…¨λ‚˜μš”?

@0nn0 https://github.com/storybooks/storybook/issues/3346#issuecomment-425516669 이 쑰언을 λ”°λ₯΄μ„Έμš” :)

stotybook-4.1.4, Lerna ν”„λ‘œμ νŠΈ, React 16.7.0, plain JS와 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. Storybook-4.0.12μ—μ„œ μž‘λ™

4.1.4μ—μ„œ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 4.0.10으둜 λŒμ•„κ°€ 잘 μž‘λ™ν•©λ‹ˆλ‹€(νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ—†μŒ) babel-webapck

μˆ˜μ •λœ ꡬ성을 μ‚¬μš©ν•˜μ—¬ babel-loaderμ—μ„œ 컴파일된 좜λ ₯을 μ œμ™Έν•˜λ©΄ μ΅œμ‹  μŠ€ν† λ¦¬λΆ νŒ¨ν‚€μ§€κ°€ μžˆλŠ” Lerna λ˜λŠ” monorepo ν”„λ‘œμ νŠΈμ—μ„œ 이 문제λ₯Ό ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@psychobolt 예제 ꡬ성을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 감사 ν•΄μš”.

이것이 λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ 도움이 될지 ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ λ‹€μŒμ„ μ‹€ν–‰ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

npm i react-scripts -D

@skeet 동화책에 λ©”μ‹œμ§€κ°€ μžˆλŠ” μ΄μœ κ°€ κΆκΈˆν–ˆμ–΄μš”

info => Using base config because react-scripts is not installed.
info => Using default webpack setup based on "create-react-app".
info => Using base config because react-scripts is not installed.

λ”°λΌμ„œ react-scriptsλ₯Ό μ„€μΉ˜ν•œ ν›„ λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ©λ‹ˆλ‹€.

info => Loading create-react-app config.
info => Using default webpack setup based on "create-react-app".
info => Loading create-react-app config.

μš°λ¦¬λŠ” λ˜ν•œ exports is not defined 문제λ₯Ό λͺ‡ 번 κ²ͺμ—ˆκ³  이전에 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ œμ•ˆν•œ 바벨 ꡬ성을 μž¬μ •μ˜ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ΅œκ·Όμ— 이것을 λ‹€μ‹œ μ‘°μ‚¬ν•˜κΈ° μ‹œμž‘ν–ˆκ³  κΈ°λ³Έ JS κ·œμΉ™μ— λŒ€ν•œ exclude 속성이 μ ˆλŒ€ 경둜둜 ν™•μΈλ˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€(μ•„λž˜λŠ” μƒμ„±λœ Webpack κ΅¬μ„±μ˜ console.log() μž…λ‹ˆλ‹€).

{
  test: /\.(mjs|jsx?)$/,
  use: [
    {
      loader: 'babel-loader',
      options: {
        cacheDirectory: '.cache/storybook',
        presets: [
          [
            '@babel/preset-env',
            { shippedProposals: true, useBuiltIns: 'usage' }
          ],
          '@babel/preset-react',
          '@babel/preset-flow'
        ],
        plugins: [
          'babel-plugin-macros',
          '@babel/plugin-proposal-class-properties',
          [
            'babel-plugin-react-docgen',
            { DOC_GEN_COLLECTION_NAME: 'STORYBOOK_REACT_CLASSES' }
          ]
        ]
      }
    }
  ],
  include: ['/Users/matt.hinchliffe/Project/'],
  exclude: ['/Users/matt.hinchliffe/Project/node_modules']
}

exclude 속성이 RegExpμ—¬μ•Ό ν•œλ‹€κ³  κ°€μ •ν–ˆκΈ° λ•Œλ¬Έμ— 이상해 λ³΄μ˜€μŠ΅λ‹ˆλ‹€! 우리 ν”„λ‘œμ νŠΈμ˜ ꡬ쑰 λ•Œλ¬Έμ— μ‹€μ œλ‘œ λ§Žμ€ node_modules 폴더가 μžˆλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이 라인 을 RegExp( /node_modules/ )둜 μ—…λ°μ΄νŠΈν•˜λ €κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 그것을 κ³ μ³€μŠ΅λ‹ˆλ‹€!

이것은 이미 트랜슀파일된 λͺ¨λ“ˆμ„ νŠΈλžœμŠ€νŒŒμΌν•˜λŠ” 것을 λ°©μ§€ν•˜κ³  특히 preset-env의 useBuiltins μ˜΅μ…˜μ΄ preset-env core-js 폴리필을 μ£Όμž…ν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€( useBuiltins μ˜΅μ…˜ λ˜λŠ” μ„€μ • 제거 폴리필이 ν•„μš”ν•˜μ§€ μ•Šμ€ λŸ°νƒ€μž„μ„ λŒ€μƒμœΌλ‘œ ν•˜λŠ” ν™˜κ²½λ„ 이 문제λ₯Ό λ°©μ§€ν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.)

λ”°λΌμ„œ 이 문제λ₯Ό μΌμœΌν‚€λŠ” λͺ‡ 가지 λ‹€λ₯Έ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

  1. node_modules ν΄λ”μ˜ 쒅속성은 Babel에 μ˜ν•΄ μ˜λ„μΉ˜ μ•Šκ²Œ λ³€ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. useBuiltins μ˜΅μ…˜μ€ λͺ¨λ“ˆ μœ ν˜•μ— λŒ€ν•΄ 잘λͺ»λœ ν˜•μ‹μœΌλ‘œ core-js 폴리필을 μ½”λ“œμ— μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€(https://github.com/babel/babel/issues/7463 및 https:// μ°Έμ‘°). github.com/babel/babel/issues/9187)
  3. νŒ¨ν‚€μ§€κ°€ 심볼릭 λ§ν¬λ˜λŠ” 경우(예: monorepo) 포인트 1을 ν”Όν•˜κΈ° μœ„ν•΄ κ°λ³„νžˆ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€!

λΆˆν–‰νžˆλ„ κΈ°μ‘΄ μ œμ™Έ μ˜΅μ…˜ 을 ν™•μž₯ν•˜λŠ” 것은 쉽지 μ•Šμ§€λ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€ !

λ‚˜λŠ” 그것을 ν”Όν•˜λŠ” 방법에 λŒ€ν•œ 정보와 ν•¨κ»˜ 이 λ¬Έμ œμ— λŒ€ν•œ μΆ•μ†Œλœ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. ν•„μš”ν•œ 경우 Babel에 문제λ₯Ό μ œκΈ°ν•  κ²ƒμž…λ‹ˆλ‹€.

https://github.com/i-like-robots/broken-webpack-bundle-test-case

μš°λ¦¬λŠ” μŠ€ν† λ¦¬λΆ + lerna + typescriptλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 우리λ₯Ό μœ„ν•΄ ν•΄κ²°λœ 것은 @i-like-robots와 @psychobolt λ₯Ό ν˜Όν•©ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

module.exports = (baseConfig, env, config) => {
    config.module.rules = config.module.rules.filter(rule => !(
        (rule.use && rule.use.length && rule.use.find(({ loader }) => loader === 'babel-loader'))
    ));
    config.module.rules.push({
        test: /\.(ts|tsx)$/,
        loader: require.resolve('babel-loader'),
        options: {
            sourceType: 'unambiguous',
            presets: [['react-app', { flow: false, typescript: true }]],
        },

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

μš°λ¦¬λŠ” ruκ°€ 그것을 κ³ μΉ  λ•Œ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μƒˆλ‘œ μ„€μΉ˜ν•  λ•Œ 이 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. 원인이 무엇인지에 λŒ€ν•œ λ‹¨μ„œκ°€ μ—†μŠ΅λ‹ˆλ‹€( create-react-app 의 μ„€μ •κ³Ό 이 μ„€μ • μ‚¬μ΄μ˜ .babelrc 와 μΆ©λŒν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆκΉŒ?).

.babelrc νŒŒμΌμ— λ‹€μŒ 쀄을 μΆ”κ°€ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

"sourceType": "unambiguous"

이 μ˜΅μ…˜μ— λŒ€ν•œ μΆ”κ°€ 정보: https://babeljs.io/docs/en/options#sourcetype
이 μ˜΅μ…˜μ€ Babel 7 μ΄μƒμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬λžŒλ“€μ˜ λ¬Έμ œκ°€ 무엇인지 μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•œ 채 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄(μ£„μ†‘ν•©λ‹ˆλ‹€!) -- 여기에 이 β€‹β€‹λ¬Έμ œλ₯Ό ν•΄κ²°ν•˜λŠ” λ‚΄ webpack κ΅¬μ„±μ˜ μŠ€λ‹ˆνŽ«μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 더 κ°„λ‹¨ν•œ 방법일 κ²ƒμž…λ‹ˆλ‹€.

  const babelLoader = storybookBaseConfig.module.rules[0];
  babelLoader.exclude.push(
    path.resolve('./lib/components/node_modules'),
    /* etc */
  );

@tmeasday μ œμ•ˆμ— λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ? 즉, ν•΄λ‹Ή μ½”λ“œλ₯Ό 어디에 λ°°μΉ˜ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

Storybook은 ν›Œλ₯­ν•˜μ§€λ§Œ 이 였λ₯˜λŠ” 간헐적이고 λ”μ°ν•©λ‹ˆλ‹€. 이 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ‹œμž‘ν•˜λŠ” μ΄μœ μ— λŒ€ν•œ μš΄μœ¨μ΄λ‚˜ 이유λ₯Ό 찾지 λͺ»ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” ꡬ성 μš”μ†Œλ‘œ μ†Œλž€μ„ ν”Όμš°κ³  뢐을 μΌμœΌν‚€κ³  λͺ¨λ“  것이 μ‹€μ œλ‘œ λ³€κ²½λ˜μ§€ μ•Šκ³  μž‘λ™ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” 이것을 μž‘λ™μ‹œν‚€λ €κ³  ν•œ μ‹œκ°„ λ™μ•ˆ κ°‡ν˜€ μžˆμ—ˆκ³  이것이 μ™œ κ³ μž₯λ‚¬λŠ”μ§€ κ°€μž₯ νλ¦Ών•œ 생각이 μ—†μŠ΅λ‹ˆλ‹€.

λ§Žμ€ μ‚¬λžŒλ“€μ—κ²Œ 영ν–₯을 λ―ΈμΉ˜λŠ” κ²ƒμœΌλ‘œ 보이며 μ‡ΌμŠ€ν† νΌμΈ 이 문제λ₯Ό μ‚΄νŽ΄λ³΄μ‹­μ‹œμ˜€.

λ‹€μŒμ„ ν¬ν•¨ν•˜λŠ” .storybook/weback.config.js νŒŒμΌμ„ λ§Œλ“€μ–΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

const path = require('path');

// Export a function. Accept the base config as the only param.
module.exports = async ({ config, mode }) => {
    // `mode` has a value of 'DEVELOPMENT' or 'PRODUCTION'
    // You can change the configuration based on that.
    // 'PRODUCTION' is used when building the static version of storybook.

    config.module.rules[0].use[0].options.sourceType = "unambiguous";

    return config;
};

sourceType babel 문제둜 κ·€κ²°λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. .babelrc νŒŒμΌμ„ μΆ”κ°€ν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ(@0nn0μ—μ„œ μ œμ•ˆν•œ λŒ€λ‘œ), μ΄λŠ” 전체 babel ꡬ성을 μˆ˜μ •ν•˜κΈ° λ³΄λ‹€λŠ” λŒ€μ²΄ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ˜€κ³ , 이둜 인해 μΆ”κ°€ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

@JasonTheAdams μœ„μ—μ„œ μž‘μ„±ν•œ μ½”λ“œ 쑰각은 .storybook/webpack.config.js 에 λ“€μ–΄κ°ˆ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ‹  일과 λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ‚΄κ°€ μƒκ°ν•˜λŠ” 일은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

문제 λŠ” ν•˜μœ„ ν”„λ‘œμ νŠΈ(예: ./lib/components/node_modules ) λ‚΄μ˜ node_modules 파일이 babel에 μ˜ν•΄ 컴파일되고 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이미 NPM으둜 λ°°μ†‘λœ 파일이며 μ»΄νŒŒμΌν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μ–΄λ–€ κ²½μš°μ—λŠ” babel이 νŒŒμΌμ„ ꡬ문 λΆ„μ„ν•˜λŠ” 방법과 κ΄€λ ¨ν•˜μ—¬ ν˜Όλž€μŠ€λŸ¬μš΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μ ‘κ·Ό 방식은 node_modules 폴더 λ‚΄μ˜ νŒŒμΌμ„ μ»΄νŒŒμΌν•˜μ§€ μ•Šλ„λ‘ babel-loader 에 μ§€μ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 기본적으둜 ./node_modules λ₯Ό λ¬΄μ‹œν•˜λ―€λ‘œ ν•˜μœ„ ν”„λ‘œμ νŠΈμ˜ node_modules λ‚΄λΆ€ λ₯Ό μ»΄νŒŒμΌν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ exclude λͺ©λ‘μ— λͺ‡ 가지 경둜λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

λ‹Ήμ‹ μ˜ μ ‘κ·Ό 방식은 babel의 sourceType 감지λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒμΌμ„ ꡬ문 λΆ„μ„ν•˜λŠ” 방법을 μ•Œλ €μ£Όλ„λ‘ babel-loader λ₯Ό κ΅¬μ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 기본적으둜 babel의 잘λͺ»λœ ꡬ문 뢄석 νŒŒμΌμ„ ν•΄κ²°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ babel은 μ—¬μ „νžˆ β€‹β€‹μ»΄νŒŒμΌν•  ν•„μš”κ°€ μ—†λŠ” νŒŒμΌμ—μ„œ μ‹€ν–‰ μ€‘μ΄λ―€λ‘œ μ›ν•˜λŠ” 것인지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” μ „λ¬Έκ°€κ°€ μ•„λ‹ˆλ―€λ‘œ λ‚΄ 말을 ν•œ μ•Œμ˜ μ†ŒκΈˆμœΌλ‘œ 받아듀이지 만 λΉ„μŠ·ν•œ 문제λ₯Ό 슀슀둜 ν•΄κ²° ν•œ κ²ƒμœΌλ‘œ μ΄ν•΄ν•©λ‹ˆλ‹€.

@skeet 의 μ œμ•ˆ(https://github.com/storybooks/storybook/issues/3346#issuecomment-459308703)을 μ μš©ν•œ ν›„ ν•œ νŒ¨ν‚€μ§€λ₯Ό λͺ‡ 가지 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 쒅속성(ν”Όμ–΄ λ˜λŠ” κ°œλ°œμžκ°€ μ•„λ‹˜)으둜 μ°Έμ‘°ν•˜κΈ° μ‹œμž‘ν–ˆμ„ λ•Œ λ¬Έμ œκ°€ λ°˜ν™˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. .

@ryanflorence 의 μˆ˜μ • 사항(https://github.com/storybooks/storybook/issues/3346#issuecomment-415982589)μ—μ„œμ™€ 같이 module ν•„λ“œλ₯Ό μ’…μ†μ„±μ˜ package.json 에 λ„£μœΌλ©΄ μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

   main: "dist/index.js",
+  module: "dist/index.js",

@tmeasday μ•Œμ•˜ μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이 λ¬Έμ œμ— λŒ€ν•΄ 머리λ₯Ό 싸맀기 μ‹œμž‘ν–ˆλ‹€. κΉŒλ‹€λ‘œμš΄ 점은 제 μƒν™©μ—μ„œ μ‹€μ œλ‘œ node_modules μžμ‹μ„ μ»΄νŒŒμΌν•˜κΈ°λ₯Ό _do_ ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ°”λ‘œ κ·Έκ³³μ—μ„œ ꡬ성 μš”μ†Œ 자체λ₯Ό κ°œλ°œν•˜κ³  λ³„λ„μ˜ νŒ¨ν‚€μ§€λ‘œ μ·¨κΈ‰ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

@jcousins-ynap이 반ν–₯ν•œ @skeet 의 μ œμ•ˆμ΄ μ•„λ§ˆλ„ μ—¬κΈ°μ—μ„œ κ°€μž₯ 쒋은 μ†”λ£¨μ…˜μΌ κ²ƒμž…λ‹ˆλ‹€. μš°λ¦¬λŠ” Storybook이 ν•˜μœ„ νŒ¨ν‚€μ§€κ°€ μ–΄λ–»κ²Œ μ²˜λ¦¬λ˜λŠ”μ§€(즉, node_modules λ¬΄μ‹œ) κ°€μ •ν•˜λŠ” 것을 μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€κ°€ ν•˜μœ„ λͺ¨λ“ˆ node_modulesκ°€ μ»΄νŒŒμΌλ˜λŠ” 것을 μ›ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ²˜μŒλΆ€ν„° νŒ¨ν‚€μ§€ 쒅속성을 μ„€μΉ˜ν•˜μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€.

이것은 λͺ¨λ‘ babel + webpack이 CommonJS와 ES6 λͺ¨λ“ˆμ„ μΈμ‹ν•˜λŠ” λŠ₯λ ₯에 달렀 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ™„λ²½ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€. "module": ν•„λ“œλ₯Ό ν•˜μœ„ νŒ¨ν‚€μ§€μ˜ package.json 에 μΆ”κ°€ν•˜λ©΄ νŒ¨ν‚€μ§€κ°€ 이에 μ ‘κ·Όν•˜λŠ” κ°€μž₯ μ•ˆμ „ν•œ 방법인 ES6 λͺ¨λ“ˆμ„ μ‚¬μš©ν•œλ‹€λŠ” 것을 babel에 λͺ…μ‹œμ μœΌλ‘œ μ•Œλ¦½λ‹ˆλ‹€.

관심을 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ—¬κΈ°μ—μ„œ μ°¨μž„ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. Storybook 5, Babel 7.4(core-js 3 포함), TypeScript 3.4 및 monorepo μ‚¬μš©. μ΄λŸ¬ν•œ μ œμ•ˆμ˜ λŒ€λΆ€λΆ„μ€ 100% μž‘λ™ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ λ‚΄κ°€ 깨달은 것이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. monorepos의 λ³Έμ§ˆμ€ νŒ¨ν‚€μ§€κ°€ μ†ŒμŠ€ 파일이 μ•„λ‹Œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ "λΉŒλ“œλœ" νŒŒμΌμ„ κ°€μ Έμ˜€λŠ” κ²ƒμž…λ‹ˆλ‹€. NPM λ ˆμ§€μŠ€νŠΈλ¦¬/λ…Έλ“œ λͺ¨λ“ˆ κ³„μΈ΅μ—μ„œλŠ” μ‚¬μ‹€μ΄μ§€λ§Œ 개발 μ€‘μ—λŠ” μƒλ‹Ήνžˆ μ„±κ°€μ‹­λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ lib/ λ₯Ό src/ 둜 μ „λ‹¬ν•˜λŠ” Webpack 별칭을 μ •μ˜ν–ˆμœΌλ©° 특히 λͺ¨λ“  μ½”λ“œκ°€ 이제 ESNext/ESM이기 λ•Œλ¬Έμ— λͺ¨λ“  것이 μ œλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

해킹은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

glob.sync(path.join(__dirname, '../packages/*/package.json')).forEach(filePath => {
  const { name } = require(filePath);

  config.resolve.alias[`${name}$`] = `${name}/src`;
  config.resolve.alias[`${name}/lib`] = `${name}/src`;
});

그리고 Babel + TSκ°€ μž‘λ™ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μƒˆ ν•­λͺ©μ„ μΆ”κ°€ν•˜λŠ” λŒ€μ‹  κΈ°μ‘΄ babel-loaderλ₯Ό λ³€κ²½ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ 둜컬 Babel ꡬ성은 Storybookκ³Ό 100% ν˜Έν™˜λ˜μ§€ μ•Šμ§€λ§Œ 자체 ꡬ성은 ν˜Έν™˜λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

const babelConfig = config.module.rules[0];

// Replace Flow with TypeScript
babelConfig.test = /\.(j|t)sx?$/;
babelConfig.exclude.push(/node_modules/);
babelConfig.use[0].options.sourceType = 'unambiguous';
babelConfig.use[0].options.presets[2] = require.resolve('@babel/preset-typescript');
babelConfig.use.unshift({ loader: require.resolve('react-docgen-typescript-loader') });

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

module ν•„λ“œ 제거둜 인해 λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
이 주석에 μ„€λͺ…λœ λŒ€λ‘œ babel ν”ŒλŸ¬κ·ΈμΈμ— @babel/plugin-transform-modules-commonjs λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/storybooks/storybook/issues/3346#issuecomment -423719241

@elado μž‘μ—…!

이것도 μ™„μ „νžˆ λ§‰ν˜”μŠ΅λ‹ˆλ‹€. μ§€λ‚œ ~ 2일 λ™μ•ˆ 이 μŠ€λ ˆλ“œμ˜ λͺ¨λ“  μ œμ•ˆκ³Ό λ‚΄ μ œμ•ˆμ„ λͺ¨λ‘ μ‹œλ„ν•˜λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. 아무도 μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€ 😒

ꢁ극적으둜 λ‹€μŒκ³Ό 같이 λ‚¨μŠ΅λ‹ˆλ‹€.

WARNING in ./packages/one/src/index.jsx 2:289-293
"export 'default' (imported as 'Two') was not found in '@my-monorepo/two'
 @ ./packages/one/src/index.stories.jsx
 @ ./packages sync \.stories\.jsx$
 @ ./.storybook/config.js
 @ multi ./node_modules/@storybook/core/dist/server/common/polyfills.js ./node_modules/@storybook/core/dist/server/preview/globals.js ./.storybook/config.js

...μŠ€ν† λ¦¬λΆμ„ μ‹œμž‘ν•  λ•Œμ™€...

index.js:49 ReferenceError: exports is not defined
    at react-is.development.js:18
    at Module../packages/one/node_modules/react-is/cjs/react-is.development.js (react-is.development.js:226)
    at __webpack_require__ (bootstrap:785)
    at fn (bootstrap:150)
    at Object../packages/one/node_modules/react-is/index.js (index.js:6)
    at __webpack_require__ (bootstrap:785)
    at fn (bootstrap:150)
    at Object../packages/one/node_modules/prop-types/index.js (index.js:9)
    at __webpack_require__ (bootstrap:785)
    at fn (bootstrap:150)

...μŠ€ν† λ¦¬λΆ ui(http://localhost:9001)λ₯Ό λ³Ό λ•Œ. λ‚΄ 이야기가 λ‘œλ“œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

fwiw, λ‚΄ 섀정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

β”œβ”€β”€ .storybook/
β”‚   β”œβ”€β”€ addons.js
β”‚   β”œβ”€β”€ config.js
β”‚   └── webpack.config.js
β”‚
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ one
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ index.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ index.stories.jsx
β”‚   β”‚   β”‚   └── index.test.jsx
β”‚   β”‚   β”œβ”€β”€ dist/
β”‚   β”‚   β”‚   β”œβ”€β”€ index.js
β”‚   β”‚   β”‚   β”œβ”€β”€ index.stories.js
β”‚   β”‚   β”‚   └── index.test.js
β”‚   β”‚   └── package.json
β”‚   β”‚
β”‚   └── two
β”‚       β”œβ”€β”€ src/
β”‚       β”‚   β”œβ”€β”€ index.jsx
β”‚       β”‚   β”œβ”€β”€ index.stories.jsx
β”‚       β”‚   └── index.test.jsx
β”‚       β”œβ”€β”€ dist/
β”‚       β”‚   β”œβ”€β”€ index.js
β”‚       β”‚   β”œβ”€β”€ index.stories.js
β”‚       β”‚   └── index.test.js
β”‚       └── package.json
β”‚
β”œβ”€β”€ .babelrc
β”œβ”€β”€ .eslintrc.js
β”œβ”€β”€ jest.config.js
β”œβ”€β”€ lerna.json
β”œβ”€β”€ npm-shrinkwrap.json
└── package.json


addons.js

import '@storybook/addon-knobs/register';
import '@storybook/addon-backgrounds/register';
import '@storybook/addon-storysource/register';


config.js

import { configure } from '@storybook/react';

const req = require.context('../packages', true, /.stories.jsx$/);

function loadStories(){
    req.keys().forEach(filename => req(filename));
}

configure(loadStories, module);


μ›ΉνŒ©.config.js

module.exports = {
    module: {
        rules: [
            {
                test: /\.stories\.jsx?$/,
                loaders: [require.resolve('@storybook/addon-storysource/loader')],
                enforce: 'pre'
            }
        ]
    }
};


.babelrc

{
    "presets": ["@babel/preset-env", "@babel/preset-react"],
    "plugins": [
        "@babel/plugin-transform-modules-commonjs"
    ]
}


package.json(루트)

{
  "name": "my-monorepo",
  "description": "monorepo containing POC react ui component library",
  "version": "1.0.0",
  "author": "me",
  "scripts": {
    "postinstall": "npm run bootstrap",
    "bootstrap": "lerna bootstrap",
    "storybook": "npm run build && start-storybook --port 9001 --config-dir .storybook --ci",
    "test": "npm run lint && npm run test:unit",
    "test:unit": "npm run build && NODE_ENV=development BABEL_ENV=test jest --no-watchman",
    "test:unit:watch": "npm run test:unit -- --watch",
    "test:unit:snapshot": "npm run test:unit -- --updateSnapshot",
    "lint": "eslint . --ext .js,.jsx --ignore-path .gitignore",
    "lint:fix": "npm run lint -- --fix",
    "build": "npm run clean && lerna run build",
    "clean": "lerna run clean",
    "clean:modules": "lerna clean --yes",
    "release": "npm run build && lerna publish",
    "start": "npm run storybook"
  },
  "dependencies": {},
  "devDependencies": {
    "@babel/cli": "^7.5.5",
    "@babel/core": "^7.5.5",
    "@babel/plugin-transform-modules-commonjs": "^7.5.0",
    "@babel/preset-env": "^7.5.5",
    "@babel/preset-react": "^7.0.0",
    "@storybook/addon-backgrounds": "^5.1.9",
    "@storybook/addon-knobs": "^5.1.9",
    "@storybook/addon-storysource": "^5.1.9",
    "@storybook/react": "^5.1.9",
    "babel-jest": "^22.4.1",
    "babel-loader": "^8.0.6",
    "enzyme": "^3.10.0",
    "enzyme-adapter-react-16": "^1.14.0",
    "enzyme-to-json": "^3.3.5",
    "eslint": "^4.18.2",
    "eslint-config-particle": "^2.2.1",
    "eslint-plugin-react": "^7.14.2",
    "jest": "^22.4.2",
    "jest-styled-components": "^6.3.3",
    "lerna": "^3.15.0",
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "styled-components": "^4.3.2"
  }
}


package.json(ν•˜λ‚˜)

{
  "name": "@my-monorepo/one",
  "description": "react component one",
  "version": "1.1.0",
  "author": "me",
  "main": "dist/index.js",
  "scripts": {
    "test": "cd ../../ && npm test",
    "build": "babel ./src --out-dir ./dist --ignore test.jsx,stories.jsx --config-file ../../.babelrc",
    "clean": "rm -rf ./dist"
  },
  "peerDependencies": {
    "react": ">=15",
    "styled-components": ">=3"
  },
  "dependencies": {
    "@my-monorepo/two": "^1.1.0",
    "create-react-class": "^15.6.3",
    "prop-types": "^15.7.2"
  }
}


package.json(2개)

{
  "name": "@my-monorepo/two",
  "description": "react component two",
  "version": "1.1.0",
  "author": "me",
  "main": "dist/index.js",
  "scripts": {
    "test": "cd ../../ && npm test",
    "build": "babel ./src --out-dir ./dist --ignore test.jsx,stories.jsx --config-file ../../.babelrc",
    "clean": "rm -rf ./dist"
  },
  "peerDependencies": {
    "react": ">=15"
  },
  "dependencies": {
    "create-react-class": "^15.6.3",
    "prop-types": "^15.7.2"
  }
}

ꡬ성 μš”μ†Œμ˜ ./src 디렉토리 λ‚΄μ˜ λͺ¨λ“  ν•­λͺ©μ€ ESM μŠ€νƒ€μΌ κ°€μ Έμ˜€κΈ°/내보내기λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. @my-monorepo/one λŠ” @my-monorepo/two 에 따라 λ‹€λ¦…λ‹ˆλ‹€. μ„€μΉ˜ μ‹œ lerna _links_ 쒅속성( lerna bootstrap 을 톡해). λͺ¨λ“  νŒ¨ν‚€μ§€λŠ” babel을 μ‚¬μš©ν•˜μ—¬ λΉŒλ“œλ©λ‹ˆλ‹€. μ΅œμƒμœ„ npm run build λͺ…령은 κ°œλ³„ ./dist 디렉토리와 κ·Έ λ‚΄μš©μ„ μƒμ„±ν•©λ‹ˆλ‹€. npm start λŠ” λ¨Όμ € ꡬ성 μš”μ†Œλ₯Ό λΉŒλ“œν•œ λ‹€μŒ μŠ€ν† λ¦¬λΆμ„ μ‹œμž‘ν•©λ‹ˆλ‹€.

v3μ—μ„œλŠ” 이 λͺ¨λ“  것이 잘 μž‘λ™ν–ˆμ§€λ§Œ ꡬ성 μš”μ†Œλ₯Ό λ¨Όμ € λΉŒλ“œν•΄μ•Ό ν•˜λŠ” 것이 항상 μ•½κ°„ μ–΄μƒ‰ν•˜κ²Œ λŠκ»΄μ‘ŒμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„ _μ΄μœ λŠ” - package.json κ°€ "main: "dist/index.js" λ₯Ό ν¬ν•¨ν•˜λ―€λ‘œ μŠ€ν† λ¦¬λΆμ΄ μ—†μœΌλ©΄ λΉŒλ“œλ₯Ό μ‹œλ„ν•  λ•Œ @my-monorepo/two λ₯Ό 찾을 수 μ—†λ‹€κ³  보고할 κ²ƒμž…λ‹ˆλ‹€( @my-monorepon/one 에 따라 닀름 κ·Έ μœ„μ—). κ·ΈλŸ¬λ‚˜ 그렇지 μ•ŠμœΌλ©΄ 섀정에 λ§Œμ‘±ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ•Œμ•„ μ°¨λ¦° ν•œ 가지 : ꡬ성 μš”μ†Œμ˜ package.json νŒŒμΌμ— "module": "src/index.jsx" λ₯Ό μΆ”κ°€ν–ˆμ„ λ•Œ webpack κ²½κ³ λŠ” μ œκ±°λ˜μ—ˆμ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ ReferenceError: exports is not defined 은 남아 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ™μΌν•œ 였λ₯˜λ₯Ό λ³΄κ³ ν–ˆμ§€λ§Œ ν•΄κ²° 방법이 μ—†λŠ” μ‚¬λžŒμ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ€ μŠ€ν† λ¦¬λΆ v3λ₯Ό 계속 μ‚¬μš©ν•˜κ² μ§€λ§Œ 이 μŠ€λ ˆλ“œλ₯Ό 계속 μ£Όμ‹œν•˜κ³  기꺼이 μ œμ•ˆμ„ μ‹œλ„ν•  κ²ƒμž…λ‹ˆλ‹€ :pray::+1:

@busticated λŠ” λ‚΄κ°€ λ³Ό 수 μžˆλŠ” κ³΅μœ ν•  수 μžˆλŠ” 볡제 μ €μž₯μ†Œκ°€ μžˆλŠ” κ²ƒμ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€.

@ndelangen μ‚΄νŽ΄λ΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :기도: λΆˆν–‰νžˆλ„ λ‚΄ μ €μž₯μ†ŒλŠ” 곡개 atm이 μ•„λ‹™λ‹ˆλ‹€. μœ„μ˜ κ΄€λ ¨ μ„ΈλΆ€ 정보λ₯Ό κ³΅μœ ν•˜λ €κ³  ν–ˆμ§€λ§Œ κ·Έ λ™μ•ˆ 도움이 λ˜λŠ” 경우 μž‘μ—… 예제λ₯Ό μž‘μ„±ν•˜λ €κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 쑰금 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ œμ•ˆ 등을 μ‹œλ„ν•˜κ²Œ λ˜μ–΄ κΈ°μ©λ‹ˆλ‹€.

@busticated λ‚˜λŠ” monorepo-repro-repoλ₯Ό μ‚΄νŽ΄λ³΄λŠ” 것을 기쁘게 μƒκ°ν•©λ‹ˆλ‹€ πŸ™ˆ

λ‹€μŒκ³Ό 같을 κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆλ‹€.

  • 일뢀 νŒŒμΌμ€ babel을 톡해 두 번 ꡬ문 λΆ„μ„λ©λ‹ˆλ‹€.
  • 일뢀 νŒŒμΌμ€ μ„œλ‘œ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” λ‘œλ”λ₯Ό 톡해 ꡬ문 λΆ„μ„λ©λ‹ˆλ‹€.
  • 일뢀 νŒŒμΌμ€ 잘λͺ»λœ babel/ts ꡬ성을 μ‚¬μš©ν•˜μ—¬ μ»΄νŒŒμΌλ©λ‹ˆλ‹€.
  • λ‹€λ₯Έ λͺ¨λ…Έλ ˆν¬ μ†μž„μˆ˜

λΆˆν–‰νžˆλ„ ReferenceError: exports is not defined λŠ” μš°λ¦¬μ—κ²Œ λ‹€λ₯Έ 것을 μ•Œλ €μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 무언가가 μ›λž˜λŒ€λ‘œκ°€ μ•„λ‹™λ‹ˆλ‹€.

@ndelangen ok, μ—¬κΈ° μž¬ν˜„ λ ˆν¬κ°€ μžˆμŠ΅λ‹ˆλ‹€ πŸ˜‚

https://github.com/busticated/storybook-monorepo-repo

κ°„λ‹¨ν•˜κ²Œ λ‹€μŒμ„ μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

  1. git clone
  2. npm i && npm start

...그리고 λΈŒλΌμš°μ €μ—μ„œ λ‘œλ“œν•˜λ €λŠ” μŠ€ν† λ¦¬λΆμ„ λ³΄μ‹­μ‹œμ˜€. 개발 도ꡬ μ½˜μ†”μ„ μ—΄λ©΄ exports 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

λͺ‡ 가지 λ©”λͺ¨:

  • npm run build λ₯Ό μ‹€ν–‰ν•˜μ—¬ 사전 κ²Œμ‹œ λΉŒλ“œλ₯Ό ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.
  • λ…Έλ“œ/ npm@5 λ²„μ „μ—μ„œ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€ node@8 +/- 일뢀 잠금 파일 λ…Έμ΄μ¦ˆ
  • λ§ˆμ§€λ§‰ 두 컀밋은 "module": "src/index.jsx" ν•„λ“œλ₯Ό packages/*/packge.json νŒŒμΌμ— μΆ”κ°€ν•©λ‹ˆλ‹€. 되돌리면 μ›λž˜ export 'default' (imported as 'Two') was not found webpack κ²½κ³ κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

μ΅œλŒ€ν•œ 빨리 보도둝 ν• κ²Œμš”

μ €λŠ” Lernaλ₯Ό μ‚¬μš©ν•˜κ³  있으며 λ‚΄λΆ€ νŒ¨ν‚€μ§€λŠ” libraryTarget: 'commonjs2' 좜λ ₯κ³Ό ν•¨κ»˜ Webpack에 μ˜ν•΄ λ²ˆλ“€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€. @JasonTheAdams μ˜κ²¬μ„ 기반으둜 ν•œ μ ‘κ·Ό 방식이 μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€. λ‚˜λŠ” λ˜ν•œ babelrc { "sourceType": "unambiguous" } λ₯Ό μ‚¬μš©ν•˜μ—¬ @0nn0 μ†”λ£¨μ…˜μ„ ν…ŒμŠ€νŠΈν–ˆμœΌλ©° λ˜ν•œ μž‘λ™ν•˜μ§€λ§Œ νŒ¨ν‚€μ§€ λ£¨νŠΈμ— .babelrc κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

λͺ‡ 가지 κΈ°λ³Έ μ„€μ • - λˆ„κ΅°κ°€μ—κ²Œ 도움이 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ πŸ˜‰(Storybook: 5.1.10, Lerna: 3.16.4, Webpack: 4.39.1, Babel: 7.5.5)


파일: _lerna_repo/.storybook/webpack.config.js_ - 기본적으둜 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

module.exports = async ({ config }) => {
  const [ mjsjsx ] = config.module.rules;
  const [ babelLoader ] = mjsjsx.use;

  babelLoader.options.sourceType = 'unambiguous'

  return config;
};

파일: _lerna_repo/stories/index.stories.js_

import defaultExport, { namedExport } from '../packages/examplePackage' // works locally
// import defaultExport, { namedExport } from '<strong i="17">@examplePackage</strong>' // works installed
...

파일: _lerna_repo/packages/examplePackage/package.json_

"name": "@examplePackage",
"version": "0.0.1",
"main": "./dist/index.js"
...

파일: _lerna_repo/packages/examplePackage/dist/index.js_ - Webpackμ—μ„œ 생성

module.exports=function(e){var n={};function...

@ndelangen μœ„μ˜ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

CommonJS μŠ€νƒ€μΌ λͺ¨λ“ˆμ„ "κ°€μ Έμ˜€κΈ°"ν•˜λ €κ³  ν•  λ•Œ "내보내기가 μ •μ˜λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€" 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ œμ•ˆν•œ λŒ€λ‘œ Babel sourceType μ˜΅μ…˜μ„ "unambiguous"둜 μ„€μ •ν•˜λ©΄ νŠΈλ¦­μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 μ‹€μ œλ‘œ Storybook의 λ¬Έμ œκ°€ μ•„λ‹ˆλ©° 두 가지 λͺ¨λ“ˆ μ‚¬μ–‘μ˜ 쀑간에 κ°‡νžŒ κ²°κ³Όμž…λ‹ˆλ‹€.

버전 5.2μ—μ„œ μˆ˜μ •λœ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ‹€μ œλ‘œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆκΉŒ?

5.2.1 λ₯Ό μ‚¬μš©ν•˜κ³  있으며 μƒˆλ‘œ μƒμ„±λœ Lerna monorepo 에 이 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/storybookjs/storybook/issues/3346#issuecomment -475437230

Babel μ»΄νŒŒμΌμ—μ„œ "Lerna" packages 의 node_modules Storybook Webpack config λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ¬Έμ œλŠ” μ—¬μ „νžˆ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@idbartosz λ‹˜ 의 λŒ“κΈ€μ— 따라 문을 λ‹«μ•˜μŠ΅λ‹ˆλ‹€. @Lighttree κ°€ μ—¬μ „νžˆ κ³ μž₯λ‚œ 것 κ°™μŠ΅λ‹ˆκΉŒ?

ν˜Όλž€μ„ λ“œλ € μ£„μ†‘ν•©λ‹ˆλ‹€. ν•„μš”ν•œ νŒ¨ν‚€μ§€κ°€ 루트둜 ν˜Έμ΄μŠ€νŠΈλ˜μ–΄ 거기에 dev μ’…μ†μ„±μœΌλ‘œ μ„€μΉ˜λ˜λŠ” Lerna ꡬ성에 λŒ€ν•œ 닡변을 기반으둜 ν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ node_modules ꡬ문 뢄석 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

일뢀 μ‚¬μš©μžλŠ” /lib/components/node_modules https://github.com/storybookjs/storybook/issues/3346#issuecomment -475437230κ³Ό 같은 트리 κΉŠμˆ™μ΄ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κ³  babel-loaderκ°€ λ‹€μŒμ„ μ‹œλ„ν•˜λŠ” μ‚¬μš© 사둀λ₯Ό 가지고 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 그듀을 ꡬ문 λΆ„μ„ν•©λ‹ˆλ‹€.

기본적으둜 μŠ€ν† λ¦¬λΆμ€ 루트 node_modules λ₯Ό μ œμ™Έν•˜μ§€λ§Œ λͺ¨λ‘ μ œμ™Έν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

https://github.com/storybookjs/storybook/blob/f7367b18ec7d6e077fba5b99da89233b63c4f280/lib/core/src/server/config/utils.js#L5 -L6

https://github.com/storybookjs/storybook/blob/f7367b18ec7d6e077fba5b99da89233b63c4f280/lib/core/src/server/common/babel-loader.js#L1 -L13

@shilman 저도 react-motion in lerna mono-repo μ €μž₯μ†Œμ—μ„œ 이 였λ₯˜μ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
@idbartosz μ†”λ£¨μ…˜μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆκΉŒ?

@sayjeyhi 예, κ·Έλž˜μ•Ό ν•©λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œ Storybook λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€. 이것은 monorepo μ—μ„œ μž‘μ—…ν•  λ•Œ ν”„λ‘œμ νŠΈ 루트뿐만 μ•„λ‹ˆλΌ */packages 에도 $#$ node_modules $#$κ°€ 있기 λ•Œλ¬Έμ— λ°œμƒν•˜λ©° 기본적으둜 μ œμ™Έλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (μ‹€μ œλ‘œλŠ” monorepo 쑰직에 따라 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— κ·Έλ ‡κ²Œ ν•΄μ„œλŠ” μ•ˆ λœλ‹€κ³  ν™•μ‹ ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. Lerna packages 폴더에 Storybook λ₯Ό package 둜 μƒμ„±ν•˜λ©΄ μ΄κ²ΌμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€)

κ·Έλž˜μ„œ 제 κ²½μš°μ—λŠ” .storybook/webpack.config.js μ—μ„œ 이것을 ν–ˆμŠ΅λ‹ˆλ‹€.

const path = require('path');
const glob = require('glob');

// Export a function. Accept the base config as the only param.
module.exports = async ({ config, mode }) => {
    // `mode` has a value of 'DEVELOPMENT' or 'PRODUCTION'
    // You can change the configuration based on that.
    // 'PRODUCTION' is used when building the static version of storybook.
    // Make whatever fine-grained changes you need
    const babelLoader = config.module.rules[0];

    /**
     * Exclude pacakge's `node_modules` from Storybook babel processing.
     */
    glob.sync('./packages/*/node_modules').forEach(match => {
        babelLoader.exclude.push(path.resolve(match));
    });

    // Return the altered config
    return config;
};

λ‚΄κ°€ λ§Œλ“  예제 μž¬ν˜„ μˆ˜μ • μ œμ•ˆλœ ν•΄κ²° 방법을 μ‹€μ œλ‘œ 보여쀀 μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

https://github.com/storybookjs/storybook/issues/3346#issuecomment -514324312

μ§ˆλ¬Έμ— ν™•μ‹€νžˆ 닡이 될 것 κ°™μŠ΅λ‹ˆλ‹€.

monorepo ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” λŒ€λΆ€λΆ„μ˜ λͺ¨λ“  μ‚¬λžŒλ“€μ΄ lerna λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. lerna λŒ€μ‹  yarn workspaces λ₯Ό μ‚¬μš©ν•˜λŠ” monorepo ν”„λ‘œμ νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. lerna 및 λͺ¨λ“  것이 μ΅œμ‹  λ²„μ „μ˜ storybook + typescript μ—μ„œ 잘 μž‘λ™ν•˜κ³  μ΄μƒν•œ webpack ꡬ성 없이 babelμ—μ„œλ„ 잘 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ•½κ°„μ˜ 관심을 보이면 monorepo λ₯Ό storybook 둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. @busticated 의 νŒŒμΌμ—μ„œ 일뢀 μŠ€ν¬λ¦½νŠΈκ°€ 잘λͺ»λœ μˆœμ„œλ‘œ μ‹€ν–‰λ˜κ³  일뢀 쒅속성이 잘λͺ»λœ package.json , 이것이 문제λ₯Ό μΌμœΌν‚€λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

@pixelate

@busticated 의 νŒŒμΌμ—μ„œ 일뢀 μŠ€ν¬λ¦½νŠΈκ°€ 잘λͺ»λœ μˆœμ„œλ‘œ μ‹€ν–‰λ˜κ³  일뢀 쒅속성이 잘λͺ»λœ package.json에 μžˆμŒμ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

더 μžμ„Έν•˜κ²Œ μ–˜κΈ°ν•΄ μ£Ό μ‹œκ² μ–΄μš”?

λ˜ν•œ https://github.com/storybookjs/storybook/issues/3346#issuecomment -513397002에 μ–ΈκΈ‰λœ λŒ€λ‘œ μŠ€ν† λ¦¬λΆ v3 을 μ‹€ν–‰ν•˜λŠ” 예제 λ¦¬ν¬μ§€ν† λ¦¬μ˜ _working_ 버전이 μžˆμŒμ„ λͺ…μ‹¬ν•˜μ‹­μ‹œμ˜€.

@pixelateate μž‘μ—… 리포지토리λ₯Ό κ³΅μœ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

monorepo ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” λŒ€λΆ€λΆ„μ˜ λͺ¨λ“  μ‚¬λžŒλ“€μ΄ lerna λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. lerna λŒ€μ‹  yarn workspaces λ₯Ό μ‚¬μš©ν•˜λŠ” monorepo ν”„λ‘œμ νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. lerna 및 λͺ¨λ“  것이 μ΅œμ‹  λ²„μ „μ˜ storybook + typescript μ—μ„œ 잘 μž‘λ™ν•˜κ³  μ΄μƒν•œ webpack ꡬ성 없이 babelμ—μ„œλ„ 잘 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€.

관심을 보이면 monorepo λ₯Ό storybook 둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. @busticated 의 νŒŒμΌμ—μ„œ 일뢀 μŠ€ν¬λ¦½νŠΈκ°€ 잘λͺ»λœ μˆœμ„œλ‘œ μ‹€ν–‰λ˜κ³  일뢀@ 쒅속성이 μžˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 잘λͺ»λœ package.json μ—μ„œ 문제λ₯Ό μΌμœΌν‚€λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

babelConfig.exclude.push(/node_modules/); λŠ” start-storybook μ‹€ν–‰ν•  λ•Œ 문제λ₯Ό ν•΄κ²°ν•˜μ§€λ§Œ build-storybook μ—μ„œ 좜λ ₯을 μ‹€ν–‰ν•  λ•Œ λ™μΌν•œ exports is not defined 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

νŽΈμ§‘: storybook-addon-jsx μ œκ±°ν•˜μ—¬ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

@busticated μˆ˜μ •μœΌλ‘œ PR을 μ—΄μ—ˆμŠ΅λ‹ˆλ‹€.
https://github.com/busticated/storybook-monorepo-repo/pull/1

λ‚΄κ°€ μƒκ°ν•˜λŠ” μ£Όμš” 문제인 λͺ‡ 가지 잘λͺ»λœ μˆ˜μž…ν’ˆμ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

@jacobrask μŠ€ν† λ¦¬λΆμ˜ ν•΅μ‹¬μ—μ„œ λ³€κ²½ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ§ˆμ΄λ„ˆ λ¦΄λ¦¬μŠ€μ—μ„œ λ³€κ²½ν•˜λ©΄ 큰 ν”Όν•΄λ₯Ό μž…νžκΉŒ λ‘λ ΅μŠ΅λ‹ˆλ‹€.

@shilman λ°”κΏ”μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 메이저 버전 μΆ©λŒμ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€.

@ndelangen

μˆ˜μ •μœΌλ‘œ PR을 μ—΄μ—ˆμŠ΅λ‹ˆλ‹€.

감사 ν•΄μš”!

λ‚΄κ°€ μƒκ°ν•˜λŠ” μ£Όμš” 문제인 λͺ‡ 가지 잘λͺ»λœ κ°€μ Έμ˜€κΈ°κ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

흠. 응. eslint λ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ€ 것이 μ˜³μŠ΅λ‹ˆλ‹€ πŸ˜‚πŸ€¦β€β™‚

즉, 일단 잘λͺ»λœ λ³€μˆ˜ 이름을 μ„€λͺ…ν•˜κ³  @storybook/addon-backgrounds μ‚¬μš©λ²•μ„ μ—…λ°μ΄νŠΈν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. master ( 1 , 2 , 3 , 4 )에 λŒ€ν•΄ μˆ˜ν–‰ν•œ κ²ƒμ²˜λŸΌ - μœ μΌν•˜κ²Œ λˆˆμ— λ„λŠ” λ³€κ²½ 사항은 싀을 μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‚˜ λ§žμ•„?

νŽΈμ§‘: 여기에 yarn 에 ν•„μš”ν•œ λ³€κ²½ μ‚¬ν•­λ§Œ ν¬ν•¨λœ μ •λ¦¬λœ λΆ„κΈ°κ°€ μžˆμŠ΅λ‹ˆλ‹€. πŸ‘‰ https://github.com/busticated/storybook-monorepo-repo/commit/4fb2cac0f05b65a5983f121b92a7c2d7438d8857

원사 μž‘μ—… 곡간은 λ£¨νŠΈμ— λŒ€ν•œ λͺ¨λ“  쒅속성을 λŒμ–΄μ˜¬λ € μˆ˜λ§Žμ€ 문제λ₯Ό ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‚΄ PRμ—μ„œ https://github.com/storybookjs/storybook/pull/8822 기본적으둜 MULTIPLE node_modules 폴더 μ œμ™Έλ₯Ό μ§€μ›ν•˜λ„λ‘ μŠ€ν† λ¦¬λΆμ„ λ³€κ²½ν•©λ‹ˆλ‹€.

거기에 μžμ„Ένžˆ μ„€λͺ…λ˜μ–΄ μžˆλ“―μ΄ μ €λŠ” λ§ˆμ΄λ„ˆ λ¦΄λ¦¬μŠ€μ—μ„œ ν•΄λ‹Ή λ³€κ²½ 사항을 λ‘€λ§ν•˜λŠ” 것이 맀우 두렡고 @shilman도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 6.0κΉŒμ§€ μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

원사 μž‘μ—… 곡간은 λ£¨νŠΈμ— λŒ€ν•œ λͺ¨λ“  쒅속성을 λŒμ–΄μ˜¬λ € μˆ˜λ§Žμ€ 문제λ₯Ό ν•΄κ²°ν•  κ²ƒμž…λ‹ˆλ‹€.

원사λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄ πŸ˜‰

기본적으둜 MULTIPLE node_modules 폴더 μ œμ™Έλ₯Ό μ§€μ›ν•˜λ„λ‘ μŠ€ν† λ¦¬λΆ λ³€κ²½

그것이 κ·Όλ³Έ 원인인가? λ³€κ²½ 사항을 둜컬둜 μ μš©ν•΄λ„ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄ λΈŒλΌμš°μ €μ˜ μ½˜μ†”μ— λ‹€μŒμ΄ ν‘œμ‹œλ©λ‹ˆλ‹€.

TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

...μ–΄λŠκ²Œ μ’€ λ‹€λ₯Έ 것 같은데..? 항상 λ³Ό 수 μžˆμ§€λ§Œ 항상 λ‹€λ₯Έ μ†”λ£¨μ…˜μ΄ μžˆλŠ” 또 λ‹€λ₯Έ 였λ₯˜ πŸ€¦β€β™‚ _/babelκ³Ό webpack의 일반적인 λ°©ν–₯에 λŒ€ν•΄ λˆˆμ‚΄μ„ μ°Œν‘Έλ¦½λ‹ˆλ‹€_ 😬

λ‚˜λŠ” λ§ˆμ΄λ„ˆ λ¦΄λ¦¬μŠ€μ—μ„œ κ·Έ λ³€κ²½ 사항을 λ‘€μ•„μ›ƒν•˜λŠ” 것이 맀우 두렡고 @shilman도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 6.0κΉŒμ§€ μœ μ§€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

였 예, λ‹Ήμ‹ μ˜ 말을 λ“£μŠ΅λ‹ˆλ‹€. 이 λͺ¨λ“  것은 κ²°μ½” μ‰¬μš΄ 일이 μ•„λ‹™λ‹ˆλ‹€. 여기와 λ‹€λ₯Έ κ³³μ—μ„œ 당신이 ν•˜λŠ” λͺ¨λ“  일에 λŒ€ν•΄ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€ - Storybook(심지어 v3)은 λ†€λžλ„λ‘ μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€ :pray::clap::clap::clap::+1:

TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

이것은 Webpack이 CommonJS λͺ¨λ“ˆμ„ ESM 래퍼둜 λž˜ν•‘ν•˜κΈ° λ•Œλ¬Έμ— λ°œμƒν–ˆμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€. Webpack은 λͺ¨λ“ˆμ—μ„œ import κ°€ μ‚¬μš©λœ 경우 ESM 래퍼λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 일반적으둜 λ‹€μŒ 쀑 ν•˜λ‚˜λ‘œ 인해 λ°œμƒν•©λ‹ˆλ‹€.

  1. μ†ŒμŠ€ μ½”λ“œμ—μ„œ ESM 및 CJS ν˜Όν•© 및 일치
  2. ESM λ„μš°λ―Έλ₯Ό CJS λͺ¨λ“ˆμ— μ£Όμž…ν•˜λŠ” Babel

두 번째 경우λ₯Ό ν”Όν•˜λ €λ©΄ Babel의 sourceType λ₯Ό "unambiguous" 둜 μ„€μ •ν•˜μ—¬ λͺ¨λ“ˆ μœ ν˜•μ„ λ¨Όμ € ν™•μΈν•˜λ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

https://github.com/i-like-robots/broken-webpack-bundle-test-case


μ—…λ°μ΄νŠΈ: λ‚΄ μ›λž˜ 의견 은 μœ„μ— 숨겨져 μžˆμ§€λ§Œ 이것은 μ—¬λŸ¬ monorepo ν”„λ‘œμ νŠΈμ—μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©ν•œ κΈ°λ³Έ κ΅¬μ„±μž…λ‹ˆλ‹€.

const excludePaths = [/node_modules/, /dist/]

module.exports = ({ config }) => {
  // Use real file paths for symlinked dependencies do avoid including them multiple times
  config.resolve.symlinks = true

  // HACK: extend existing JS rule to ensure all dependencies are correctly ignored
  // https://github.com/storybooks/storybook/issues/3346#issuecomment-459439438
  const jsRule = config.module.rules.find((rule) => rule.test.test('.jsx'))
  jsRule.exclude = excludePaths

  // HACK: Instruct Babel to check module type before injecting Core JS polyfills
  // https://github.com/i-like-robots/broken-webpack-bundle-test-case
  const babelConfig = jsRule.use.find(({ loader }) => loader === 'babel-loader')
  babelConfig.options.sourceType = 'unambiguous'

  // HACK: Ensure we only bundle one instance of React
  config.resolve.alias.react = require.resolve('react')

  return config
}

@i-like-robots sourceType = 'unambiguous' μ‚¬μš©μ˜ 단점은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

ν•΄κ²° 방법을 κ²Œμ‹œν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

monorepo 지원을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ 이것을 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€: https://github.com/storybookjs/storybook/pull/8822

(6.0.0 κΈ°λŠ₯)

관련이 없을 μˆ˜λ„ μžˆμ§€λ§Œ https://storybook.js.org/docs/configurations/custom-babel-config/ λ₯Ό 읽고 λ‚΄ μ‚¬μš©μž μ •μ˜ babel.config.js λ•Œλ¬Έμ— 이 exports is not defined λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 문제.

@qrosmeli 팁 κ°μ‚¬ν•©λ‹ˆλ‹€. 당신은 λ‚΄ ν•˜λ£¨λ₯Ό κ΅¬ν–ˆμŠ΅λ‹ˆλ‹€! πŸš€

ν›„μž!! 이 문제λ₯Ό μ°Έμ‘°ν•˜λŠ” PR #8822κ°€ ν¬ν•¨λœ https://github.com/storybookjs/storybook/releases/tag/v6.0.0-alpha.0 을 방금 μΆœμ‹œν–ˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆ μ—…κ·Έλ ˆμ΄λ“œν•˜μ—¬ μ‚¬μš©ν•΄ λ³΄μ„Έμš”!

이 μ‹œν—˜νŒμ€ @next NPM νƒœκ·Έμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

이 문제λ₯Ό λ‹«μŠ΅λ‹ˆλ‹€. 아직 ν•  일이 더 μžˆλ‹€κ³  μƒκ°λ˜λ©΄ λ‹€μ‹œ μ—΄μ–΄μ£Όμ„Έμš”.

[μ—…λ°μ΄νŠΈλ¨] - 이 κ·œμΉ™μ—μ„œ node_modulesλ₯Ό μ œμ™Έν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ λΉŒλ“œκ°€ μ€‘λ‹¨λ©λ‹ˆλ‹€.

μŠ€ν† λ¦¬λΆ main.js νŒŒμΌμ— 이 κ·œμΉ™μ„ μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

let rules = [{
  test: /\.(js|mjs|jsx|ts|tsx)$/,
  include: /dist/, //Include dist folder as well to parse using babel loader in order to resolve exports not defined error
  exclude: /node_modules/,
  loader: 'babel-loader',
  options: {
    presets: [
      ["@babel/preset-env", {
        modules: "commonjs"
      }]
    ]
  }
}]

이와 ν•¨κ»˜ dist 폴더에 λŒ€ν•œ eslint μœ νš¨μ„± 검사λ₯Ό λΉ„ν™œμ„±ν™”ν•΄μ•Ό ν•  μˆ˜λ„ μžˆμœΌλ―€λ‘œ μ•„λž˜ 슀크립트λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  webpackFinal: config => {

    //Find eslint loader rule from webpack config
    let eslintRule = config.module.rules.find(rule => {
      if (rule && rule.use) {
        return rule.use.some(use => use.loader.match('eslint-loader'))
      }
    });

    //Exclude validations of dist folder contents
    eslintRule.exclude = /dist/;

    return {
      ...config,
      module: {
        rules: [
          ...rules,
          eslintRule,
          ...config.module.rules
        ]
      }
    }
  }

κ°μ‚¬ν•©λ‹ˆλ‹€ @ashvin777 , 맀λ ₯처럼 μž‘λ™ν•©λ‹ˆλ‹€ :wink:

@aperkazλ‹˜ , node_modules λ₯Ό μ œμ™Έν•˜λ„λ‘ κ·œμΉ™μ„ μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. 이 λ³€κ²½μœΌλ‘œ 인해 μŠ€ν† λ¦¬λΆμ΄ 개발 λͺ¨λ“œμ—μ„œλŠ” μ œλŒ€λ‘œ μ‹œμž‘λ˜μ§€λ§Œ ν”„λ‘œλ•μ…˜ λͺ¨λ“œμ—μ„œλŠ” μ€‘λ‹¨λ˜λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μˆ˜μ •ν•˜κΈ° μœ„ν•΄ node_modules λ₯Ό μ œμ™Έν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ μ—…λ°μ΄νŠΈλœ λŒ“κΈ€μ—μ„œ μ΅œμ‹  정보λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜‘κ°™μ€ λ¬Έμ œκ°€ μžˆμ—ˆκ³  해결책은 $ babel.config.js $ μ—μ„œ transform-es2015-modules-commonjs μ—μ„œ @babel/plugin-transform-modules-commonjs 둜 μ „ν™˜ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

~ 전에

module.exports = {
    presets: [['@babel/preset-env', { modules: false }], '@babel/preset-react'],
    plugins: [
        'transform-es2015-modules-commonjs',
        '@babel/plugin-proposal-class-properties'
    ]
};

~ 후에

module.exports = {
    presets: [['@babel/preset-env', { modules: false }], '@babel/preset-react'],
    plugins: [
        '@babel/plugin-transform-modules-commonjs',
        '@babel/plugin-proposal-class-properties'
    ]
};
TypeError: Cannot assign to read only property 'exports' of object '#<Object>'

λ‚˜λŠ” 이 λ¬Έμ œμ— λŒ€ν•΄ ν•˜λ£¨λ₯Ό λ³΄λƒˆκ³  이미 sourceType: 'unambigous' λ₯Ό 가지고 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•„μžμ˜ 경우 node_modules 폴더 λ°”λ‘œ μ˜†μ— μžˆλŠ” μƒλŒ€ 파일이기 λ•Œλ¬Έμ— λ¬΄μ‹œν•  폴더에 μ—°κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•˜λŠ” ν•΄κ²° 방법은 @babel/preset-env $ 에 λŒ€ν•΄ modules: 'cjs' μ˜΅μ…˜μ„ κ°•μ œ μ‹€ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ @storybook/react@next 에 이 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λ₯Ό μœ„ν•œ μ΅œμ’… 해결책은 μˆ˜λ™μœΌλ‘œ babel ν”ŒλŸ¬κ·ΈμΈ @babel/plugin-transform-modules-commonjs 을 μΆ”κ°€ν•˜λŠ” 반면 @babel/preset-env μ—λŠ” debug: true μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚˜λŠ” 그것이 이미 μ‚¬μš©λœ 것을 λ³Έλ‹€... λ‚˜λŠ” μ΄ν•΄ν•˜μ§€ λͺ»ν•˜μ§€λ§Œ μž‘λ™ν•œλ‹€.

νŽΈμ§‘: 이것은 webpackκ³Ό ν•¨κ»˜ ESM λͺ¨λ“ˆμ˜ 이점을 μƒμ‹€ν•˜κΈ° λ•Œλ¬Έμ— μ†”λ£¨μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€. μŠ€ν† λ¦¬λΆ λΉŒλ“œμ— λŒ€ν•΄μ„œλ§Œ κ°•μ œλ‘œ cjs둜 λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

:tada: λ‚΄ .storybook/.babelrc : :tada:

{
  "extends": "../.babelrc",
  "plugins": [
    "@babel/plugin-transform-modules-commonjs"
  ]
}

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰