Rollup Error: 'isValidElementType' is not exported by node_modules/react-is/index.js
Rollup Error: 'isValidElementType' is not exported by node_modules/react-is/index.js
我正在使用 styled-components 构建一个带有 rollUp 的包。
我的 rollup.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 是一个 commonjs 模块,因为它也可以检查 here。
commonjs 插件不应该处理它吗,因为它在 node_modules/** 里面?
谢谢。
我使用 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
完成的
希望对你有用
上面的修复对我不起作用。但是,将 styled-components
添加到 rollup.config.js
外部变量和全局变量列表对我有用。
export default {
...
external: ['styled-components'],
...
globals: { 'styled-components': 'styled' },
};
我正在使用 typescript create-react-library cli,它与 rollup 捆绑在一起。
https://github.com/styled-components/styled-components/issues/930
FrostyDog 发布的解决方案对我有用,所以为此 +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
}),
...
]
};
为我和之后添加到项目中的每个人解决了这个问题。
这是 2022 年的更新答案。
我 运行 使用 vitejs 进入此错误,它使用 rollup 进行生产 builds/bundling。
我已经包含了 rollup 和 vite 项目的解决方案。
关于旧答案和文档的注释
在 Internet 上的文档和论坛中,仍然有很多引用 rollup-plugin-commonjs
和 namedExports
的旧评论。
rollup-plugin-commonjs
的最后一个版本是 v10.1.0
于 2019-08-27
rollup-plugin-commonjs
已于 2019-12-21 v11.0.0
重命名为 @rollup/plugin-commonjs
namedExports
已于 2020 年 6 月 5 日从 @rollup/plugin-commonjs@v13.0.0
中删除
所以任何涉及 rollup-plugin-commonjs
或 namedExports
的内容都是 过时的 并且与 rollup
或 [=19] 的当前版本无关=].
为什么我们会收到此错误
很多 React 库都会发生此错误,因为它们使用动态 require(...)
语句在开发源文件和生产源文件之间进行选择。
我在这个例子中使用 react
,但在 react-dom
和 react-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'
.[= 这样的错误的原因38=]
解决方案
1.将库设为外部
最简单的解决方案是将这些库标记为 external
,这意味着它们不会包含在捆绑包中,也不会被汇总处理。
这还可以减小捆绑包的大小并避免多次意外捆绑这些库。
您需要确保任何外部库在运行时都可以在页面上使用。
2。使用别名手动解析文件
如果您确实需要在您的包中包含 React,请使用此选项。
$ npm install @rollup/plugin-alias --save-dev
- 在
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
环境变量来控制 production/development 构建
- 我正在为
umd
反应文件添加别名;如果您需要指向 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()],
};
});
我正在使用 styled-components 构建一个带有 rollUp 的包。
我的 rollup.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 是一个 commonjs 模块,因为它也可以检查 here。
commonjs 插件不应该处理它吗,因为它在 node_modules/** 里面?
谢谢。
我使用 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
完成的希望对你有用
上面的修复对我不起作用。但是,将 styled-components
添加到 rollup.config.js
外部变量和全局变量列表对我有用。
export default {
...
external: ['styled-components'],
...
globals: { 'styled-components': 'styled' },
};
我正在使用 typescript create-react-library cli,它与 rollup 捆绑在一起。
https://github.com/styled-components/styled-components/issues/930
FrostyDog 发布的解决方案对我有用,所以为此 +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
}),
...
]
};
为我和之后添加到项目中的每个人解决了这个问题。
这是 2022 年的更新答案。
我 运行 使用 vitejs 进入此错误,它使用 rollup 进行生产 builds/bundling。
我已经包含了 rollup 和 vite 项目的解决方案。
关于旧答案和文档的注释
在 Internet 上的文档和论坛中,仍然有很多引用 rollup-plugin-commonjs
和 namedExports
的旧评论。
rollup-plugin-commonjs
的最后一个版本是v10.1.0
于 2019-08-27rollup-plugin-commonjs
已于 2019-12-21v11.0.0
重命名为@rollup/plugin-commonjs
namedExports
已于 2020 年 6 月 5 日从@rollup/plugin-commonjs@v13.0.0
中删除
所以任何涉及 rollup-plugin-commonjs
或 namedExports
的内容都是 过时的 并且与 rollup
或 [=19] 的当前版本无关=].
为什么我们会收到此错误
很多 React 库都会发生此错误,因为它们使用动态 require(...)
语句在开发源文件和生产源文件之间进行选择。
我在这个例子中使用 react
,但在 react-dom
和 react-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'
.[= 这样的错误的原因38=]
解决方案
1.将库设为外部
最简单的解决方案是将这些库标记为 external
,这意味着它们不会包含在捆绑包中,也不会被汇总处理。
这还可以减小捆绑包的大小并避免多次意外捆绑这些库。
您需要确保任何外部库在运行时都可以在页面上使用。
2。使用别名手动解析文件
如果您确实需要在您的包中包含 React,请使用此选项。
$ npm install @rollup/plugin-alias --save-dev
- 在
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
环境变量来控制 production/development 构建 - 我正在为
umd
反应文件添加别名;如果您需要指向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()],
};
});