åããŠã¹ããŒãªãŒããã¯ã䜿ãããšããŠããã®ã§ãã¬ã€ãã«åŸãããšã«ããŸããã
äŸã䜿çšããŠåäœãããããšã¯ã§ããŸãããèªåã®ã³ã³ããŒãã³ããåã蟌ããšããã«ã__ 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ãå®çŸ©ãããŠããªã__ïŒã¹ã¿ãã¯ãã¬ãŒã¹ã®ããã€ãã®æ··ä¹±ãšãšãã«ïŒã§ããããããããã°ããã®ã¯é£ããã§ãã
ç§ã¯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.0babel-core
6.26.0react
16.3.0ç§ã¯äœãæ¬ ããŠããŸããïŒ
ïŒtsãããã«ã€ã³ããŒãããæ¹æ³ãããå Žåã¯ããããæãŸããã§ããããããå
¬åŒã®ããã¥ã¡ã³ããèŠã€ãããªãããããããŸã§ã«å
¥æãããã®ã§ãïŒ
ã¿ãŒããã«ã§export 'MatrixEffect' was not found in '../dist/index'
ãååŸããŠããŸãã ãã ããã¢ãžã¥ãŒã«ã¯ãã¬ãŒã³ããŒãã©ã³ã¿ã€ã ã§ã€ã³ããŒãã§ããŸãïŒofcã¯äœ¿çšã§ããŸããããå°ãªããšãã€ã³ããŒãã§ããããšã¯ããã£ãŠããŸãïŒã
å ¬åŒã®ããã¥ã¡ã³ãããŸã ãªããããããã圹ç«ã€å ŽåããããŸãïŒ https ïŒ//github.com/storybooks/storybook/issues/3270
ããã¯ãŸã æ©èœããŠããŸãã...
lernaãããžã§ã¯ãã§yarnã¯ãŒã¯ã¹ããŒã¹ããªã³ã«ããåŸãã¹ããŒãªãŒããã¯ã§åããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããåé¡ãçºçããŸããã ããã¯ããã±ãŒãžã®èªã¿èŸŒã¿ã®åé¡ãåå ã§ãããšæãããŸãã ããã«èª¿æ»ããŸãã
åãåé¡ãããããã§ãã
ç§ãåé¡ãæ£ããç解ããŠããå Žåã.jsãã.tsãã¡ã€ã«ã解決ããããšã«åé¡ããããŸããïŒ ïŒãã ããã³ã³ããŒãã³ããdist
ããã€ã³ããŒãããçç±ã¯ããããŸããïŒ
æ¡åŒµã¹ããŒãªãŒããã¯webpack.configã®resolve.extensions
ã«.ts
/ .tsx
ãè¿œå ããå¿
èŠããããããããŸããã
@ igor-dvããããJSã䜿çšããŠããŸãã ãšã«ãããå€æ°èå¥åïŒ variable
ããVariable
ïŒãå€æŽãããšãã©ããããããæ©èœããŸãã
TypeScriptã䜿çšããã«ãã®ãšã©ãŒãçºçããŸããããã©JSã ãã§ãã
.storybook
ãã©ã«ããŒã®webpack.config.js
ããbabelããŒããŒãåé€ããŸããããæ£åžžã«åäœããããã«ãªããŸããã ç§ã¯Typescriptã䜿ããŸããã
ç§ã¯ããã«ééããŠããŸãããã©ãŠã¶ã§ã¯exports is not defined
ãååŸããŸãããã¿ãŒããã«ã§ã¯ `" export'default 'ïŒ' [ComponentName] 'ãšããŠã€ã³ããŒãïŒã' @ [namespace] / [ã«èŠã€ãããŸããã§ããããã±ãŒãžå]'"
project/packages
å
ã®å¥ã®ããã±ãŒãžã«äŸåããã¢ãžã¥ãŒã«ãã€ã³ããŒãããããšãããšããšã©ãŒã衚瀺ãããŸãå éšäŸåé¢ä¿ã®package.jsonã¡ã€ã³æ§æããã«ããããŠããªããœãŒã¹ã«å€æŽãããšããã¹ãŠãæ©èœããŸã
ãããã£ãŠãstorybookã®webpackèšå®ãšcjsã®esã¢ãžã¥ãŒã«ã³ãŒããžã®ã€ã³ããŒãã«åé¡ããããŸã...
ãã®ããããã«ãã®ESã¢ãžã¥ãŒã«ããŒãžã§ã³ãæãpackage.json "module"ãã£ãŒã«ãã誀ã£ãŠåé€ãããããè¿œå ãçŽããšããã¹ãŠãåã³æ©èœããããšã«æ°ä»ããŸããã ããã§ãã¹ããŒãªãŒããã¯ã¯cjsããŒãžã§ã³ããã«ã§ããã¯ãã§ãããç§ã®åé¡ã¯è§£æ±ºããŸããð€·ðœââïž
ããã¯ãv4.0.0-alpha.20ãšbabel7.0.0ã§ãŸã çºçããŠããŸãã
ããã§åã@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-alpha.2 "
"react"
"^ 16.4.0"
泚ïŒãã®ãœãªã¥ãŒã·ã§ã³ã¯ãå¥ã®çš®é¡ã®ã¢ãžã¥ãŒã«https://babeljs.io/docs/en/next/plugins#modulesã§æ©èœããŸã
ç§ã®å Žåããã®åé¡ã¯ã4.0.0.alphaã«babel-loaderãå«ããããã«æè¿å€æŽãããããšãåå ã§ãã ããã©ã«ãã®ãµãŒããŒwebpackæ§æã«ã¯ãcommonjsã³ã³ãã€ã«ïŒããã±ãŒãžãã¯ãŒã¯ã¹ããŒã¹ïŒãå«ããããšãã§ããŸãïŒ https ïŒ//github.com/storybooks/storybook/blob/b2b73596f9dd97b4ba8c03340bd36f868e836772/lib/core/src/server/config/webpack.config.dev.js#
https://github.com/storybooks/storybook/blob/b2b73596f9dd97b4ba8c03340bd36f868e836772/lib/core/src/server/config/utils.js#L3
ç§ã«ãšã£ãŠã®ä¿®æ£ã¯ãããã©ã«ãã®ãã©ã°ã€ã³å®£èšãã«ã¹ã¿ã webpack.dev.jsã§ãªãŒããŒã©ã€ãããããšã§ãã
// 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'))
)),
{
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ã©ããã£ãŠããã解決ããŸãããïŒ
@ 0nn0https ïŒ//github.com/storybooks/storybook/issues/3346#issuecomment-425516669ãã®ã¢ããã€ã¹ã«åŸã£ãŠãã ãã:)
stotybook-4.1.4ãLernaãããžã§ã¯ããReact 16.7.0ããã¬ãŒã³JSã§ãåãåé¡ãçºçããŠããŸãã ã¹ããŒãªãŒããã¯ã§åäœ-4.0.12
4.1.4ã§ãåããšã©ãŒãçºçããŸãããã4.0.10ã«æ»ããæ£åžžã«åäœããŸãïŒtypescriptãªãïŒbabel-webapck
å€æŽãããæ§æã䜿çšããŠãã³ã³ãã€ã«ãããåºåãbabel-loaderããé€å€ãããšãææ°ã®ã¹ããŒãªãŒããã¯ããã±ãŒãžã䜿çšããLernaãŸãã¯monorepoãããžã§ã¯ãã§ãã®åé¡ãåé¿ãããŸãã
@psychoboltèšå®äŸãæããŠãã ããã ããããšãã
https://github.com/storybooks/storybook/issues/3346#issuecomment-425516669ãåç §ããŠãã ãã
ãããä»ã®äººã«åœ¹ç«ã€ãã©ããã¯ããããŸãããã次ã®ã³ãã³ããå®è¡ããŠãã®åé¡ãä¿®æ£ããŸããã
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
ã®åé¡ãæ°åçºçããŸããã以åã¯ãä»ã®äººãææ¡ããããã«ãBabelæ§æããªãŒããŒã©ã€ãããããšã§ãã®åé¡ãåé¿ããŸããã
ããããæè¿ãããããäžåºŠèª¿ã¹å§ãããšãããããã©ã«ãã®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
ãªãã·ã§ã³ã«ãã$ core-js
ããªãã£ã«ã®æ¿å
¥ïŒ useBuiltins
ãªãã·ã§ã³ã®åé€ãŸãã¯èšå®ïŒãåé¿ãããŸããããªãã£ã«ãå¿
èŠãšããªãã©ã³ã¿ã€ã ã察象ãšããç°å¢ãããã®åé¡ãåé¿ããã®ã«åœ¹ç«ã¡ãŸããïŒ
ãããã£ãŠããã®åé¡ãåŒãèµ·ããããã€ãã®ç°ãªãåé¡ãçºçããŠããŸãã
node_modules
ãã©ã«ããŒã®äŸåé¢ä¿ã¯ãBabelã«ãã£ãŠæå³ããã«ãã©ã³ã¹ãã€ã«ãããå¯èœæ§ããããŸãuseBuiltins
ãªãã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã¿ã€ãã«å¯ŸããŠééã£ã圢åŒã§core-js
ããªãã£ã«ãã³ãŒãã«æ¿å
¥ããå¯èœæ§ããããŸãïŒhttps://github.com/babel/babel/issues/7463ããã³httpsïŒ//ãåç
§ïŒ github.com/babel/babel/issues/9187ïŒæ®å¿µãªãããæ¢åã®é€å€ãªãã·ã§ã³ãæ¡åŒµããã®ã¯ç°¡åã§ã¯ãããŸããããå¯èœã§ãã
ãã®åé¡ãåé¿ããæ¹æ³ã«ã€ããŠã®æ å ±ã䜿çšããŠããã®åé¡ã®çž®å°ãã¹ãã±ãŒã¹ãäœæããŸããã å¿ èŠã«å¿ããŠããã«ã«åé¡ãæåºããŸãã
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
ãã®ãªãã·ã§ã³ã¯ãBabel7以éã§ã®ã¿äœ¿çšã§ããŸãã
人ã ã®åé¡ãäœã§ããããå®å šã«ç解ããã«ãããé転ããã ãã§ãïŒè¬çœªïŒïŒ-ããã¯ãããããããç°¡åãªæ¹æ³ã§ããã®åé¡ãåé¿ããç§ã®webpackæ§æããã®ã¹ããããã§ãïŒ
const babelLoader = storybookBaseConfig.module.rules[0];
babelLoader.exclude.push(
path.resolve('./lib/components/node_modules'),
/* etc */
);
@tmeasdayææ¡ã«ã€ããŠè©³ããæããŠããã ããŸããïŒã€ãŸãããã®ã³ãŒããã©ãã«é 眮ãããã
ã¹ããŒãªãŒããã¯ã¯çŽ æŽãããã§ããããã®ãšã©ãŒã¯æç¶çã§ã²ã©ããã®ã§ãã ãã®ãšã©ãŒãçºçãå§ããçç±ã«ã€ããŠãé»ãçç±ãèŠã€ããããšãã§ããªãããã§ãã ã³ã³ããŒãã³ããããã£ãŠããããŒã ã«ãªããŸããå®éã«å€æŽãå ããããšãªãããã¹ãŠãæ©èœãå§ããŸãã ããããç§ã¯ãããæ©èœãããããã«1æéç«ã¡åŸçããŠããŠããªããããå£ããŠããã®ãæãé§æ·±ãèãããããŸããã
å€ãã®äººã«åœ±é¿ãäžããŠããããã§ãç®ãèŠåŒµããããªãã®åé¡ã調ã¹ãŠãã ããã
以äžãå«ã.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
ããã«ã®åé¡ã«èŠçŽãããããã§ãã .babelrc
ãã¡ã€ã«ãè¿œå ããããšããŸãããïŒ@ 0nn0ã§ææ¡ãããŠããããã«ïŒãå€æŽããã®ã§ã¯ãªããbabelæ§æå
šäœã眮ãæããããããã§ãããã«åé¡ãçºçããŸããã
@JasonTheAdamsäžèšã§æžããã³ãŒãã¹ããããã¯ã .storybook/webpack.config.js
å
¥ããŸãã ããã¯ããªãããã£ãããšãšäŒŒãŠãããšæããŸãã
ãããç§ãèµ·ãã£ãŠãããšæãããšã§ãïŒ
åé¡ã¯ããµããããžã§ã¯ãå
ã®node_modules
ïŒäŸïŒ ./lib/components/node_modules
ïŒå
ã®ãã¡ã€ã«ãbabelã«ãã£ãŠã³ã³ãã€ã«ãããŠããããšã§ãã ãããã¯ãã§ã«NPMã«åºè·ãããŠãããã¡ã€ã«ã§ãããã³ã³ãã€ã«ããå¿
èŠã¯ãããŸããã å Žåã«ãã£ãŠã¯ãããã«ãããããããbabelããã¡ã€ã«ã解æããæ¹æ³ã«é¢ããŠãçŽããããåé¡ãçºçããŸãã
ç§ã®ã¢ãããŒãã¯ã node_modules
ãã©ã«ããŒå
ã®ãã¡ã€ã«ãã³ã³ãã€ã«ããªãããã«babel-loader
ã«æ瀺ããããšã§ãã ããã©ã«ãã§ã¯./node_modules
ãç¡èŠããããããµããããžã§ã¯ãã®node_modules
å
ã§ã³ã³ãã€ã«ãããŸãã ããã§ã exclude
ãªã¹ãã«ããã€ãã®ãã¹ãè¿œå ããŸãã
ããªãã®ã¢ãããŒãã¯ããã¡ã€ã«ã解æããæ¹æ³ãæ瀺ããããã«babelã®sourceType
æ€åºã䜿çšããããã«babel-loader
ãæ§æããããšã§ãã ããã¯åºæ¬çã«ããã¡ã€ã«ã®è§£æãã¹ãåé¿ããŸãã ãã ããbabelã¯ã³ã³ãã€ã«ããå¿
èŠã®ãªããã¡ã€ã«ã§å®è¡ãããŠããã®ã§ããããå¿
èŠãã©ããããããŸããã
ç§ã¯å°é家ã§ã¯ãªãã®ã§ãäžç²äžç²ã®èšèã§èšããŸãããããã¯ç§èªèº«ãåæ§ã®åé¡ã«åãçµãã§ãããšããç§ã®ç解ã§ãã
@skeetã®ææ¡ïŒhttps://github.com/storybooks/storybook/issues/3346#issuecomment-459308703ïŒãé©çšããåŸã1ã€ã®ããã±ãŒãžãä»ã®ããã€ãã®äŸåé¢ä¿ïŒãã¢ãéçºè ã§ã¯ãªãïŒãšããŠåç §ãå§ãããšãã«åé¡ãè¿ãããŸããã
@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ãã³ã³ãã€ã«ããããªãå Žåã¯ãããããããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠããªãã£ãå¯èœæ§ããããŸãã
CommonJSãšES6ã¢ãžã¥ãŒã«ãèªèããbabel + webpackã®æ©èœã«ãã¹ãŠãããã£ãŠããããã§ãããããã¯å®ç§ã§ã¯ãªãããã§ãã "module":
ãã£ãŒã«ãããµãããã±ãŒãžã®package.json
ã«è¿œå ãããšãããã±ãŒãžãES6ã¢ãžã¥ãŒã«ã䜿çšããŠããããšãæ瀺çã«éç¥ããŸããããã¯ãããã«ã¢ãããŒãããæãå®å
šãªæ¹æ³ã§ãã
ãæž èŽããããšãããããŸããïŒ
ãã¡ãããã£ã€ã ãããã§ãã Storybook 5ãBabel 7.4ïŒcore-js 3ã䜿çšïŒãTypeScript 3.4ãããã³ã¢ãã¬ãã䜿çšããŸãã ãããã®ææ¡ã®ã»ãšãã©ã¯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);
webpack.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ïŒ1ã€ïŒ
{
"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ã¯äŸåé¢ä¿ã_ãªã³ã¯_ããŸãïŒ lerna bootstrap
ãä»ããŠïŒã ãã¹ãŠã®ããã±ãŒãžã¯babelã䜿çšããŠæ§ç¯ãããŠããŸã-ãããã¬ãã«ã®npm run build
ã³ãã³ãã¯ãåã
ã®./dist
ãã£ã¬ã¯ããªãšãã®å
容ãçæããŸãã npm start
æåã«ã³ã³ããŒãã³ããæ§ç¯ãã次ã«ã¹ããŒãªãŒããã¯ãéå§ããŸãã
v3ã§ã¯ãããããã¹ãŠãåé¡ãªãæ©èœããŸããããæåã«ã³ã³ããŒãã³ãããã«ãããå¿
èŠãããã®ã¯åžžã«å°ãåä»ã ãšæããŠããŸããã ç§ã¯_why_ãååŸããŸã- package.json
ã«ã¯"main: "dist/index.js"
ãå«ãŸããŠããã®ã§ãããããªããšãã¹ããŒãªãŒããã¯ã¯ãã«ãããããšãããšãã«@my-monorepo/two
ãèŠã€ãããªãã£ããšå ±åããŸãïŒ @my-monorepon/one
ã¯äŸåããããïŒãã®äžã«ïŒã ãã以å€ã®å Žåã¯ãã»ããã¢ããã«æºè¶³ããŸããã
ç§ãæ°ã¥ããããšã®1ã€ã¯ãã³ã³ããŒãã³ãã®package.json
ãã¡ã€ã«ã«"module": "src/index.jsx"
ãè¿œå ãããšãwebpackã®èŠåãåé€ãããŸããããã¯ã©ã€ã¢ã³ãåŽã®ReferenceError: exports is not defined
ã¯æ®ã£ãŠããŸããã åããšã©ãŒãå ±åããŠããã解決çããªã人ãèŠã€ããŸããã
ä»ã®ãšããã¹ããŒãªãŒããã¯v3ã䜿ãç¶ããã€ããã§ããããã®ã¹ã¬ãããç£èŠããææ¡ãåãã§è©ŠããŠã¿ãŸãïŒpray :: + 1ïŒ
@busticatedã¯ãå ±æã§ããè€è£œãªããžããªãããããã«èãããŸãã
@ndelangenã芧ããã ãããããšãããããŸãïŒprayïŒæ®å¿µãªããç§ã®ãªããžããªã¯å ¬éãããŠããŸããã ç§ã¯äžèšã®é¢é£ãã詳现ãå ±æããããšããŸãããããããŸã§ã®éãããã圹ç«ã€å Žåã¯ãå®çšçãªäŸãäœæããããšãè©Šã¿ãããšãã§ããŸãã å°ãæéãããããããããŸããã ãã以å€ã®å Žåã¯ãææ¡ãªã©ãè©ŠããŠã¿ãŠãã ããã
@ busticatedmonorepo -repro-repoãèŠãŠåãã§ããŸãð
ããã¯å¯èœæ§ãé«ãã§ãïŒ
æ®å¿µãªããã ReferenceError: exports is not defined
ã¯ãã以å€ã®ããšã¯äœãæããŠãããŸãããäœãããæ³å®ã©ããã§ã¯ãããŸããã
@ndelangenããããŸããããããåçŸãªããžããªã§ãð
https://github.com/busticated/storybook-monorepo-repo
ããªãã¯ç°¡åã«ã§ããã¯ãã§ãïŒ
git clone
npm i && npm start
...ãããŠã¹ããŒãªãŒããã¯ããã©ãŠã¶ã«ããŒããããããšããŠããã®ãèŠãŠãã ããã éçºããŒã«ã®ã³ã³ãœãŒã«ãéããšã exports
ãšã©ãŒã衚瀺ãããŸãã
ããã€ãã®ã¡ã¢ïŒ
npm run build
ãå®è¡ããŠãå
¬éåãã«ãããã¹ãããŸãnode@8
ãšnpm@5
ã䜿çšããŠæ¥äžã®ãžã§ãã調æŽããŸããïŒ"module": "src/index.jsx"
ãã£ãŒã«ããpackages/*/packge.json
ãã¡ã€ã«ã«è¿œå ããŸãã ããããå
ã«æ»ããšãå
ã®export 'default' (imported as 'Two') was not found
webpackã®èŠåã衚瀺ãããŸããã§ããã ãæ©ãèŠãŠã¿ãŸã
ç§ã¯Lernaã䜿çšããŠããŸãããå
éšããã±ãŒãžã¯Webpackã«ãã³ãã«ãããŠãããåºålibraryTarget: 'commonjs2'
ã§ãã @JasonTheAdamsã®ã³ã¡ã³ãã«åºã¥ãã¢ãããŒãã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãã ãŸããbabelrc { "sourceType": "unambiguous" }
ã䜿çšããŠ@ 0nn0ãœãªã¥ãŒã·ã§ã³ããã¹ãããŸãããããããæ©èœããŸãããããã±ãŒãžã«ãŒãã«.babelrc
ãå¿
èŠã§ãã
ããã€ãã®åºæ¬çãªã»ããã¢ãã-å€åããã¯èª°ããå©ããã§ãããðïŒã¹ããŒãªãŒããã¯ïŒ5.1.10ãã¬ã«ãïŒ3.16.4ããŠã§ãããã¯ïŒ4.39.1ãããã«ïŒ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ã¹ã¿ã€ã«ã®ã¢ãžã¥ãŒã«ããã€ã³ããŒããããããšãããšãããšã¯ã¹ããŒããå®çŸ©ãããŠããŸããããšãããšã©ãŒãçºçããŸããã ä»ã®äººãææ¡ããããã«ãBabelsourceTypeãªãã·ã§ã³ããæ確ãã«èšå®ãããšããŸããããŸããã
ããã¯Storybookã®å®éã®åé¡ã§ã¯ãªãã2ã€ã®ã¢ãžã¥ãŒã«ä»æ§ã®éäžã§ç«ã¡åŸçããŠããçµæã§ãã
ããŒãžã§ã³5.2ã§ä¿®æ£ãããŠããããã§ã
ããã«ã¡ã¯ã¿ããªãããã¯å®éã«ä¿®æ£ãããŠããŸããïŒ
5.2.1
ã䜿çšããŠããŸãããæ°ããäœæãããLerna monorepo
ã§ãã®åé¡ãçºçããŸãã
ç§ã®å Žåãããã¯èµ·ãã£ãŠããŸãïŒ https ïŒ//github.com/storybookjs/storybook/issues/3346#issuecomment -475437230
Storybook Webpack config
ãå€æŽããŠããLernaã packages
ã®node_modules
ïŒ$ãBabel
ã³ã³ãã€ã«ããé€å€ããŸããã ããããåé¡ã¯ãŸã ããã«ãããšæããŸãã
@idbartoszã®ã³ã¡ã³ãã«åºã¥ããŠç· ãããããŸããã @Lighttreeã¯ãŸã å£ããŠãããšæããŸããïŒ
æ··ä¹±ãæããŠç³ãèš³ãããŸããããå¿
èŠãªããã±ãŒãžãã«ãŒãã«åŒãäžããããéçºè
ã®äŸåé¢ä¿ãšããŠããã«ã€ã³ã¹ããŒã«ãããLernaæ§æã«åºã¥ããŠåçããŸããã ãããã£ãŠãç§ã¯åœŒãã®node_modules
ã解æããåé¡ãçµéšããŸããã§ããã
/lib/components/node_modules
https://github.com/storybookjs/storybook/issues/3346#issuecomment -475437230ã®ããã«ãããªãŒã®ããæ·±ããšããã«ããã±ãŒãžãã€ã³ã¹ããŒã«ããbabel-loaderããããã解æããŸãã
ããã©ã«ãã§ã¯ãã¹ããŒãªãŒããã¯ã¯ã«ãŒãnode_modules
ãé€å€ããŸããããã¹ãŠãé€å€ãã䟡å€ããããããããŸããã
@shilmanç§ããã®ãšã©ãŒã«çŽé¢ããŠããŸãã lerna
ã¢ããªããžããªã«react-motion
ããããŸãã
@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ã§ãæ£åžžã«åäœããã¯ãã§ãã
èå³ã瀺ãããã$ storybook
ãæ©èœããmonorepo
ãäœæã§ããŸãã @ busticatedã®ãã¡ã€ã«ãèŠããšãäžéšã®ã¹ã¯ãªãããééã£ãé åºã§å®è¡ãããäžéšã®äŸåé¢ä¿ãééã£ãpackage.json
ããããåé¡ãåŒãèµ·ãããŠãããšèšã£ãŠããããã§ã¯ãããŸããããåé¡ãçºçããŠããå¯èœæ§ããããŸãã
@pixeleate
@busticatedã®ãã¡ã€ã«ãèŠããšãäžéšã®ã¹ã¯ãªãããééã£ãé åºã§å®è¡ãããäžéšã®äŸåé¢ä¿ãæ£ãããªãpackage.jsonã«å«ãŸããŠããããšãããããŸãã
ãã£ãšå ·äœçã«ã§ããŸããïŒ
ãŸãã httpsïŒ //github.com/storybookjs/storybook/issues/3346#issuecomment -513397002ã«èšèŒãããŠããããã«ãã¹ããŒãªãŒããã¯v3
ãå®è¡ããŠãããµã³ãã«ãªããžããªã®_working_ããŒãžã§ã³ãããããšãèŠããŠãããŠãã ããã
@pixeleateäœæ¥ãªããžããªãå ±æããŠããã ããŸãããïŒ
monorepo
ãããžã§ã¯ãã䜿çšããŠããã»ãšãã©ã®äººãlerna
ã䜿çšããŠããããšãããããŸããç§ã¯ã$lerna
ã§ã¯ãªãyarn workspaces
ã䜿çšããmonorepo
ãããžã§ã¯ããæã£ãŠããŸããlerna
ãšãã¹ãŠãææ°ããŒãžã§ã³ã®storybook + typescript
ã§æ£åžžã«åäœããŠãããå¥åŠãªwebpack
æ§æããªããã°ãbabelã§ãæ£åžžã«åäœããã¯ãã§ããèå³ã瀺ãããã$
storybook
ãæ©èœããmonorepo
ãäœæã§ããŸãã @ 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
ðð€Šââãèšå®ããªãã®ã¯æ£ããã§ã
ãšã¯ãããæªãå€æ°åãèæ
®ããŠ$ïŒ$ 1 @storybook/addon-backgrounds
ã®äœ¿çšæ³ãæŽæ°ãããšã$ïŒ$ 2 master
ïŒ 1ã2ã3ã4 ïŒã§è¡ã£ãããã«ãå¯äžã®æªè§£æ±ºã®å€æŽã¯ç³žã䜿çšããŸãã
ç§ã¯æ£ããã§ããïŒ
ç·šéïŒããã¯ã yarn
ã«å¿
èŠãªå€æŽã®ã¿ãå«ãã¯ãªãŒã³ã¢ããããããã©ã³ãã§ãðhttpsïŒ//github.com/busticated/storybook-monorepo-repo/commit/4fb2cac0f05b65a5983f121b92a7c2d7438d8857
ã€ãŒã³ã¯ãŒã¯ã¹ããŒã¹ã¯ããã¹ãŠã®äŸåé¢ä¿ãã«ãŒãã«åŒãäžããŸããããã«ãããå€ãã®åé¡ã解決ãããŸãã
ç§ã®PRïŒ https ïŒ//github.com/storybookjs/storybook/pull/8822ããã©ã«ãã§è€æ°ã®node_modulesãã©ã«ããŒã®é€å€ããµããŒãããããã«ã¹ããŒãªãŒããã¯ã«å€æŽãå ããŸããã
ããã«è©³è¿°ãããŠããããã«ãç§ã¯ãã€ããŒãªãªãŒã¹ã§å€æŽãããããšãããªãæããŠããŸãã@ shilmanãããã§ãã 6.0ãŸã§ä¿æããæ¹ãè¯ããšå€æããŸããã
ã€ãŒã³ã¯ãŒã¯ã¹ããŒã¹ã¯ããã¹ãŠã®äŸåé¢ä¿ãã«ãŒãã«åŒãäžããŸããããã«ãããå€ãã®åé¡ã解決ãããŸãã
糞ã䜿çšãããšä»®å®ããŸãð
ããã©ã«ãã§è€æ°ã®node_modulesãã©ã«ããŒã®é€å€ããµããŒãããããã«ã¹ããŒãªãŒããã¯ã«å€æŽãå ããŸã
ãããæ ¹æ¬çãªåå ã§ããïŒ ããŒã«ã«ã§å€æŽãé©çšããŠããåé¡ã¯è§£æ±ºããªãããã§ãã
ãã©ãŠã¶ã®ã³ã³ãœãŒã«ã«æ¬¡ã®ããã«è¡šç€ºãããŸãã
TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
...ããã¯å°ãéããšæããŸã..ïŒ ãã€ãç®ã«ãããã1ã€ã®ãšã©ãŒã§ãããåžžã«ç°ãªã解決çããããŸãð€Šââ_ / meã¯ãbabelãšwebpackã®äžè¬çãªæ¹åã«çãã²ãããŸã_ð¬
ãã€ããŒãªãªãŒã¹ã§å€æŽãè¡ãããã®ã¯ããªãæãã§ãã@ shilmanãããã§ãã 6.0ãŸã§ä¿æããæ¹ãè¯ããšå€æããŸããã
ãããããããªãã®èšãããšãèããŸã-ãã®ãããªããšã¯ã©ããç°¡åãªããšã§ã¯ãããŸããã ãããä»ã®å Žæã§è¡ã£ãŠãããã¹ãŠã®äœæ¥ã«æè¬ããŸã-ã¹ããŒãªãŒããã¯ïŒv3ã§ãïŒã¯é©ãã»ã©åœ¹ç«ã€ããŒã«ã§ãïŒpray :: clap :: clap :: clap :: + 1ïŒ
TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
ããã¯ãWebpackãCommonJSã¢ãžã¥ãŒã«ãESMã©ãããŒã§ã©ããããŠããããšãåå ã§ããå¯èœæ§ããããŸãã ã¢ãžã¥ãŒã«ã§import
ã®äœ¿çšãæ€åºãããå ŽåãWebpackã¯ESMã©ãããŒã䜿çšããŸãã éåžžã次ã®ãããããåå ã§ãã
2çªç®ã®ã±ãŒã¹ãåé¿ããã«ã¯ãBabelã®sourceType
ã"unambiguous"
ã«èšå®ããŠãæåã«ã¢ãžã¥ãŒã«ã¿ã€ãããã§ãã¯ããããã«åŒ·å¶ããå¿
èŠããããŸãã
https://github.com/i-like-robots/broken-webpack-bundle-test-case
æŽæ°ïŒç§ã®å ã®ã³ã¡ã³ãã¯äžã«é ãããŠããŸãããããã¯è€æ°ã®ã¢ãã¬ããããžã§ã¯ãã§ãããã®åé¡ã解決ããããã«äœ¿çšããŠããåºæ¬æ§æã§ãïŒ
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æ©èœïŒ
ããããç¡é¢ä¿ã§ãããã«ã¹ã¿ã babel.config.js
ãåå ã§ããã®exports is not defined
ã®åé¡ãçºçããŠããŸãããhttpsïŒ//storybook.js.org/docs/configurations/custom-babel-config/ãèªãã§ç¹å®ã®åé¡ã解決ããŸããåé¡ã
@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/preset-env
ã«debug: true
ãªãã·ã§ã³ã䜿çšããªãããæåã§babelãã©ã°ã€ã³@babel/plugin-transform-modules-commonjs
ãè¿œå ããããšã§ããããã§ã«äœ¿çšãããŠããããã§ããâŠããããŸãããåäœããŸãã
ç·šéïŒããã¯ãwebpackã䜿çšããESMã¢ãžã¥ãŒã«ã®å©ç¹ã倱ãããã解決çã§ã¯ãããŸããã ã¹ããŒãªãŒããã¯ã®ãã«ãã«å¯ŸããŠã®ã¿ãcjsãžã®å€æã匷å¶ããå¿ èŠããããŸãã
ïŒtadaïŒç§ã®.storybook/.babelrc
ïŒïŒ tadaïŒ
{
"extends": "../.babelrc",
"plugins": [
"@babel/plugin-transform-modules-commonjs"
]
}
æãåèã«ãªãã³ã¡ã³ã
ãã®åé¡ã¯ã
.babelrc
ãã¡ã€ã«ã«æ£ãããã©ã°ã€ã³ãè¿œå ããããšã§ä¿®æ£ã§ããŸããtsconfig
ãã¡ã€ã«ã¯commonjs
äºæã¢ãžã¥ãŒã«ãçæããããã«æ§æãããŠãããããé©åãªãã©ã°ã€ã³ã䜿çšããå¿ èŠããããŸãããã¯ç§ã
.babelrc
ãã¡ã€ã«ã«æã£ãŠãããã®ã§ããããã¹ãŠãæ£åžžã«æ©èœããŠããŸãããŸã£ããåããªãã·ã§ã³ãšå€ãæã€tsconfig
ãã¡ã€ã«ããããŸãã"@babel/core"
"^ 7.1.0""@storybook/react"
^ 4.0.0-alpha.2 ""react"
"^ 16.4.0"泚ïŒãã®ãœãªã¥ãŒã·ã§ã³ã¯ãå¥ã®çš®é¡ã®ã¢ãžã¥ãŒã«https://babeljs.io/docs/en/next/plugins#modulesã§æ©èœããŸã