标签: render-to-string

React renderToString()性能和缓存React组件

我注意到reactDOM.renderToString()在服务器上渲染大型组件树时,该方法开始显着减慢.

背景

一点背景.该系统是一个完全同构的堆栈.最高级别的App组件呈现模板,页面,dom元素和更多组件.查看反应代码,我发现它渲染了~1500个组件(这包括任何简单的dom标记,它被视为一个简单的组件,<p>this is a react component</p>.

在开发中,渲染~1500个组件需要大约200-300ms.通过删除一些组件,我能够在~175-225ms内获得~1200个组件.

在生产中,〜1500个组件上的renderToString大约需要50-200ms.

时间似乎是线性的.没有一个组件是慢的,而是它的总和.

问题

这会在服务器上产生一些问题.冗长的方法导致服务器响应时间过长.TTFB比它应该高很多.使用api调用和业务逻辑,响应应该是250ms,但是使用250ms renderToString它会加倍!SEO和用户不好.此外,作为同步方法,renderToString()可以阻止节点服务器并备份后续请求(这可以通过使用2个单独的节点服务器来解决:1作为Web服务器,1作为服务来单独呈现反应).

尝试

理想情况下,生产中需要5-50ms的renderToString.我一直在研究一些想法,但我不确定最好的方法是什么.

想法1:缓存组件

任何标记为"静态"的组件都可以缓存.通过使用呈现的标记保持缓存,renderToString()可以在呈现之前检查缓存.如果找到一个组件,它会自动抓取该字符串.在高级组件中执行此操作将保存所有嵌套子组件的安装.您必须使用当前的rootID替换缓存的组件标记的反应rootID.

想法2:将组件标记为简单/笨

通过将组件定义为"简单",react应该能够在呈现时跳过所有生命周期方法.反应已经这样做了芯反应,DOM组件(<p/>,<h1/>,等).很高兴扩展自定义组件以使用相同的优化.

想法3:在服务器端渲染上跳过组件

服务器上不需要返回的组件(没有SEO值)可以简单地跳过.客户端加载后,设置一个clientLoaded标志true并将其传递给强制重新渲染.

结束和其他尝试

到目前为止,我实现的唯一解决方案是减少服务器上呈现的组件数量.

我们正在研究的一些项目包括:

有人遇到过类似的问题吗?你有什么能做的?谢谢.

performance render-to-string reactjs isomorphic-javascript react-dom

58
推荐指数
3
解决办法
2万
查看次数

Laravel错误:方法Illuminate\View\View :: __ toString()不得抛出异常

你在Laravel工作时见过这个可爱的错误吗?

Method Illuminate\View\View::__toString() must not throw an exception
Run Code Online (Sandbox Code Playgroud)

我已经看过了,这令人非常恼火.我发现了抛出此错误的两个原因.我只想帮助人们不要花费数小时的时间.

查看以下答案和情况.:)

php runtime-error tostring render-to-string laravel

38
推荐指数
2
解决办法
4万
查看次数

如何将变量传递给render_to_string?

尝试执行以下操作

@message = render_to_string ( :sender => sender, :template => "template" )          
Run Code Online (Sandbox Code Playgroud)

但是当在模板中访问@sender时,结果证明是nil:NilClass.如果我传递了正确的变量,请仔细检查,并且完全没问题.也许有其他方法将变量传递给render_to_string?

ruby-on-rails render render-to-string

35
推荐指数
3
解决办法
2万
查看次数

为什么有些浮点数出现后跟0

有谁知道为什么数字0.001到0.009被呈现给一个尾随0的字符串,但其他数字没有.例如,数字0.01到0.09没有.

System.out.println(Locale.getDefault());
for (int i = 0; i <= 20; i++)
    System.out.println(i / 1e3);
Run Code Online (Sandbox Code Playgroud)

版画

en_GB
0.0
0.0010
0.0020
0.0030
0.0040
0.0050
0.0060
0.0070
0.0080
0.0090
0.01
0.011
0.012
0.013
0.014
0.015
0.016
0.017
0.018
0.019
0.02
Run Code Online (Sandbox Code Playgroud)

编辑DecimalFormat的代码似乎不依赖于语言环境.如果我跑

for (Locale l : Locale.getAvailableLocales())   {
    Locale.setDefault(l);
    System.out.println(l + " " + 1 / 1e3);
}
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 11.04上的Java 6更新26上,我得到了

