我可以在不重新加载浏览器的情况下编辑 React 组件吗?

Posted

技术标签:

【中文标题】我可以在不重新加载浏览器的情况下编辑 React 组件吗?【英文标题】:Can I edit React components without reloading the browser? 【发布时间】:2014-09-16 16:10:21 【问题描述】:

如果 React 提供 DOM 协调,是否可以在我编辑后动态重新加载组件的代码并重新渲染它

我正在寻找一种解决方案,它允许我编辑 JSX 文件、保存它并让组件在浏览器中自行更新,而无需重新加载页面、卸载页面或丢失其状态。

理想情况下,这应该在没有浏览器插件的情况下工作。

【问题讨论】:

【参考方案1】:

您可以使用 react-hot-loader,这是一个插入式 Webpack 加载程序,可以在您的项目中实时编辑 React 组件。无需浏览器插件或 IDE 挂钩。

它将 Webpack Hot Module Replacement (HMR) 与 React 结合起来。

您可以在以下情况下使用它:

您的 React 组件没有令人讨厌的副作用; 您愿意为模块切换到 Webpack(切换不难,see the walkthrough); 您有几个小时的空闲时间(如果您已使用 Webpack,则为几分钟)。

它是如何工作的:

它使用 Webpack HMR API 来了解“模块更新可用”事件。 它将React.createClass 调用更改为store the component's prototype and later update it with fresh version 的特殊createClassupdateClass 函数; 当所有原型都更新后,它会调用forceUpdate 重新渲染组件。

有一个demo video、一个explanatory blog post和一个React tutorial app fork with live-edit configured

而且都是普通的 JS。

【讨论】:

你可以用丹的方式用 Webpack 来做。如果您正在使用 RequireJS / AMD 并想开始使用 React,我为 RequireJS + React 创建了一个 DIY 热重载解决方案,请参阅我的答案【参考方案2】:

你可以,我创建了一个示例项目,演示如何使用 ES5 和 RequireJS 为自己创建这些设施 - 它适用于 React 和 Backbone - 只要你使用 AMD,它可能适用于 Angular 和 Ember 等模块和 RequireJS。

以下是所有信息: https://medium.com/@the1mills/hot-reloading-with-react-requirejs-7b2aa6cb06e1

基本步骤是:

    gulp.js 观察者监听文件系统变化

    gulpfile 中的 socket.io 服务器向所有浏览器客户端发送一条消息,其中包含更改的文件路径

    客户端删除代表该文件/模块的缓存,并重新请求它(使用 AJAX 从服务器文件系统中提取它)

    前端应用程序配置/设计为 重新评估所有对它希望的模块的引用 hot-reload,在这种情况下,只有 JS 视图、模板和 CSS 是 可用于热重载 - 路由器、控制器、数据存储 尚未配置。我确实怀疑所有文件都可以热重新加载,唯一的例外是数据存储。

您可以在此处查看示例项目: https://github.com/ORESoftware/hr4R

但我建议先阅读上面的文章。

与使用 Babel/ES6 和 React-Hot-Loader 相比,这是一种更简单的 DIY 热重载实现。

Webpack 最初并不是为热重载而设计的——如果是的话,热重载将不再是一项实验性功能,也不会像目前那样使用轮询来查看文件系统差异(参见我的文章)。

RequireJS / AMD 规范基本上是为热重载而制定的,如果您考虑一下的话。

【讨论】:

以上是关于我可以在不重新加载浏览器的情况下编辑 React 组件吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新整个页面的情况下重新加载组件?

Stack Overflow 如何在不重新加载页面的情况下通知服务器端事件?我在 Firebug 中没有看到任何请求

如何保存 html 画布,然后在不丢失形状的情况下重新加载它?

如何在不刷新页面的情况下在 ReactJS 中重新加载?

如何在不重新加载的情况下更改浏览器栏网址

如何在不重新加载页面的情况下更改 URL?