Node/Rect:在服务器上渲染时如何处理jQueryAJAX
Node/React: How to handle jQuery AJAX when rendering on server?
我在Node/Express中有一个小的Web应用程序,它用react dom渲染初始HTML服务器端。然后在客户端使用对componentDidMount
内的API的$.ajax
调用来填充页面。HTML会立即加载,但在React启动并完成GET之前,没有任何有用的内容。
这是浪费。最好在渲染初始HTML时使用API。但是我不知道有什么干净的方法来实现这一点。似乎我可以通过使用存根get
方法在节点中声明一个全局$
来获得我想要的,但这感觉很糟糕。
在呈现React组件服务器端时,如何实现$.ajax
该代码在Github上是公开的。这是一个带有$.get
的组件,这是我的API。
- componentDidMount不在服务器上运行,它只在客户端运行第一次渲染,因此ajax请求永远不会在服务器上发生。你应该用静态方法(还有其他方法)
- 如果您选择超级代理或axios会更好,它们可以在客户端和服务器端发出ajax请求
- 然后,您必须将ajax请求的结果作为全局变量的初始状态
最好你关注一些回购,比如:
请参阅https://github.com/erikras/react-redux-universal-hot-example
下面是我解决这个问题的方法。
- 将我的ajax从componentDidMount中移出,以便在服务器上呈现初始HTML时调用
-
在Node中用直接调用路由器的
get
方法声明了我自己的全局$
。这就是它的样子:global.$ = { get: (url, cb) => { const req = {url: url}; const res = { send: data => cb(data), status: () => { return {send: data => cb(data)}; } }; return api_router(req, res); } };
一些注意事项
- 如果这对你来说是一个有问题的黑客,那没关系。对我来说也是一个有疑问的黑客。我仍然愿意接受建议
- @persistent-loop建议用同时适用于服务器和客户端的模块替换jQuery的AJAX,这是解决这个问题的好方法。对于大多数人,我会推荐这种方法。我选择不这样做,因为仅仅通过网络调用代码中相邻的路由处理程序似乎很浪费。可以通过一个新奇的nginx配置来减少浪费,该配置将出站API调用重定向回同一个框,而无需往返。我正在考虑这个问题
- 从那以后,我了解到将jQuery与React一起使用可能会导致问题。我以后会用别的东西代替它
- 对于大多数用例来说,将AJAX保留在componentDidMount中并在没有AJAX的情况下加载初始HTML仍然是有意义的。这样,到第一个字节的时间就尽可能短。从restful API加载的东西类型通常不需要SEO,用户习惯于多等几毫秒(Facebook也会这样做)
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 提示使用服务器端事件处理程序激活JavaScript
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何编写一个具有公共标头的批处理
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 如何处理node.js节点mongodb中的连接和查询队列
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何处理10页以上的静态页眉/页脚
- 将事件处理程序绑定到任何可能的事件
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- python到“;流“;字典处理
- 使用javascript进行实时图像处理
- 导入jQuery脚本获胜'我不处理html文件
- Javascript无法处理表单提交
- JavaScript 任务调度程序(批处理处理)
- RegEx在VBA和JavaScript中的处理方式有何不同?