ja_JP 0.0010
es_PE 0.0010
en 0.0010
... many locales with the same result ...
sv_SE 0.0010
da_DK 0.0010
es_HN 0.0010
Run Code Online (Sandbox Code Playgroud)

在我得到的同一系统上的Java 7上

ms_MY …
Run Code Online (Sandbox Code Playgroud)

java floating-point render-to-string

20
推荐指数
1
解决办法
1653
查看次数

render_to_string找不到partials(PDFKit控制器响应)

Ruby 1.8.7,Rails 3.0.4,PDFKit 0.5.0

我正在尝试使用PDFKit创建PDF而不使用中间件,因此我可以禁用javascript(那里有一个手风琴动作,隐藏了大量应该在PDF上的信息).但是,每当我尝试时,它都会失败,因为它表示我的视图(show.html.erb)中的部分缺失:

使用{:locale => [:en,:en],:formats => [:pdf],:handlers => [:erb,:rjs,:builder,:rhtml,:rxml]}缺少部分程序/详细信息

如果我删除对partials的引用,它工作正常.我也尝试将部分与show.html.erb放在同一目录中无济于事.这是我的控制器的show动作中的代码:

respond_to do |format| 
  format.html # show.html.erb 
  format.pdf {
    html = render_to_string(:template => "show.html.erb")
    kit = PDFKit.new(html, :disable_javascript => true )
    send_data(kit.to_pdf, :filename => "test_pdf", :type => "application/pdf", :disposition => 'attachment')
  }
end
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,并保持部分?

编辑:现在我已经这样做了:

# config/initializers/pdfkit.rb
PDFKit.configure do |config|
  config.default_options = {
    :page_size => 'Legal',
    :print_media_type => true,
    :disable_javascript => true
  }
end
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是为我生成的每个PDF都关闭了javascript,但它现在就可以了.关于使部分工作仍然使用render_to_string的原始问题的任何答案仍然受到赞赏.

ruby-on-rails pdfkit render-to-string

12
推荐指数
1
解决办法
9129
查看次数

如何简化Rails 3中的"render_to_string"?

要在Rails 3中渲染部分,我会:

render 'my_partial', :my_object => my_value
Run Code Online (Sandbox Code Playgroud)

为了获得部分结果作为字符串我做:

render_to_string(:partial => 'my_partial', :layout => false, 
                 :locals => {:my_object => my_value})
Run Code Online (Sandbox Code Playgroud)

这可能写得最短吗?(例如,省略:partial:locals喜欢我这样做render)(我试过,但得到错误...)

ruby-on-rails render render-to-string ruby-on-rails-3

12
推荐指数
1
解决办法
2万
查看次数

如何在 Nuxt 3 Vite 项目中使用 SSR 和 Stencil?

在 Nuxt 2 中,我可以通过利用 Stencil 包中提供的 renderToString() 方法并结合 Nuxt 钩子来使用服务器端渲染的 Stencil 组件,如下所示:

import { renderToString } from '[my-components]/dist-hydrate'

export default function () {
  this.nuxt.hook('generate:page', async (page) => {
    const render = await renderToString(page.html, {
      prettyHtml: false
    })
    page.html = render.html
  })
}
Run Code Online (Sandbox Code Playgroud)

自从Stencil 2.16.0最近发布以来,我能够在由 Vite 提供支持的 Nuxt 3 中使用本机 Web 组件。然而我还没有找到一种方法来连接模板水合过程。不幸的是,还没有关于可组合useHydration()的文档。

有谁知道我如何让它在 Nuxt 3 中工作?

render-to-string server-side-rendering stenciljs vite nuxtjs3

11
推荐指数
1
解决办法
2116
查看次数

不能使用django的render_to_string对单引号(&#39;)进行编码

我有一个django的render_to_string和编码单引号的问题.

... = render_to_string('dummy.txt', {'request':request, 'text':text,}, context_instance=RequestContext(request)))
Run Code Online (Sandbox Code Playgroud)

为什么只有这些引号翻译成'#39;' 和所有其他特殊字符不?

django unicode quotes render-to-string

6
推荐指数
1
解决办法
4685
查看次数

var_export到string

我在$output字符串中有一个HTML代码,这个代码由两个术语分隔:-startMiniPreview--endMiniPreview-.我需要将这两个术语包含在一起并将其保存在另一个字符串变量中.这是我认为这样做的正确方法,但它根本不起作用.该HTMLCODE部件成功导出但不是字符串

    $output="-startMiniPreview-HTMLCODE-endMiniPreview-EXTRA";
    preg_match( '/\-startMiniPreview-(.*?)\-endMiniPreview/', $output,$vt);
    $cutOut=strval(var_export($vt[1]));
