我正在使用Next.js和React-Native-Web。我设法按照官方的Next.js示例一起运行它们,但当我试图从react-native使用Animated包时,它失败了,错误是requestAnimationFrame未定义。基本上,此功能会执行node_modules包,但我在webpack中设置别名以将所有 react-native 要求转换为 react-native-web 所以即使是node_modules包也应该使用react-native-web。
有什么解决办法吗?
ReferenceError: requestAnimationFrame is not defined
at start (...node_modules\react-native-web\
dist\cjs\vendor\react-native\Animated\animations\TimingAnimation.js:104:11)
enter code here
字符串
x1c 0d1x的数据
感谢您的任何帮助!
3条答案
按热度按时间soat7uwm1#
这个问题是在服务器上丢失了RequestAnimationFrame功能。这个错误发生在Next.js尝试在SSR期间渲染组件时。不幸的是,没有polyfill等用于此目的,所以我决定使用Next.js动态导入具有动画功能的组件。
Next.js Official documentation
我自己的案例只是展示代码的外观:
字符串
现在您可以使用 AutocompleteDropdown 作为标准JSX组件
anauzrmj2#
我正在用React Native Web和NextJS 12编写一个应用程序,在2021年我遇到了这个问题并修复了它,但现在我知道我的修复只针对Next Dev,因为它返回了Next Production Build。
解决方案详情:
需要注意的是,webpack 5的
next.config.js
在到达下一个入口点_documents.js
和_app.js
之前会首先检查代码。这意味着,您可以将polyfill放入这些入口点文件中,它仍然会引发RAF未定义的错误。您必须使requestAnimationFrame
准备好进行配置检查。开发方法,将工作在下一个开发只。安装RAF包https://www.npmjs.com/package/raf和在
next.config.js
添加代码:字符串
如果
global
和window
对象没有requestAnimationFrame
和cancelAnimationFrame
函数,则会将其添加到global
和window
对象中。在我们的示例中,它会将其添加到NodeJS的global
中。但是这个解决方案在执行
npm run dev
时不起作用。我不知道为什么,如果有人知道为什么Next或Webpack 5从DEV到Production的行为不同,请告诉我。完整解决方案:
使用webpack 5 https://webpack.js.org/plugins/provide-plugin/的ProvidePlugin配置。在根项目或任何你想要的地方创建一个文件作为模块使用,比如:
raf.js
:型
在
next.config.js
中,在webpack: () = {}
中使用它,如下所示:型
现在,你可以调整你现有的配置逻辑了。通过这样做,在生产构建中,NextJS在服务器端注入了
requestAnimationFrame
函数,无论模块在哪里使用它。wa7juj8i3#
Expo Web +复活解决方案
谢谢@KeitelDOG让我上路。
您应该
npm install raf
(requestAnimationFrame polyfill)和将这两行添加到根文件夹中的metro.config.js
。默认情况下,metro.config.js
不存在,因此您可能需要创建它。字符串