【问题标题】:故事书顺风。我应该如何在故事书中添加顺风
【发布时间】:2021-04-06 07:19:19
【问题描述】:

我想为故事书添加顺风。这样,Stories 就会像在 Web 上呈现一样呈现。

我使用create-react-app project-name --template typescript 创建项目。

然后我按照 tailwind 文档中的 https://tailwindcss.com/docs/guides/create-react-app 指令安装 tailwind。

完成后,我运行代码npm sb init。这确保了故事书的运行。

现在我需要告诉 storybook 使用 tailwindcss 进行样式设置。但我不知道怎么做。

我看到的所有其他答案都告诉我要编辑 postcss.config.js 文件。

但我遵循了这个https://tailwindcss.com/docs/guides/create-react-app 文档,我什至不必创建 postcss.config.js 文件。所以我很困惑现在该怎么办。

为清楚起见,我将在下面包含一些配置文件。

craco.config.js

module.exports = {
    style: {
      postcss: {
        plugins: [
          require('tailwindcss'),
          require('autoprefixer'),
        ],
      },
    },
  }

.storybook/preview.js

import "../src/index.css"

export const parameters = {
  actions: { argTypesRegex: "^on[A-Z].*" },
}

.storybook/main.js

module.exports = {
  "stories": [
    "../src/**/*.stories.mdx",
    "../src/**/*.stories.@(js|jsx|ts|tsx)"
  ],
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/preset-create-react-app"
  ]
}

src/index.css

@tailwind base;
@tailwind components;
@tailwind utilities;

tailwind.config.js

module.exports = {
  purge: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'],

  darkMode: false, // or 'media' or 'class'
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}

package.json

