淘汰JS和大型模型

Ale*_*aga 5 javascript performance knockout.js

我想弄清楚使用KnockoutJS的最佳方法,我需要你的建议.

我的视图模型包含一组"文档",每个文档都有一组"值".使用以下模板将每个"文档"呈现为单独的表:

<div data-bind="foreach: Documents">
        <table data-bind="foreach: Values">
            <tr data-bind="foreach: $data">
                 <td data-bind="attr: {colspan: Colspan}">
                    <label data-bind="text: Label"></label>
                    <br />
                    <span data-bind="html: Value"></span>
                </td>
            </tr>
        </table>
</div>
Run Code Online (Sandbox Code Playgroud)

一切都很好,除非视图模型很大.

例如,如果视图模型的大小约为1兆字节(并且包含80个文档,每个文档包含60个值),则在我的计算机上渲染需要两分多钟.

我想知道是否有一种方法可以显着提高性能...或者放弃Knockout并在服务器端构建html并将其推送到浏览器会更快...

渲染"仅"300kb视图模型需要接近30秒.

"文档"由用户定义,因此甚至有> 2兆字节的场景(我不知道他们为什么这样做).

有没有人有JavaScript大视图模型的经验?

Lou*_*cci 2

由于您当前的要求是无法延迟加载(按需加载)数据,因此您的能力非常有限。

服务器端 HTML

在服务器端生成 HTML 将是最快的方法。但即便如此,如果模型很大,也会有延迟。考虑下载一个 5MB 的 HTML 文件,您的浏览器将花费一些时间来解析和渲染如此大的文件。

仍然使用Knockout JS

如果您仍想使用 Knockout JS 框架,那么我最好的建议是将每个文档放在 IFRAME 中。这并不是真正推荐的做法,并且会给您的服务器带来额外的负载,但如果实施正确,将会加快您的用户体验。

www.mysite.com/view/1

<div>
    <iframe src="www.mysite.com/view/1/document/1"></iframe></div>
<div>
    <iframe src="www.mysite.com/view/1/document/2"></iframe></div>
...

www.mysite.com/view/1/document/1

<!-- Just the single Document template -->
   <table data-bind="foreach: Values">
        <tr data-bind="foreach: $data">
             <td data-bind="attr: {colspan: Colspan}">
                <label data-bind="text: Label"></label>
                <br />
                <span data-bind="html: Value"></span>
            </td>
        </tr>
    </table>
Run Code Online (Sandbox Code Playgroud)

客户端浏览器最初将获取包含所有 IFRAME 的所有 HTML,它将异步为每个 IFRAME 分派请求。每个文档请求都将使用 Knockout JS 在其自己的框架中异步渲染。

为了改善用户交互,您甚至可以在 IFRAME 上设置加载事件。加载事件可以重新调整 IFRAME 的大小,这样就没有滚动条,或者从 IFRAME 中提取 HTML 并用提取的 HTML 替换 IFRAME 元素。