汇总错误:NODE_MODULES/REACT-IS/index.js未导出‘isValidElementType’

w46czmvw  于 2022-10-15  发布在  React
关注(0)|答案(6)|浏览(248)

我正在使用样式化组件构建一个带有ROLLUP的包。
我的Rolup.config.js如下所示:

import resolve from 'rollup-plugin-node-resolve'
import babel from 'rollup-plugin-babel'
import commonjs from 'rollup-plugin-commonjs'
export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'cjs'
  },
  external: [
    'react',
    'react-proptypes'
  ],
  plugins: [
    resolve({
      extensions: [ '.js', '.json', '.jsx' ]
    }),
    commonjs({
      include: 'node_modules/**'
    }),
    babel({
      exclude: 'node_modules/**'
    })
  ]
}

我收到了

[!] Error: 'isValidElementType' is not exported by node_modules/react-is/index.js
https://github.com/rollup/rollup/wiki/Troubleshooting#name-is-not-exported-by-module
node_modules/styled-components/dist/styled-components.es.js (7:9)
5: import stream from 'stream';
6: import PropTypes from 'prop-types';
7: import { isValidElementType } from 'react-is';
            ^
8: import hoistStatics from 'hoist-non-react-statics';

检查NODE_MODULES本身REACT-IS是一个常见的模块,因为它也可以 checkout here
既然它在node_MODULES/**中,那么Common onjs插件不应该处理它吗?
谢谢。

azpvetkf

azpvetkf1#

我使用rollup-plugin-commonjs解决了这个问题
并在汇总配置中手动定义导出,如下所示

export default {
  input: 'src/index.js',
  output: [
    {
      file: pkg.main,
      format: 'cjs',
      sourcemap: true
    },
    {
      file: pkg.module,
      format: 'es',
      sourcemap: true
    }
  ],
  plugins: [
    external(),
    postcss({
      modules: true
    }),
    url(),
    babel({
      exclude: 'node_modules/**'
    }),
    resolve(),
    commonjs({
      include: 'node_modules/**',
      namedExports: {
        'node_modules/react-is/index.js': ['isValidElementType']
      }
    })
  ]
}

在这之后,一切都很顺利。
对于信息,我的初始设置是通过https://github.com/transitive-bullshit/react-modern-library-boilerplate完成的
希望它对你有用

fkaflof6

fkaflof62#

上面的修复方法对我不起作用。然而,将styled-components添加到rollup.config.js的外部变量和全局变量列表中对我来说很管用。

export default {
      ...
      external: ['styled-components'],
      ...
      globals: { 'styled-components': 'styled' },
    };

我使用的是与ROLLUP捆绑在一起的打字稿create-react-library cli。
https://github.com/styled-components/styled-components/issues/930

eoigrqb6

eoigrqb63#

FroestDog发布的解决方案对我很有效,所以+1。
当我尝试从react导入钩子时,我立即得到了相同的错误,我可以按照上面的解决方案进行操作

export default {
      ...
      external: ['styled-components', 'react'],
      ...
    };

rollup.config.js中,但是我想要一个为所有库处理这个问题的解决方案,所以这个问题在将来不会反复出现。
所以就这么做了.

import external from "rollup-plugin-peer-deps-external";
...
export default {
    ...
    plugins: [
        external({
            includeDependencies: true
        }),
        ...
    ]
};

为我和后来加入项目的每个人解决了这个问题。

tf7tbtn2

tf7tbtn24#

以下是2022年的最新答案。
我在使用vitejs时遇到了这个错误,它使用ROLLUP进行生产构建/捆绑。
我已经包括了一个汇总和VITE项目的解决方案。

关于旧答案和文档的说明

在互联网上的文件和论坛中,仍然有很多关于rollup-plugin-commonjsnamedExports的旧评论。

  • 上一次发布rollup-plugin-commonjs是在2019/08/27年
  • rollup-plugin-commonjs在2019/12/21年重命名为@rollup/plugin-commonjsv11.0.0
  • namedExports在2020-06-05年度从@rollup/plugin-commonjs@v13.0.0中删除

因此,任何涉及rollup-plugin-commonjsnamedExports的内容都是过时的,与rollup@rollup/plugin-commonjs的当前版本无关。

为什么会出现这个错误

这个错误发生在许多Reaction库中,因为它们使用动态require(...)语句在开发和生产源文件之间进行选择。
我在本例中使用的是react,但它在react-domreact-is中的概念相同。

// node_modules/react/index.js

if (process.env.NODE_ENV === 'production') {
  module.exports = require('./cjs/react.production.min.js');
} else {
  module.exports = require('./cjs/react.development.js');
}

当ROLLUP处理这个文件时,它不能确定导出来自另一个文件,所以看起来导出是空的,这就是为什么我们收到类似'useState' is not exported by 'node_modules/react/index.js'的错误。

解决方案

1.将库设为外部

最简单的解决方案是将这些库标记为external,这意味着它们不会包含在包中,也不会被ROLLUP处理。这还可以减小捆绑包的大小,并避免意外地多次捆绑这些库。
您需要确保任何外部库在运行时都可以在页面上使用。

2.使用别名手动解析文件

如果确实需要在捆绑包中包含Reaction,请使用此选项。
1.安装@Rolup/plugin-alias

$ npm install @rollup/plugin-alias --save-dev

1.在rollup.config.js中配置别名。

// rollup.config.js
import alias from '@rollup/plugin-alias';
import * as _path from 'path';

const isProduction = process.env.NODE_ENV === 'production';

/*
Define any path here that triggers the "is not exported" error

This is not needed if the react libraries are marked as `externals` and excluded from the bundle.
This is only an needed because we**want**react to be included in the bundle.

* /

let pathReact = 'umd/react.production.min.js';
let pathReactDom = 'umd/react-dom.production.min.js';
let pathReactJsx = 'cjs/react-jsx-runtime.production.min.js';
if (!isProduction){
  pathReact = 'umd/react.development.js';
  pathReactDom = 'umd/react-dom.development.js';
  pathReactJsx = 'cjs/react-jsx-dev-runtime.development.js';
}

module.exports = {
  input: 'src/index.js',
  output: {
    dir: 'output',
    format: 'cjs'
  },
  plugins: [
    alias({
      entries: [
        {
          find: /^react$/,
          replacement: require.resolve(_path.join('react', pathReact)),
        },
        {
          find: /^react-dom$/,
          replacement: require.resolve(_path.join('react-dom', pathReactDom)),
        },
        {
          /*
          2022-03-11
          https://github.com/vitejs/vite/issues/6215#issuecomment-1064247764
          */
          find: /react\/jsx-runtime/,
          replacement: require.resolve(_path.join('react', pathReactJsx)),
        },
      ]
    })
  ]
};