`{
  "name": "memory",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@craco/craco": "^6.0.0",
    "@tailwindcss/postcss7-compat": "^2.0.2",
    "@testing-library/jest-dom": "^5.11.4",
    "@testing-library/react": "^11.1.0",
    "@testing-library/user-event": "^12.1.10",
    "@types/jest": "^26.0.15",
    "@types/node": "^12.0.0",
    "@types/react": "^16.14.2",
    "@types/react-dom": "^16.9.8",
    "autoprefixer": "^9.8.6",
    "postcss": "^7.0.35",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-scripts": "4.0.1",
    "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.0.2",
    "typescript": "^4.0.3",
    "web-vitals": "^0.2.4"
  },
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "react-scripts eject",
    "storybook": "start-storybook -p 6006 -s public",
    "build-storybook": "build-storybook -s public"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@storybook/addon-actions": "^6.1.11",
    "@storybook/addon-essentials": "^6.1.11",
    "@storybook/addon-links": "^6.1.11",
    "@storybook/node-logger": "^6.1.11",
    "@storybook/preset-create-react-app": "^3.1.5",
    "@storybook/react": "^6.1.11"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": [
    "src"
  ]
}

【问题讨论】:

    标签: reactjs typescript webpack tailwind-css storybook


    【解决方案1】:

    你快到了。

    您的配置中缺少的部分是添加一个 webpack 配置以将 tailwind 应用到 postcss-loader

    const path = require('path')
    
    module.exports = {
      stories: [
        '../src/**/*.stories.mdx', 
        '../src/**/*.stories.@(js|jsx|ts|tsx)'
      ],
      addons: [
        '@storybook/addon-links',
        '@storybook/addon-essentials',
        '@storybook/preset-create-react-app',
      ],
      webpackFinal: async (config) => {
        config.module.rules.push({
          test: /\.css$/,
          use: [
            {
              loader: 'postcss-loader',
              options: {
                ident: 'postcss',
                plugins: [
                  require('tailwindcss'),
                  require('autoprefixer'),
                ],
              },
            },
          ],
          include: path.resolve(__dirname, '../'),
        })
        return config
      },
    }
    
    

    【讨论】:

    • 这是救命稻草!
    • 也许你应该为此创建一个样板文件
    • 糟糕,我只需要在 .storybook/preview.js 中添加 import "../src/index.css" ?
    • @sudo_kaizen 我在我维护的样板文件中添加了一个故事书设计系统,也许这会有所帮助
    • 我应该在 React 库中使用哪个版本的 postcss-loader?我跑了npm install postcss-loader,但在postcss-loader/dist/index.jsloader 函数中出现错误,说this.getOptions is not a function
    【解决方案2】:

    Storybook recommends 从现在开始使用 @storybook/addon-postcss 自定义 postCSS 配置(而不是依赖于自定义 postcss-loader):

    1. 将 postCSS 插件添加到您的安装中

      npm i -D @storybook/addon-postcss     # or
      yarn add -D @storybook/addon-postcss
      
    2. 在项目根目录中创建postcss.config.js

      // postcss.config.js
      module.exports = {
        plugins: {
          tailwindcss: {},
          autoprefixer: {},
        }
      }
      
    3. 将插件添加到您的.storybook/main.js

      // .storybook/main.js
      module.exports = {
        ...
        addons: [
          ...
          {
            name: '@storybook/addon-postcss',
            options: {
              cssLoaderOptions: {
                // When you have splitted your css over multiple files
                // and use @import('./other-styles.css')
                importLoaders: 1,
              },
              postcssLoaderOptions: {
                // When using postCSS 8
                implementation: require('postcss'),
              },
            },
          },
        ],
      };
      
    4. 将你的css文件导入.storybook/preview.js

      // .storybook/preview.js
      import '../src/styles.css';
      

    【讨论】:

    • 由于某种原因这对我不起作用。 FWIW,我正在使用 postcss7,因为这是在 tailwind 的安装页面中推荐的。 ``` SyntaxError (1:1) Unknown word > 1 | var api = require("!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"); | ^ 2 | var content = require("!!../node_modules/css-loader/dist/cjs.js??ref--10-1!../node_modules/postcss-loader/dist/cjs.js!./index. css"); ```
    • Tailwind 需要 PostCSS 8(不是 7),如文档中所述:tailwindcss.com/docs/installation#install-tailwind-via-npm
    • 它不适合我
    • CRA 不支持 PostCSS 8,所以你需要安装一个 postcss 7 兼容版本:tailwindcss.com/docs/guides/create-react-app
    【解决方案3】:

    答案是正确的,但在最新的 CRA 中我必须这样配置:

    config.module.rules.push({
          test: /\.css$/,
          use: [
            {
              loader: "postcss-loader",
              options: {
                // HERE: OPTIONS
                postcssOptions: {
                  plugins: [require("tailwindcss"), require("autoprefixer")],
                },
              },
            },
          ],
          include: path.resolve(__dirname, "../"),
        });
    

    【讨论】:

    • 这在最新的 CRA 中对我不起作用。接受的答案工作正常。
    【解决方案4】:

    类似于 ofhouse 的答案,但如果您不想在几行中使用额外的 postcss.config.js 或者您想在所有内容中使用 typescript(因为加载程序不接收 postcss. config.ts)

    1. 添加官方postCSS插件
    npm i -D @storybook/addon-postcss
    yarn add -D @storybook/addon-postcss
    
    1. 配置 main.ts 和 tailwind.config.ts
    /* .stories/main.ts */
    
    import postcss from 'postcss';
    import * as tailwindcss from '../tailwind.config';
    
    import type { StorybookConfig } from '@storybook/react/types';
    
    export const addons: StorybookConfig['addons'] = [
      // other addons,
      {
        name: '@storybook/addon-postcss',
        options: {
          postcssLoaderOptions: {
            implementation: postcss,
            postcssOptions: {
              plugins: {
                tailwindcss, // or you can nest your options entirely here
                autoprefixer: {
                  // autoprefixer options
                },
              },
            },
          },
        },
      },
    ];
    
    /* tailwind.config.ts */
    
    import type { TailwindConfig } from 'tailwindcss/tailwind-config';
    
    export const theme: TailwindConfig['theme'] = {
      // theme options
    }
    
    // other options
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2021-12-06
      • 2019-08-28
      • 2020-12-11
      • 2020-07-15
      • 2020-08-17
      • 2018-06-09
      • 2020-08-22
      • 2021-11-09
      相关资源
      最近更新 更多