ãã°ã説æãã
ãã¯ãã«ã«ãã¬ãã¥ãŒã¬ã€ãã«èšèŒãããŠããããã«ãããã¥ã¡ã³ãããªã»ããã«sourceLoaderOptions: null
ãæž¡ããã«typescriptã䜿çšãããšã次ã®ãšã©ãŒãçºçããŸãã
Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type
æ®å¿µãªãããããã¯ã¹ããŒãªãŒããã¯tsconfig.json
ã"noImplicitAny": false
ã䜿çšããããã«æŽæ°ããŠãä¿®æ£ãããŸããã
åçŸããã«ã¯
åäœãåçŸããæé ïŒ
addon-docs
ã¹ããŒãªãŒãæžãäºæ³ãããè¡å
ããã¥ã¡ã³ãããŒãžã¯éåžžã©ããèªã¿èŸŒãŸããã¹ããŒãªãŒã®ã³ãŒãã¹ãããããå©çšã§ããŸãã
ã¹ã¯ãªãŒã³ã·ã§ãã
該åœããå Žåã¯ãåé¡ã®èª¬æã«åœ¹ç«ã€ã¹ã¯ãªãŒã³ã·ã§ãããè¿œå ããŠãã ããã
ã³ãŒãã¹ãããã
presets.js
ïŒ
{
name: '@storybook/addon-docs/react/preset',
options: {
sourceLoaderOptions: null,
},
}
ã·ã¹ãã ïŒ
ç°å¢æ
å ±ïŒ
ã·ã¹ãã ïŒ
OSïŒmacOS 10.14.5
CPUïŒïŒ16ïŒx64 IntelïŒRïŒCoreïŒTMïŒi9-9880H CPU @ 2.30GHz
ãã€ããªïŒ
ããŒãïŒ10.16.0- / usr / local / opt / node @ 10 / bin / node
ã€ãŒã³ïŒ1.17.3-ã / workspace / component-library / node_modules / .bin / yarn
npmïŒ6.9.0- / usr / local / opt / node @ 10 / bin / npm
ãã©ãŠã¶ïŒ
ChromeïŒ76.0.3809.100
SafariïŒ12.1.1
npmPackagesïŒ
@ storybook / addon-a11yïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addon-actionsïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addon-docsïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addon-knobsïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addon-linksïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addon-viewportïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / addonsïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / prefix-scssïŒ1.0.2 => 1.0.2
@ storybook / prefix-typescriptïŒ1.1.0 => 1.1.0
@ storybook / reactïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
@ storybook / themingïŒ^ 5.2.0-beta.36 => 5.2.0-beta.38
ããããšã@ enagy27ïŒ ããã«ã¯å°ãªããšãããã€ãã®ãªãã·ã§ã³ããããŸãã
1ïŒ source-loader
ã¯typescriptã«é©ããã³ãŒããåºåã§ããŸã
2ïŒãŠãŒã¶ãŒã¯typescriptãå¥ã®æ¹æ³ã§æ§æã§ããŸãïŒããã¯ç§ãã¡ã®ã¢ããªããžããªã§ã¯èŠãŠããŸããïŒ
3ïŒ source-loader
ã¯åé¿çãšããŠ@ts-ignore
ãåºåã§ããŸã
ç§ã¯ã3çªç®ã®ãªãã·ã§ã³ãæãç°¡åã«éå§ã§ãããšèããŠããŸããæåã®ãªãã·ã§ã³ã¯ããããé·æçã«æé©ã§ãã
ã°ã¬ãŒãã·ãŒã¶ãŒã®å¹œé!! ãã®åé¡ãåç §ããPRïŒ7831ãå«ãhttps://github.com/storybookjs/storybook/releases/tag/v5.2.0-beta.39ããªãªãŒã¹ããŸããã ä»ããã¢ããã°ã¬ãŒãããŠãè©Šããã ããïŒ
ãã®ãã¬ãªãªãŒã¹ã¯@next
NPMã¿ã°ã«ãããŸãã
ãã®åé¡ã解決ããŸãã ãŸã ããããšãæ®ã£ãŠãããšæãããå Žåã¯ãå床éããŠãã ããã
@ enagy27ã«ã¯
@shilman絶察ã«ïŒ ä»ãããè©ŠããŠã¿ãŠãã ããã ããããšãããããŸããïŒ
@shilmanã¯ãŸã beta.39
ãããã®ãšã©ãŒã確èªããŠããŸãð
ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx
./src/elements/tag/tag.stories.tsx
[tsl] ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx(69,52)
TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.
ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx
./src/elements/tag/tag.stories.tsx
[tsl] ERROR in /Users/eric.nagy/workspace/component-library/src/elements/tag/tag.stories.tsx(74,3)
TS2300: Duplicate identifier 'parameters'.
npx -p @storybook/cli<strong i="10">@next</strong> sb info
Environment Info:
System:
OS: macOS 10.14.5
CPU: (16) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
Binaries:
Node: 10.16.0 - /usr/local/opt/node@10/bin/node
Yarn: 1.17.3 - ~/workspace/component-library/node_modules/.bin/yarn
npm: 6.9.0 - /usr/local/opt/node@10/bin/npm
Browsers:
Chrome: 76.0.3809.100
Safari: 12.1.1
npmPackages:
@storybook/addon-a11y: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addon-actions: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addon-docs: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addon-knobs: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addon-links: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addon-viewport: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/addons: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/preset-scss: 1.0.2 => 1.0.2
@storybook/preset-typescript: 1.1.0 => 1.1.0
@storybook/react: ^5.2.0-beta.39 => 5.2.0-beta.39
@storybook/theming: ^5.2.0-beta.39 => 5.2.0-beta.39
ããããœãŒã¹ããŒããŒã«ãããšãããšããããåå¥ã«ã€ã³ã¹ããŒã«ããŠããããªã»ããã«åã蟌ãå¿ èŠããããŸããããããšãããªã»ããã®æ°ãããªãªãŒã¹ãå¿ èŠã§ããïŒ
@ enagy27ããã®æé ã䜿çšããŠããŒãããããœãŒã¹ã確èªããããŒãããããœãŒã¹ã«ïŒ7831ã®å€æŽãå«ãŸããŠãããã©ããã確èªã§ããŸããïŒ ïŒ .mdx
ã.tsx
眮ãæããã°ãæ®ããé©çšãããŸãïŒ
https://github.com/storybookjs/storybook/blob/next/addons/docs/docs/faq.md#how -do-i-debug-my-mdx-story
@shilman sourceLoaderOptions: null
ãæå¹ãªå Žåã«ã®ã¿ãµãŒããŒãèµ·åã§ããŸãðãã以å€ã®å Žåããã«ãã倱æãããšãµãŒããŒã®èµ·åãåæ¢ãããã©ãŠã¶ãŒå
ã®ãœãŒã¹ãæ€æ»ã§ããŸããã æåã«å€±æãããã«ãã§ãµãŒããŒããã€ãã¹ããŠèµ·åããã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã¯ãããŸããïŒ
ãã£ãšïŒ ãã®åé¡ãåç §ããPRïŒ7845ãå«ãhttps://github.com/storybookjs/storybook/releases/tag/v5.2.0-beta.40ããªãªãŒã¹ããŸããã ä»ããã¢ããã°ã¬ãŒãããŠãè©Šããã ããïŒ
ãã®ãã¬ãªãªãŒã¹ã¯@next
NPMã¿ã°ã«ãããŸãã
@ enagy27å€æŽãããŒãžããŠãªãªãŒã¹ããŸããã è©ŠããŠã¿ãïŒ
@shilmanãã®ãããªéã¯ãããŸããðç§ã¯ããŒã«ã«ã§å®éšããŠããŠãã³ããã€ããããšãã§ããªãããã§ãã ç§ã¯ããããã¹ãŠãã ãŸããŠas any
ãšããŠããŒã¯ããŸããããå€æ°parameters
éè€ã«ã€ããŠäžå¹³ãèšã£ãŠããããã§ããããã«ããã __STORY__
ãé©åã«ãšã¹ã±ãŒããããŠããªãã®ã§ã¯ãªãããšæããŸãã ãããããããTSã§ã¯ãªãJSã§ã©ã®ããã«æ©èœãããããããŸãã...ç§ã¯å°æããŠããŸã
ç§ããã®åé¡ãçµéšããŠããŸãããæ®å¿µãªããè¿œå ã®ã³ã³ããã¹ãã¯ããŸããããŸããã
ããã§ã®ãã1ã€ã®è§£æ±ºçã¯ãã¹ããŒãªãŒããã¯ãããŒãããtsconfig.js
ãã¡ã€ã«ïŒãããžã§ã¯ãã®tsconfigãŸãã¯.storybook/tsconfig.js
ïŒç§ã¯æãïŒïŒã®ãã¹ãŠã®ãå³å¯ãªãã¿ã€ããã§ãã¯ã«ãŒã«ããªãŒããŒã©ã€ãããããšã§ãã
ãããã¯ãæå¹ã«ãªã£ãŠããªãããšã確èªããããã®ãã®ã ãšæããŸãã
@libetlããªããæ¬åœã«å¿ããã®ã¯ç¥ã£ãŠããŸããããããèŠãŠããã ããã°çŽ æŽããããšæããŸãã
@JonKroneãå®è¡ãããšã[ããã¥ã¡ã³ã]ã¿ãã«ãœãŒã¹ã³ãŒãã衚瀺ãããŸããïŒ ãããã®å€æŽãè¡ããŸãããããŸã ãœãŒã¹ã衚瀺ãããŠããŸããð
awesome-typescript-loaderã䜿çšããå Žåã®äžæçãªè§£æ±ºçïŒ
/* tsconfig.json */
{
"compilerOptions": { },
"awesomeTypescriptLoaderOptions": {
"ignoreDiagnostics": [7005]
}
}
çæ³çã§ã¯ãããŸããããæ©èœããŸãã
@shilmanããã¯ããªããæ¢ããŠãããã®ã§ããïŒ åèãŸã§ã«ãããã¯TS7005ãç¡èŠããã«æ§ç¯ããããšã¯ã§ããŸããïŒæé»çãªãã®ã¯ãããŸããïŒã
// @ts-ignore
var withSourceLoader = require('@storybook/source-loader/preview').withSource;
// @ts-ignore
var __SOURCE_PREFIX__ = "/home/user/projects/real/ts/my-blog-react/src/graphql";
// @ts-ignore
var __STORY__ = "import React from \"react\";\n\nimport { ApolloProvider } from \"@apollo/react-hooks\";\nimport { storiesOf } from \"@storybook/react\";\n\nimport { Posts } from \"../views/Posts/index\"; // ! Fix coupling\nimport { PostContent } from \"../views/PostContent\"; // ! Fix coupling\nimport { withPostContentQuery } from \"./components/withPostContentQuery\";\nimport { withPostsQuery } from \"./components/withPostsQuery\";\nimport * as fakeQl from \"./fakeql/fakeql-endpoints\";\nimport apolloClientFactory from \"./apollo\";\n\n// FIXME: #coupling - find a way to not depend on Post and Container, probably fakes - but not good enough.\n\nconst apolloClient = apolloClientFactory(fakeQl.normalApiEndpoint);\nconst PostContentQuery = withPostContentQuery(PostContent);\nconst PostsQuery = withPostsQuery(Posts);\n\n// ~~~ Posts ~~~\nstoriesOf(\"GraphQL\", module).add(\"PostsQuery\", () => (\n <ApolloProvider client={apolloClient}>\n <PostsQuery routeHandler={() => null} />\n </ApolloProvider>\n));\n\n// ~~~ PostContent ~~~\nstoriesOf(\"GraphQL\", module).add(\"PostContentQuery\", () => (\n <ApolloProvider client={apolloClient}>\n <PostContentQuery postId=\"1\" />\n </ApolloProvider>\n));\n";
// @ts-ignore
var __ADDS_MAP__ = {"graphql--postsquery":{"startLoc":{"col":33,"line":20},"endLoc":{"col":1,"line":24},"startBody":{"col":47,"line":20},"endBody":{"col":1,"line":24}},"graphql--postcontentquery":{"startLoc":{"col":33,"line":27},"endLoc":{"col":1,"line":31},"startBody":{"col":53,"line":27},"endBody":{"col":1,"line":31}}};
// @ts-ignore
var __MAIN_FILE_LOCATION__ = "/root.stories.tsx";
// @ts-ignore
var __MODULE_DEPENDENCIES__ = [];
// @ts-ignore
var __LOCAL_DEPENDENCIES__ = {};
// @ts-ignore
var __IDS_TO_FRAMEWORKS__ = {};
import React from "react";
import { ApolloProvider } from "@apollo/react-hooks";
import { storiesOf } from "@storybook/react";
import { Posts } from "../views/Posts/index"; // ! Fix coupling
import { PostContent } from "../views/PostContent"; // ! Fix coupling
import { withPostContentQuery } from "./components/withPostContentQuery";
import { withPostsQuery } from "./components/withPostsQuery";
import * as fakeQl from "./fakeql/fakeql-endpoints";
import apolloClientFactory from "./apollo";
// FIXME: #coupling - find a way to not depend on Post and Container, probably fakes - but not good enough.
const apolloClient = apolloClientFactory(fakeQl.normalApiEndpoint);
const PostContentQuery = withPostContentQuery(PostContent);
const PostsQuery = withPostsQuery(Posts);
// ~~~ Posts ~~~
storiesOf("GraphQL", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).add("PostsQuery", () => (
<ApolloProvider client={apolloClient}>
<PostsQuery routeHandler={() => null} />
</ApolloProvider>
));
// ~~~ PostContent ~~~
storiesOf("GraphQL", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).add("PostContentQuery", () => (
<ApolloProvider client={apolloClient}>
<PostContentQuery postId="1" />
</ApolloProvider>
));
@ 0b10è©ŠããŠã¿ãŸããããããšãããããŸãïŒ çŸåšããããã®è¡ããã¹ãŠç¡èŠããŠããŸããã tsconfig.json
ãå€æŽããããšã¯èããŠããŸããã§ããð€
storybook-react-routerã1.0.6ã«æŽæ°ããåŸãããã§ãšã©ãŒãçºçããŸãããããã«ã¯åé¡ããããŸãïŒgvaldambrini / storybook-routerïŒ42ããã§ã¯ãšã©ãŒãçºçããŸããïŒstorybook-routerãšã©ãŒã¯ããããé¢é£ããŠããŸããã§ããã以äžã®ã³ã¡ã³ããåç
§ããŠãã ããïŒ ïŒ
TSXã¹ããŒãªãŒã§ãå©çšå¯èœãªã³ãŒãããããŸããããMDXã¯æ£åžžã«åäœããçµæã¯@ 0b10ã®ã¹ããŒãªãŒãšåã/æ£ç¢ºã«èŠããŸã
// @ts-ignore
var withSourceLoader = require('@storybook/source-loader/preview').withSource;
// @ts-ignore
var __SOURCE_PREFIX__ = "C:\\Workspace\\application-ui\\src\\components\\atoms\\container";
// @ts-ignore
var __STORY__ = "import { storiesOf } from \"@storybook/react\";\nimport React, { ReactElement } from \"react\";\n\nimport { Container } from \"components\";\n\nconst stories = storiesOf(\"Atoms/Container\", module).addParameters({ component: Container });\n\nstories.add(\"Default\", (): ReactElement => <Container>Hello</Container>);\n";
// @ts-ignore
var __ADDS_MAP__ = {};
// @ts-ignore
var __MAIN_FILE_LOCATION__ = "/Container.stories.tsx";
// @ts-ignore
var __MODULE_DEPENDENCIES__ = [];
// @ts-ignore
var __LOCAL_DEPENDENCIES__ = {};
// @ts-ignore
var __IDS_TO_FRAMEWORKS__ = {};
import { storiesOf } from "@storybook/react";
import React, { ReactElement } from "react";
import { Container } from "components";
const stories = storiesOf("Atoms/Container", module).addParameters({ storySource: { source: __STORY__, locationsMap: __ADDS_MAP__ } }).addDecorator(withSourceLoader(__STORY__, __ADDS_MAP__,__MAIN_FILE_LOCATION__,__MODULE_DEPENDENCIES__,__LOCAL_DEPENDENCIES__,__SOURCE_PREFIX__,__IDS_TO_FRAMEWORKS__)).addParameters({ component: Container });
stories.add("Default", (): ReactElement => <Container>Hello</Container>);
config.jsãdocs: DocsPage
ã ã£ãã®ã§æŽæ°ããŸãã
docs: {
container: DocsContainer,
page: DocsPage,
},
ããªã»ããïŒ
module.exports = [
{
name: "@storybook/addon-docs/react/preset",
options: {
configureJSX: true,
},
},
];
Webpackã®èšå®ãããããå¿ èŠãããŸãããïŒ
config.module.rules.push({
exclude: /node_modules/,
test: /\.(ts|tsx)$/,
use: [
{
loader: require.resolve("babel-loader"),
options: {
presets: [["react-app", { flow: false, typescript: true }]],
},
},
{
loader: require.resolve("react-docgen-typescript-loader"),
},
],
});
config.module.rules.push({
enforce: "pre",
include: [path.resolve(__dirname, "../src")],
loader: require.resolve("@storybook/source-loader"),
test: /\.(stories|story)\.[tj]sx?$/,
});
tsconfig.jsonã«ã¯"noImplicitAny": true
å«ãŸãã ignoreDiagnostics
ã¯å«ãŸããŸããð
rc.4
åé¡ã¯çºçããªããªããŸãããããœãŒã¹ã¯ãããŸããðãããïŒ6641ã§ããŒã¯ãããŠããããã«èŠããŸããããšã©ãŒãçºçããªããªã£ãããããã®åé¡ã¯éè€ããŠããå¯èœæ§ããããŸã
åé¿çãèŠã€ããŸããïŒ
sourceLoaderOptions: null
ç§ã䜿çšãã transpileOnly: true
ç§ã«tsLoaderOptions
parameters
å€æ°ãååšã§ããªãïŒ8055ã®åé¿çã«åŸã£ãŠãã ããas 'optionA' | 'optionB'
ãªã©ã®å³åŽã®ã¹ããŒãã¡ã³ãã®äœ¿çšã¯ããã§ã¯å€±æããå·ŠåŽã®å宣èšã«å€æããå¿
èŠããããŸãããããã¯å€±æããŸãïŒ
const colors = {
primary: 'primary',
secondary: 'secondary',
};
const color = radios('color', colors, colors.primary) as ButtonColor;
ããã¯æ©èœããŸãïŒ
const colors: Record<string, ButtonColor> = {
primary: 'primary',
secondary: 'secondary',
};
const color = radios('color', colors, colors.primary);
åŸããèãããšãããã¯åæšè«ã«é¢ããç解ã§ããsource-loader
åé¡ã®ããã§ãð€ãšã«ãããããã圹ç«ã€ããšãé¡ã£ãŠããŸãïŒ
@ enagy27ããªãã¯ãããç解ããããã«@libetlã5.3ã®ããæç¹ã§ãªã³ã©ã€ã³ã«æ»ãããšãæåŸ
ããŠããŸãããããã®åé¿çãäžèŠã«ãªãããã«ã source-loader
ã¢ããã°ã¬ãŒãããã ãã§ãã æåãç¥ã£ãŠããïŒ ð€
ããã 誰ããreacttypescriptãšããã¥ã¡ã³ããå«ãã¹ããŒãªãŒããã¯ãæ©èœããŠãããµã³ãã«ãªããžããªãæäŸã§ããŸããïŒ
@simonhossããã¯çŽ æŽãããã¢ã€ãã¢ã§ããç§ã¯ãããæ©èœãããã®ã«æ¬åœã«èŠåŽããŠããŸãã
ç§ãð
TSåœä»€ã«ããªããæãreact-docgen-typescript-loader
ã€ã³ã¹ããŒã«ãããšèšãã©ã®addon-info
ããããããã¥ã¡ã³ãã®ä»¥åã¯ãããèšãã¯ãããŸããaddon-docs
ã®ããã®ä»£æ¿ã§ããaddon-info
ïŒ TSã§ãããæ©èœããã»ããã¢ããã確èªããããTSã§addon-docs
ãã»ããã¢ããããããã®æ確ãªæé ã1ãæã§ç¢ºèªãããšéåžžã«åœ¹ç«ã¡ãŸãã
è²¢ç®ããŠå©ããŠãããŠããããã§ãããæåã«ãããã®éšåãã©ã®ããã«çµã¿åããããããç解ããå¿ èŠããããŸãïŒ ð
ããã¥ã¡ã³ãããªãªãŒã¹ãããã®ã§ãcra -ts-kitchen-sinkãæŽæ°ããŠãæ§æã®ããã«ãã¹ãŠåãããŒãžã«ããããšã確èªããã®ã«å°ãæéãããããããããŸããðããã¯1é±éãããããããããŸãã...ä»ã®ãšããèšå®ãæäŸããŸãïŒ
import '@storybook/addon-knobs/register';
import '@storybook/addon-a11y/register';
import '@storybook/addon-actions/register';
import { configure, addDecorator, addParameters } from '@storybook/react';
import { withA11y } from '@storybook/addon-a11y';
import { withKnobs } from '@storybook/addon-knobs';
import theme from './theme';
import '../stylesheets/gusto.scss';
// This file overrides styles from the global Gusto
// styles which interfere with Storybook styles
import './storybook.scss';
// Is your addon not showing up? Try looking for a `register` function
// and add it to .storybook/addons.js
addDecorator(withA11y);
addDecorator(withKnobs);
addParameters({
// storybook built-in
// more info available here:
// https://storybook.js.org/docs/configurations/options-parameter/
options: {
showPanel: true,
panelPosition: 'right',
// https://storybook.js.org/docs/configurations/theming/
theme,
},
knobs: {
escapeHTML: false,
},
// viewport structure here:
// https://github.com/storybookjs/storybook/tree/master/addons/viewport#use-custom-set-of-devices
// viewport: {
// defaultViewport: 'iphone6',
// type: 'mobile',
// },
});
configure(require.context('../src', true, /\.stories\.(js|jsx|ts|tsx|mdx)$/), module);
const path = require('path');
module.exports = [
'@storybook/preset-scss',
{
name: '@storybook/preset-typescript',
options: {
// Point the loader here to override the root "noEmit" compilerOption
tsLoaderOptions: {
// Transpile only means no type-checking from storybook, which greatly speeds up
// builds. Types will be checked as part of the normal build process. This may also
// be necessary for loading story source
transpileOnly: true,
configFile: path.resolve(__dirname, 'tsconfig.json'),
},
// We must use our config to ensure props and their comments are loaded
tsDocgenLoaderOptions: {
tsconfigPath: path.resolve(__dirname, 'tsconfig.json'),
// https://github.com/styleguidist/react-docgen-typescript#parseroptions
propFilter: prop => {
if (prop.parent) {
return !prop.parent.fileName.includes('node_modules/@types/react/');
}
return true;
},
},
},
},
'@storybook/addon-docs/react/preset',
];
ããã¯ç€Ÿå
ã«ããããå
±æã§ããŸãããã config.js
åç
§ãããŠããŸãã
ãã®ãã¡ã€ã«ã¯ãã¹ããŒãªãŒããã¯ã§ã¯æå³ããªããªãã«ãŒãtsconfig.json
æ§æãåé€ããããã ãã«äœ¿çšãããŸãã
{
"extends": "../tsconfig.json",
"compilerOptions": {
"noEmit": false
}
}
ããã«ã¡ã¯@ enagy27-ãããããããšãã ç§ã¯ãããã«ã¹ã¿ã webpackæ§æã§åäœãããŸããã å¥åŠãªçç±ã§typescriptããªã»ããã䜿çšãããšãã¹ããŒãªãŒããã¯ã«ã¢ã»ãããã€ã³ããŒãã§ããªããªããŸããã€ãŸãã-cssãã¡ã€ã«ã§ãã
ç§ãçŽé¢ããŠããå°ããªåé¡ã®1ã€ã¯ãç§ã®å°éå ·ããŒãã«ã次ã®ãããªåãæšæž¬ã§ããªãããšã§ãã
SomeType['property']
çŸåšãããŒãã«ã«ãŠããªã³ã§ã¯ãªãany
ããŠããŸããããããåé¿ããæ¹æ³ãããã®ã§ã¯ãªãããšæããŸãã
ããã«ã¡ã¯ã@ enagy27ã ãããããããšãã ç§ã¯ããªããå
±æããèšå®ã§ãããåäœãããŸããããããããŸã ããã€ãã®åé¡ããããŸãã tsxã§ã³ã³ããŒãã³ããäœæãããšãã³ã³ããŒãã³ãã®èª¬æãšå°éå
·ã®èª¬æãçæã§ããŸããã ããããããã¯jsxã§åäœããŸãã
ããã«ã¡ã¯@zerofrontã ç§ã¯ãã®æ£ç¢ºãªã³ã¡ã³ããã¿ãŒã³ã«åŸããªããã°ãªããŸããã§ãã
ã³ã³ããŒãã³ãã®èª¬æïŒ
/**
* This is a component description and should sit directly above your component
*/
æ¯æ±ã®èª¬æïŒ
/** I am a prop description and should sit directly above the interface property i am describing */
@ enagy27å®éãç§ã¯ããªããç§ã®æåã®åçã«ç€ºããã³ã¡ã³ããã¿ãŒã³ã«åŸã£ãŠããŸãã
@zerofrontã§ã¯ãã³ã³ããŒãã³ãã«export const Button: React.FC<BaseButtonProps> = props => {...}
䜿çšã§ããŸã
ðTSãšdocgenã䜿çšããã»ããã¢ãããäœããã®çç±ã§ãžã§ããªãã¯ã§æ©èœããªããããããã§åé¡ãçºçããŸããïŒ8143
@zerofrontç§ã¯ãŸãã«ããªãã®åé¡ãæ±ããŠããŸãã Buttonããã¥ã¡ã³ãã®å°éå
·ã»ã¯ã·ã§ã³ã§ãStorybookã¯BaseButtonProps
ã€ã³ã¿ãŒãã§ã€ã¹ã®ä»£ããã«defaultProps
å°å·ããŠããŸãã ãããŠãç§ã説æãæããã§ãã åå¹ã«ã€ããŠã¯ã次ã®ããã«ã¹ããŒãªãŒãã¡ã€ã«ã«è¿œå ã§ããŸãã
export default {
title: 'Button',
component: Button,
parameters: {
componentSubtitle: 'Handy status label',
},
}
@zerofront @ enagy27ãèšã£ãããšã«å ããŠã
* .stories.tsxãæäœããã«ã¯ã次ã®æ§æã®ãããªãã®ãè¿œå ããå¿
èŠããããŸãã
.storybook / webpack.config.js
const path = require('path');
const include = path.resolve(__dirname, '../src');
module.exports = ({ config }) => {
config.module.rules.push({
test: /\.ts(x?)$/,
exclude: /node_modules/,
use: [
{
loader: require.resolve('babel-loader'),
options: {
presets: [['react-app', { flow: false, typescript: true }]],
},
},
],
include,
});
return config;
};
@zerofrontã§ã¯ãã³ã³ããŒãã³ãã«
export const Button: React.FC<BaseButtonProps> = props => {...}
䜿çšã§ããŸã
@zerofront @ enagy27æšæ¥ãç§ã®åé¡ïŒ@zerofrontãšæããã«åãïŒãé¢æ°ã®returnåã«ãã£ãŠæ£ç¢ºã«åŒãèµ·ããããŠããããšãçºèŠããŸããã
ããã¯ç§ã®ããã«ä¿®æ£ãããŸããïŒ
- import React from 'react'
+ import React, { FC } from 'react'
- export const Button: React.FC<Props>
+ export const Button: FC<Props>
ãœãŒã¹ïŒ
https://github.com/strothj/react-docgen-typescript-loader/issues/42#issuecomment -535090697
ãããŠéšåçã«ãã®ã¡ã¢ã¯é¢é£ããŠããå¯èœæ§ããããŸãïŒ
https://github.com/strothj/react-docgen-typescript-loader#react -component-class-import
ãããã圹ã«ç«ãŠã°å¹žãã§ãã
@sergiop @ enagy27ããããšãïŒ æçµçã«ãå°éå
·ããŒãã«ã¯æ©èœããŸãã
ãããããŸã ããã€ãã®åé¡ããããŸãã
defaultPropsãæåååã§ãªãå Žåãçæã§ããŸããã
@zerofrontåãåé¡ãããããšã確èªã§ããŸãã ä¿®æ£ããããã«ç®¡çããåé¡ã®ç§ã®ããããšãªã¹ãã«ãããŸãã ;-)
åå ã調ã¹ããå Žåã¯ãã¹ããŒãªãŒããã¯èªäœã«é¢é£ããŠããã®ãã react-docgen-typescript-loader
é¢é£ããŠããã®ããç解ããããšããå¿
èŠããããŸãã
@zerofrontã¯ãå°çšã®åé¡ãéãæ¹ãè¯ããããããŸããã ;-)
å°éå ·ãå解ããªãããããã©ã«ãã®å°éå ·ãèšå®ããããšãã§ããŸããã æåå以å€ã®å€ã§ãæ©èœããããšã¯ééããããŸããã
NSïŒ
const Text = ({
text: 'Hello world'
}: Props) => <p>{text}</p>
å°éå ·ãå解ããªãããããã©ã«ãã®å°éå ·ãèšå®ããããšãã§ããŸããã æåå以å€ã®å€ã§ãæ©èœããããšã¯ééããããŸããã
NSïŒ
const Text = ({ text: 'Hello world' }: Props) => <p>{text}</p>
@ sami616ç§ã¯ããªããšåãããã©ã«ãã®å°éå ·ã䜿çšããŸãããç§ã¯ãã§ã«å ±åã@zerofrontãªã©ã®éæååã®ããã©ã«ãå€ã衚瀺ãããŸããã
ç§ã®ã³ã¡ã³ããç¡èŠããŠãã ãããã¯ãç§ã¯åãåé¡ãæ±ããŠããŸãã
@ sami616 ããã§ã«è¿°ã¹ãããã«ãããã«é¢ãããã°ã¬ããŒããéãããã®ã§ããããã®åã«ãã³ãŒãããŒã¹ã§å°ã調æ»ããŠãåé¡ã®åå ãstorybook
ãreact-docgen-typescript-loader
ããç解ããå¿
èŠããããŸãã
@ sami616 @sergiop
react-docgen-typescript-loaderããŒãžã§ã³3.2.1ãã€ã³ã¹ããŒã«ããŸã
node_modules / react-docgen-typescript-loader / dist / generateDocgenCodeBlockã«ããã€ãã®ã³ãŒããèŠã€ãããŸãã
var setDefaultValue = function(defaultValue) {
return typescript_1.default.createPropertyAssignment(
typescript_1.default.createLiteral('defaultValue'),
// Use a more extensive check on defaultValue. Sometimes the parser
// returns an empty object.
defaultValue != null && typeof defaultValue === 'object' && 'value' in defaultValue && typeof defaultValue.value === 'string'
? typescript_1.default.createObjectLiteral([
typescript_1.default.createPropertyAssignment(
typescript_1.default.createIdentifier('value'),
typescript_1.default.createLiteral(defaultValue.value),
),
])
: typescript_1.default.createNull(),
);
};
&& typeof defaultValue.value === 'string'
ãã®æ¡ä»¶ã¯ãdefaultPropsã®ã¿ã€ããå¶éããŸãã
ãããŠãææ°ããŒãžã§ã³3.3.0ã®react-docgen-typescript-loaderã§ã¯ãæååãæ°å€ãããŒã«å€ããµããŒãããŸãã
https://github.com/strothj/react-docgen-typescript-loader/blob/master/src/generateDocgenCodeBlock.ts
const setDefaultValue = (
defaultValue: { value: string | number | boolean } | null,
) =>
ts.createPropertyAssignment(
ts.createLiteral("defaultValue"),
// Use a more extensive check on defaultValue. Sometimes the parser
// returns an empty object.
defaultValue != null &&
typeof defaultValue === "object" &&
"value" in defaultValue &&
(typeof defaultValue.value === "string" ||
typeof defaultValue.value === "number" ||
typeof defaultValue.value === "boolean")
? ts.createObjectLiteral([
ts.createPropertyAssignment(
ts.createIdentifier("value"),
ts.createLiteral(defaultValue!.value),
),
])
: ts.createNull(),
);
@zerofront ãç¥ã£ãŠããã£ãã ç§ã3.2.1ãæã£ãŠããŸãã ä»æé ãã«3.3.0ã«æŽæ°ããŠãããã§åé¡ã解決ãããã©ããã確èªããŸãã ããããšãã
@zerofront react-docgen-typescript-loader
ã3.3.0ã«æŽæ°ãããšåé¡ã解決ããããšã確èªã§ããŸãã ããããšãã
awesome-typescript-loaderã䜿çšããå Žåã®äžæçãªè§£æ±ºçïŒ
/* tsconfig.json */ { "compilerOptions": { }, "awesomeTypescriptLoaderOptions": { "ignoreDiagnostics": [7005] } }
çæ³çã§ã¯ãããŸããããæ©èœããŸãã
ä»æ¥ã5.1ãã5.2.5ã«ã¢ããããŒããããšãããaddon-docsããŸã ã€ã³ã¹ããŒã«ããã«ããã®ãšã©ãŒãçºçãå§ããŸããã ãã®è§£æ±ºçã¯ç§ã«ãšã£ãŠã¯ããŸããããŸããããç§ã®çç±ã¯ã¯ã£ããããŠããŸããã
çããããã«ã¡ã¯ïŒ æè¿ããã®åé¡ã¯ããŸãé²ãã§ããªãããã§ãã ããã§ã質åãã³ã¡ã³ãããã°ãããå Žåã¯ãé æ ®ãªãè°è«ãç¶ããŠãã ããã æ®å¿µãªããããã¹ãŠã®åé¡ã«åãçµãæéããããŸããã ç§ãã¡ã¯ãã€ã§ãå¯ä»ãåãä»ããŠããŸãã®ã§ããµããŒããå¿ èŠãªå Žåã¯ãã«ãªã¯ãšã¹ããéä¿¡ããŠãã ããã éã¢ã¯ãã£ããªåé¡ã¯30æ¥åŸã«ã¯ããŒãºãããŸãã ããããšãïŒ
ããŒãžã§ã³"@storybook/react": "5.2.6"
ãš"react-docgen-typescript-loader": "3.6.0"
ã«ã€ããŠããã®åé¡ã§èª¬æãããŠãããšã©ãŒãåŒãç¶ãçºçããŸãã ããã¯ãé¢é£ããã®ã§ãããè¿œå ããããã¡ã€ã«ã®ã¿ãããããªãå Žåã¯// @ts-ignore
ç§__MODULE_DEPENDENCIES__
ããã§åç
§ã®PRã«ããã®src /ãµãŒããŒ/ build.jsããã¯ãŸã ããŠããªã-ç¡èŠã ãªããSRC /client/preview.js ã
@ jalooc5.3ããŒã¿çããã§ãã¯ããŠãã ããã å°éå ·ããŒãã«ã®å€§å¹ ãªæ¹åã
@shilmanãããæåŸã«beta.6ã§è©ŠããŸããããåé¿çããªããšæ©èœããŸããã§ããã ææ°ã®ãã®ã§ããäžåºŠããçŽããŸãð
ã¹ããŒãªãŒããã¯5.3ã§ããã®åé¡ãçºçããŸãã [email protected]ããã³react-docgen-typescript-loader3.6.0ã
ç§ã«ãšã£ãŠãããä¿®æ£ããå¯äžã®æ¹æ³"noImplicitAny": false
ã tsconfig.json
"noImplicitAny": false
ãèšå®ããããšã§ããããããã¯æ¬åœã«ãããããªãããšã§ãã
ç§ãåŸãŠãããšã©ãŒã¯ããã§ãïŒ
TS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.
ã¹ããŒãªãŒã«ã¿ã€ããè¿œå ããŠããåé¡ãå®å šã«ä¿®æ£ãããããã§ã¯ãããŸããã
ãã©ããŒã¢ããã@ enagy27ã§èšåãããŠããtranspileOnly
ãªãã·ã§ã³ã䜿çšããŠåäœãããŸããã å®å
šãªwebpackæ§æã®ä»£ããã«ããªã»ããã䜿çšããŠããŸããããã¯çŸåšãç§ã®presets.js
ã§ãã tsconfig.json
å€æŽã¯ãããŸããïŒ
// presets.js
const path = require("path");
module.exports = [
{
name: "@storybook/preset-typescript",
options: {
tsLoaderOptions: {
configFile: path.resolve(__dirname, "../tsconfig.json"),
transpileOnly: true,
},
tsDocgenLoaderOptions: {
tsconfigPath: path.resolve(__dirname, "../tsconfig.json"),
},
include: [path.resolve(__dirname, "../src")],
},
},
{
name: "@storybook/addon-docs/react/preset",
options: {
configureJSX: true,
//sourceLoaderOptions: null,
},
},
];
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ TSã§ã¹ããŒãªãŒããã¯ã¢ããªã³ã䜿çšããããšããŠããŸãããåé¿çã䜿çšããŠããããä¹ãè¶ããããšã¯ã§ããŸããã åãåãç¶ãã
ãå€æ° '__MODULE_DEPENDENCIES__'ã¯æé»çã« 'any []'åãæã£ãŠããŸããã
çŸåšãã¹ããŒãªãŒããã¯ã5.3.0-beta.16ã«æŽæ°ããããã«èšèŒãããŠããä»ã®åé¿çãè©ŠããŸããã ããããšã
ã¿ã€ãã¹ã¯ãªããã§å°éå ·ããŒãã«ã衚瀺ããã¹ããŒãªãŒããã¯ã¢ããªã³ããã¥ã¡ã³ããååŸã§ããŸããã ãã³ã³ããŒãã³ããèŠã€ãããŸããããšã ã衚瀺ãããŸãã
addons.js
import '@storybook/addon-knobs/register'
import '@storybook/addon-a11y/register'
import '@storybook/addon-docs/register'
prefixs.js
module.exports = [
{
name: "@storybook/addon-docs/react/preset",
options: {
configureJSX: true,
}
}
]
webpack.config.js
const path = require('path')
const SRC_PATH = path.join(__dirname, '../src')
module.exports = ({ config }) => {
config.module.rules.push({
test: /\.(ts|tsx|js|jsx)$/,
include: [SRC_PATH],
use: [
{
loader: require.resolve('babel-loader'),
options: {
presets: [['react-app', { flow: false, typescript: true }]],
plugins: ['babel-plugin-styled-components']
},
},
{
loader: require.resolve('react-docgen-typescript-loader'),
options: {
tsconfigPath: path.resolve(__dirname, '../tsconfig.json'),
},
},
{
loader: require.resolve('@storybook/source-loader'),
options: { parser: 'typescript', injectParameters: true, },
},
],
exclude: [/node_modules/],
enforce: 'pre',
})
config.resolve.extensions.push('.ts', '.tsx', '.js', '.jsx')
return config
}
ã¹ããŒãªãŒããã¯5.2.8
ã¢ããªã³ããã¥ã¡ã³ã5.2.8
react-docgen-typescript-loader 3.6.0
ããã«ããŒããŒ8.0.6
@ storybook / source-loader 5.2.8
ãŸããComponent Story Formatã䜿çšãããšãã¹ããŒãªãŒããã¯ã¯ã³ã³ããŒãã³ãããŸã£ããæ€åºããŸããïŒãã£ã³ãã¹ãããã¥ã¡ã³ããã¡ãã¥ãŒã¯ç©ºçœã§ãïŒããstoriesOfã䜿çšãããšè¡šç€ºãããŸãã
åé¿çãšããŠãå³å¯ãªã«ãŒã«ããªãã«ããŠãããã¥ã¡ã³ãã®çæãtsconfig.jsonã«åããããšãã§ããŸãã ä»ã®ãšãããã®ããã«è§£æ±ºãããšæããŸãã èå³ã®ããæ¹ã¯æ¥é±å確èªã§ããŸãã
ãããã¯ç§ã®æ§æã§ãã圹ç«ã€ãããããŸããã
gititã¯å®å
šã«æ©èœããŠããŸãã
++ãã®
constAccordionItemããšã¯ã¹ããŒãããŸã
ãããŠç§ã¯webpack.config.jsãæã£ãŠããŸãã
ãŸã èŠåŽããŠããä»ã®äººã®ããã«ãreact-docgen-typescript-loaderã®ããã€ãã®èŠçãªãããã°ã®åŸãç§ã¯ã€ãã«ãããæ©èœãããããšãã§ããŸããã
React-docgen-typescript-loaderã¯ãã³ã³ããŒãã³ãåã§ã¯ãªããã©ã«ããŒåã䜿çšããŠ__docgeninfo
ãå²ãåœãŠããããã³ã³ããŒãã³ããåãååã®ãã©ã«ããŒã«é
眮ããå¿
èŠããããŸãïŒå€§æåãšå°æåãåºå¥ãããŸãïŒã
|__
CTALink
|___index.tsx
CSF圢åŒãæ©èœãããããšãã§ããŸããã§ããïŒåžžã«ç©ºçœïŒãã storiesOf
æ§æã䜿çšããå Žåãå°éå
·ããŒãã«ãååŸããã«ã¯ãã¹ããŒãªãŒããã¯ã®addParameters
é¢æ°ã䜿çšããã³ã³ããŒãã³ããå«ããå¿
èŠããããŸãã
storiesOf('CTALink', module)
.addParameters({
component: CTALink,
})
.add('default story', () => (
<CTALink to="/">Click here</CTALink>
))
çããããã«ã¡ã¯ïŒ æè¿ããã®åé¡ã¯ããŸãé²ãã§ããªãããã§ãã ããã§ã質åãã³ã¡ã³ãããã°ãããå Žåã¯ãé æ ®ãªãè°è«ãç¶ããŠãã ããã æ®å¿µãªããããã¹ãŠã®åé¡ã«åãçµãæéããããŸããã ç§ãã¡ã¯ãã€ã§ãå¯ä»ãåãä»ããŠããŸãã®ã§ããµããŒããå¿ èŠãªå Žåã¯ãã«ãªã¯ãšã¹ããéä¿¡ããŠãã ããã éã¢ã¯ãã£ããªåé¡ã¯30æ¥åŸã«ã¯ããŒãºãããŸãã ããããšãïŒ
Typescriptã¯5.3ã®ãœãŒã¹ãããã¯ã§æ©èœããŠããã¯ãã§ãã ééã
@storybook/react
ãš@storybook/addon-docs
äž¡æ¹ã5.3.0-rc.4ã«æŽæ°ããŸãããããšã©ãŒã¡ãã»ãŒãžTS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.
衚瀺ããç¶ããŸã
ããªã»ããã䜿çšããŠããããwebpackãåããŠãªã®ã§ãééããç¯ããå¯èœæ§ããããŸãã
ãããç§ã®webpack.config.jsã§ãïŒ
`` `const path = requireïŒ 'path'ïŒ;
module.exports = {
ããŒãïŒ{
fsïŒ '空'ã
child_processïŒ '空'
}ã
è§£æ±ºïŒ {
ã¢ãžã¥ãŒã«ïŒ[
'node_modules'ã
]ã
æ¡åŒµåïŒ["ãts"ã "ãtsx"]ã
ã·ã³ããªãã¯ãªã³ã¯ïŒtrue
}ã
ã¢ãžã¥ãŒã«ïŒ{
ã«ãŒã«ïŒ[
{{
ãã¹ãïŒ/ãïŒts | tsxïŒ$ /ã
䜿çšããïŒ [
{{
ããŒããŒïŒrequire.resolveïŒ 'awesome-typescript-loader'ïŒ
}ã
{{
ããŒããŒïŒrequire.resolveïŒ 'react-docgen-typescript-loader'ïŒ
}ã
]
}ã
{{
ãã¹ãïŒ/ãïŒstories | storyïŒã[tj] sxïŒ$ /ã
ããŒããŒïŒrequire.resolveïŒ '@ storybook / source-loader'ïŒ
}
]
}ã
å€èŠ³ïŒ{
'class-transformer'ïŒ 'class-transformer'
}
};
`` `
ãšãã!! ãã®åé¡ãåç §ããPRïŒ9272ãå«ãhttps://github.com/storybookjs/storybook/releases/tag/v5.3.0-rc.5ããªãªãŒã¹ããŸããã ä»ããã¢ããã°ã¬ãŒãããŠãè©Šããã ããïŒ
ãã®ãã¬ãªãªãŒã¹ã¯@next
NPMã¿ã°ã«ãããŸãã
@JacopoBontaææ°ãªãªãŒã¹5.3.0-rc.5
ãè©Šãããšãã§ããŸããïŒ
ããã«ã¡ã¯@shilmanã¹ããŒãªãŒããã¯ãšçµã¿åãããããã¥ã¡ã³ãã®çŽ æŽããããµããŒãã«æè¬ããŸãã
5.3.0-rc.5
ã«æŽæ°ããŸããããããã§ããšã©ãŒTS7005: Variable '__MODULE_DEPENDENCIES__' implicitly has an 'any[]' type.
以äžã«ç€ºãããã«ã ignoreDiagnostics: [7005]
ãts-loader
æ§æã«è¿œå ããå Žåã«ã®ã¿æ©èœããŸãã
ãã¡ã€ã«main.js
ïŒ
const { addons } = require('@storybook/addons');
const path = require('path');
const tsImportPluginFactory = require('ts-import-plugin')
module.exports = {
stories: ['../packages/**/*.stories.(tsx|mdx)'],
presets: [
{
name: '@storybook/preset-typescript',
options: {
tsLoaderOptions: {
configFile: path.resolve(__dirname, 'tsconfig.json'),
ignoreDiagnostics: [7005],
getCustomTransformers: () => ({
before: [ tsImportPluginFactory(
{
libraryName: 'antd',
style: 'css',
libraryDirectory: 'es'
}
) ]
}),
},
tsDocgenLoaderOptions: {
tsconfigPath: path.resolve(__dirname, 'tsconfig.json'),
},
forkTsCheckerWebpackPluginOptions: {
colors: false, // disables built-in colors in logger messages
},
include: [path.resolve(__dirname, "../packages")]
},
},
{
name: '@storybook/addon-docs/preset',
options: {
}
}],
addons: [
'@storybook/addon-docs/register',
'@storybook/addon-knobs/register',
'@storybook/addon-actions/register',
'@storybook/addon-links/register'
],
};
@JacopoBontaææ°ãªãªãŒã¹
5.3.0-rc.5
ãè©Šãããšãã§ããŸããïŒ
ç³ãèš³ãããŸãããã 5.3.0-rc.5
ãžã®ã¢ããã°ã¬ãŒãã¯æ©èœããŸãã
@storybook/react
ãš@storybook/addon-docs
äž¡æ¹ãæŽæ°ããŸããããåããšã©ãŒãçºçãç¶ããŸãã
AcJacopoBonta @ esakalã®åé¿çã確èªã§ããŸã
@JacopoBonta awesome-typescript-loader
ã䜿çšããŠããããã§ãã çŸåšãä»ã®ããŒããŒã䜿çšããŠããŸããã1ãæåã«ããã䜿çšãããšãã«ãåæ§ã®åé¿çãå®è¡ããŸããã awesome-typescript-loader
å Žåã次ã®ããšãè¡ãå¿
èŠããããŸãã
/* tsconfig.json */
{
"compilerOptions": { },
"awesomeTypescriptLoaderOptions": {
"ignoreDiagnostics": [7005]
}
}
ããããåã£
ã¯ããåäœããŸãã ç§ã¯ä»¥åã«ãã®åé¿çããã§ã«äœ¿çšããŠããŸãããããããªãã®æ¹æ³ãæ¢ããŠããŸããã
ãšã«ãããç§ãããããæè¬ããŠããå©ãã«æè¬ããæ°å¹ŽãããŸããŠããã§ãšãããããŸãð
ããããšã@esakalããªãã®è§£æ±ºçã¯ãããŸã§ã®ãšããïŒç§ã«ãšã£ãŠïŒæé«ã§ãã ç§ã¯TypeScriptã®åé¡ãä¿®æ£ããããã«transpileOnly: true
ãèšå®ããŠããŸãããããã®ofcã«ã¯ãããå€ãã®TypeScriptãšã©ãŒãæ°ä»ãããã«ééã§ããããã«ããå¹æããããŸããã
ç§ã®çŸåšã®ããªãæå°éã®æ§æïŒ presets.js
ïŒã¯æ¬¡ã®ããã«ãªããŸãã
const path = require("path");
module.exports = [
{
name: "@storybook/preset-typescript",
options: {
tsLoaderOptions: {
configFile: path.resolve(__dirname, "../tsconfig.json"),
ignoreDiagnostics: [7005],
},
},
},
{
name: "@storybook/addon-docs/preset",
options: {
configureJSX: true,
},
},
];
ããããšãããããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
awesome-typescript-loaderã䜿çšããå Žåã®äžæçãªè§£æ±ºçïŒ
çæ³çã§ã¯ãããŸããããæ©èœããŸãã