注:

  • 这假设您使用NODE_ENV环境变量来控制生产/开发版本
  • 我为umdReact文件设置了别名;如果需要指向cjs版本,则根据需要调整别名路径

Vitejs版本

以下是vitejs项目的等效配置:

// vite.config.ts
import * as _path from "path";
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

// https://vitejs.dev/config/
export default defineConfig((env) => {
  // mode: 'production' | 'development'
  const mode = env.mode;

  /**
   * Fix build messages/errors like: `'useState' is not exported by 'node_modules/react/index.js'`
   */
  let pathReact = "umd/react.production.min.js";
  let pathReactDom = "umd/react-dom.production.min.js";
  let pathReactJsx = "cjs/react-jsx-runtime.production.min.js";
  if (mode === "development") {
    pathReact = "umd/react.development.js";
    pathReactDom = "umd/react-dom.development.js";
    pathReactJsx = "cjs/react-jsx-dev-runtime.development.js";
  }

  return {
    resolve: {
      alias: [
        // react alias fix
        {
          find: /^react$/,
          replacement: require.resolve(_path.join("react", pathReact)),
        },
        {
          find: /^react-dom$/,
          replacement: require.resolve(_path.join("react-dom", pathReactDom)),
        },
        {
          /*
          2022-03-11
          https://github.com/vitejs/vite/issues/6215#issuecomment-1064247764
          */
          find: /react\/jsx-runtime/,
          replacement: require.resolve(_path.join("react", pathReactJsx)),
        },
        // End react alias fix
      ],
    },
    plugins: [react()],
  };
});
2ul0zpep

2ul0zpep5#

我在构建时遇到以下问题:

Error: 'typeOf' is not exported by ../../node_modules/react-is/index.js, imported by ../../node_modules/styled-components/dist/styled-components.esm.js
1: import { typeOf as e, isElement as t, isValidElementType as n } from "react-is";

可以在ROLLUP COMMONJS配置中使用以下代码:

plugins: [
...
...
...    
commonjs({
      ignoreGlobal: true,
      include: /\/node_modules\//,
      namedExports: {
        react: Object.keys(require("react")),
        "react-is": Object.keys(require("react-is")),
      },
    }),
...
]

此代码解决了生成项目时发生的Reaction-is导入错误。阅读更多信息的参考:https://github.com/styled-components/styled-components/issues/3256#issuecomment-694144760

zbsbpyhn

zbsbpyhn6#

export default {
    ...
    external: ['react', 'react-dom', 'styled-components'],
    globals: { 'styled-components': 'styled' },
    plugins: [
        external({
            includeDependencies: true
        }),
        ...
    ]
};

相关问题