You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Chakra UI集成Storybook时fs模块报错求助

问题描述

我使用React 17.0.2、Chakra UI和Storybook 6.5.15开发组件库,未使用create-react-app。开发过程中遇到Node核心模块(如fs)无法解析的错误,尝试在Storybook的main.js中配置Webpack 5的fallback:

webpackFinal: (config) => {
   config.resolve.fallback.fs = false;
   config.resolve.fallback.module = false;
   config.resolve.fallback.os = false;
    
    return config;
  },

但展示组件Story时出现如下错误:

TypeError: fs[fsStatType] is not a function
    at isTypeSync (http://localhost:6006/vendors-node_modules_chakra-ui_layout_dist_chakra-ui-layout_esm_js-node_modules_chakra-ui_spi-d8af64.iframe.bundle.js:116363:24)
    at getDirectorySync (http://localhost:6006/vendors-node_modules_chakra-ui_layout_dist_chakra-ui-layout_esm_js-node_modules_chakra-ui_spi-d8af64.iframe.bundle.js:82082:61)
    at ExplorerSync.searchSync (http://localhost:6006/vendors-node_modules_chakra-ui_layout_dist_chakra-ui-layout_esm_js-node_modules_chakra-ui_spi-d8af64.iframe.bundle.js:81910:63)

我的package.json开发依赖如下:

"devDependencies": {
"@babel/cli": "^7.20.7",
"@babel/core": "^7.20.12",
"@babel/preset-env": "^7.20.2",
"@babel/preset-react": "^7.18.6",
"@chakra-ui/react": "^1.7.1",
"@chakra-ui/storybook-addon": "^4.0.16",
"@emotion/react": "^11.1.5",
"@emotion/styled": "^11.1.5",
"@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-commonjs": "^24.0.0",
"@rollup/plugin-node-resolve": "^15.0.1",
"@rollup/plugin-typescript": "^10.0.1",
"@storybook/addon-actions": "^6.5.15",
"@storybook/addon-essentials": "^6.5.15",
"@storybook/addon-interactions": "^6.5.15",
"@storybook/addon-links": "^6.5.15",
"@storybook/builder-webpack5": "^6.5.15",
"@storybook/manager-webpack5": "^6.5.15",
"@storybook/react": "^6.5.15",
"@storybook/testing-library": "0.0.13",
"@types/react": "^18.0.26",
"babel-loader": "^8.3.0",
"base64-arraybuffer": "^1.0.2",
"cross-fetch": "^3.1.5",
"crypto": "^1.0.1",
"framer-motion": "^6.5.0",
"jest-fetch-mock": "^3.0.3",
"js-cookie": "^3.0.1",
"jwt-decode": "^3.1.2",
"nanoid": "^4.0.0",
"njwt": "^1.2.0",
"node-polyfill-webpack-plugin": "^2.0.1",
"npm-run-all": "^4.1.5",
"randomstring": "^1.2.3",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"rollup": "^3.9.1",
"rollup-plugin-delete": "^2.0.0",
"rollup-plugin-dts": "^5.1.0",
"rollup-plugin-peer-deps-external": "^2.2.4",
"tslib": "^2.4.1",
"typescript": "^4.9.4",
"webpack": "^5.75.0"}

我曾尝试添加NodePolyfillPlugin到Webpack配置,但仍出现fs相关错误,推测该插件无fs的fallback;尝试添加别名指向Node模块,却找不到可用的fs npm包(似乎已废弃)。请问有解决该问题的方案吗?

解决方案

方案1:提供fs的Mock实现

不要直接将fs设为false,而是提供一个包含代码所需方法的Mock对象,避免调用不存在的方法报错。

方法A:使用现成的Mock包

先安装mock-fs依赖:

npm i mock-fs --save-dev

修改Storybook的main.js配置:

webpackFinal: (config) => {
  config.resolve.fallback = {
    ...config.resolve.fallback,
    fs: require.resolve('mock-fs'),
    module: false,
    os: require.resolve('os-browserify/browser') // 补充os的浏览器兼容实现
  };
  return config;
},

方法B:自定义极简Mock

在项目根目录创建fs-mock.js:

module.exports = {
  statSync: () => ({ isDirectory: () => false }),
  // 根据后续错误提示,补充其他被调用的fs方法
};

修改Storybook的main.js:

const path = require('path');

webpackFinal: (config) => {
  config.resolve.fallback = {
    ...config.resolve.fallback,
    fs: path.resolve(__dirname, './fs-mock.js'),
    module: false,
    os: require.resolve('os-browserify/browser')
  };
  return config;
},

方案2:修复Chakra UI依赖问题

从错误栈来看,问题源于@chakra-ui/layout和@chakra-ui/spi在浏览器环境中调用了Node的fs模块,这属于依赖包的环境适配问题。

  • 尝试升级Chakra UI到v2.x版本,旧版本可能存在浏览器环境下误引入Node模块的bug,升级后同步更新@chakra-ui/storybook-addon到对应版本。
  • 检查组件代码,确认是否错误引入了仅适用于Node环境的Chakra功能。

方案3:用Webpack IgnorePlugin忽略不必要的模块

如果确认fs是被第三方包误引入且实际不需要,可通过IgnorePlugin跳过相关模块的打包:

const webpack = require('webpack');

module.exports = {
  // ...其他Storybook配置
  webpackFinal: (config) => {
    config.plugins.push(
      new webpack.IgnorePlugin({
        resourceRegExp: /^fs$/,
      })
    );
    config.resolve.fallback.module = false;
    config.resolve.fallback.os = require.resolve('os-browserify/browser');
    return config;
  },
};

注意:此方法仅适用于确认fs未被实际使用的场景,否则会导致正常功能报错。

方案4:调整Rollup组件库打包配置

作为组件库开发,Rollup的配置也会影响产物的兼容性。确保@rollup/plugin-node-resolve配置正确:

import { nodeResolve } from '@rollup/plugin-node-resolve';

export default {
  // ...其他Rollup配置
  plugins: [
    nodeResolve({
      browser: true, // 优先使用包的浏览器适配版本
      preferBuiltins: false, // 不优先使用Node内置模块
    }),
    // ...其他插件
  ],
};

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:00:45