Run Code Online (Sandbox Code Playgroud)

php string render-to-string

6
推荐指数
1
解决办法
9161
查看次数

如何使用 render_to_string 在 lib ruby​​ 类中渲染部分内容

我正在为 Liquid 编写一个自定义标签,并希望在标签中渲染部分内容。我假设我必须使用 render_to_string 但我似乎无法让它工作。

我尝试过各种各样的事情,包括:

ActionController::Base.render_to_string(:partial => 'path/to/partial') 
Run Code Online (Sandbox Code Playgroud)

但似乎没有任何作用。必须有一些我缺少的简单方法来做到这一点。

提前致谢。

ruby ruby-on-rails liquid render-to-string

5
推荐指数
1
解决办法
1823
查看次数

render_to_string rails 3.1

我试试这个:

:content => render_to_string(:template =>"#{path [:controller]} /#{path [:action]}.html.haml")

在我的json,但我使用kaminari分页页面,并收到此错误:

ActionView :: Template :: Error(缺少部分kaminari/paginator {{handlers => [:erb,:builder,:coffee,:haml],:formats => [:json],:locale => [:en, :EN]}.

有谁知道我如何解决这个问题?

render-to-string rails-3.1

5
推荐指数
0
解决办法
840
查看次数

Android:将 XML 从原始文件夹转换为字符串

我遇到了一个让我发疯的问题 xD ...(首先:大家好!出于某种原因,我不能在编辑 oO 的帖子开头加上“大家好”...)

用例如下:我在项目的原始文件夹中存储了一个 xml 文件。xml 文件如下所示:

<myxml ....>Some text<innerelement ... /></myxml>
Run Code Online (Sandbox Code Playgroud)

我知道有一个名为 xml 的文件夹,但我需要的是一个字符串 - 而不是 XmlResourceParser(您在调用 context.getResources().getXml(id) 时获得)。

现在,我加载这个原始 xml 文件的方法是:

context.getResources().openRawResource(R.raw.myfile)
Run Code Online (Sandbox Code Playgroud)

这将返回一个 InputStream,然后我尝试使用以下代码将其转换为 String:

try {
   byte[] buffer = new byte[stream.available()];
   stream.read(buffer);
   stream.close();
   return new String(buffer);
} catch (IOException e) {
   // Error handling
}
Run Code Online (Sandbox Code Playgroud)

如果我现在将结果字符串打印到 logcat,我得到的只是一堆正方形,分布在几行中。

所以我想我一定在那里遗漏了一些东西......我已经尝试了几种将此输入流转换为 String 的方法,并且所有这些方法最终都得到了相同的结果(见上图)......

提前致谢并致以最诚挚的问候,

扎伊诺迪斯

2011 年 11 月 12 日更新

我尝试使用扩展名 .txt 而不是 .xml 将 xml 文件保存在原始文件夹中。现在转换失败,出现 OutOfMemory 异常 oO。我尝试了不同的方法来使用来自该线程的建议来转换数据- 所有这些都导致了 OutOfMemoryException:

11-12 06:09:22.671: I/TestRunner(652): …
Run Code Online (Sandbox Code Playgroud)

java xml android render-to-string

3
推荐指数
1
解决办法
4607
查看次数

Rails render_to_string

我在使用rails render_to_string函数时遇到困难。我已经使用--api标志创建了一个应用程序,因此我认为这可能是个问题,因为我已经在“完整”的Rails应用程序中对其进行了测试,并且效果很好。

本质上我在打电话:

body_html = render_to_string(template: 'reservations/print')
Run Code Online (Sandbox Code Playgroud)

我也尝试过

body_html = render_to_string('reservations/print')
body_html = render_to_string(partial: 'reservations/print')
body_html = render_to_string(partial: 'reservations/print.html.erb')
Run Code Online (Sandbox Code Playgroud)

这应该返回该模板的html。文件名是print.html.erb,只有基本数据,即

<p> Hello world. </p>
Run Code Online (Sandbox Code Playgroud)

当我输出body_html时,它为空。

我引用了这个SO问题,在pdf格式中render_to_string的正确方法是什么?并且还将使用Wicked PDF生成pdf文件。

非常感谢

ruby-on-rails render-to-string

3
推荐指数
1
解决办法
5984
查看次数