0

我一直在开发一个单页应用程序,该应用程序包含来自 unicode.org 的 unihan.txt 数据的某些部分。它显示所有中文部首(包括简体和繁体),单击它们会根据笔画数将所有带有该部首的汉字分组显示。也可以进行逆向查找,如果你输入一个汉字,它会显示部首编号和笔画数。

我让它工作的方法是将 unihan 数据导入数据库中,并使用脚本将一些数据转换为两个 javascript 文件:

data_codep.js (cp[codepoint]=[radical,strokes];)

var cp = new Array();

cp[13312]=[10,4];
cp[13313]=[10,5];
cp[13314]=[10,5];
cp[13315]=[20,2];
cp[13316]=[20,2];
cp[13317]=[40,1];
cp[13318]=[40,5];
cp[13319]=[50,2];
cp[13320]=[50,2];
cp[13321]=[50,2];
cp[13322]=[50,3];
cp[13323]=[50,3];
cp[13324]=[50,4];
cp[13325]=[50,4];
cp[13326]=[50,4];
cp[13327]=[50,4];
cp[13328]=[50,5];
[...]
(75622 lines, 1.55Mb)

data_radical_stroke.js (uh[radical][strokes]=[codepoint,...];)

var uh = new Array();  
uh[10]=new Array();
uh[10][0]=[19968];
uh[10][1]=[19969,19970,19971,19972,19973,19974,131072,131073,131074];
uh[10][2]=[19975,19976,19977,19978,19979,19980,20112,21316,131075,131076,131077,131078,173824,173825,177984];
uh[10][3]=[19981,19982,19983,19984,19985,19986,19987,19991,63847,131079,131080,131081,131082,131083,131084,173826];
uh[10][4]=[13312,19988,19989,19990,19992,19993,19994,19995,19996,19997,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095];
uh[10][5]=[13313,13314,19998,19999,20000,20001,20002,131096,131097,131098,131100,131102,131103,131104,177985];
uh[10][6]=[20003,20004,20005,20029,131105,131106,131107,131108,131110,131111,131112,131114,131115,177986,194560];
uh[10][7]=[20006,20007,64112,131116,131117,131118,131120,131121,131122,131123,131124,173827];
uh[10][8]=[131125,131126,131128,131130,131131,173828];
uh[10][9]=[131133,131134,131135,131136,133410,173829];
uh[10][10]=[131137,131138,131139,131140,131141,173830];
uh[10][11]=[131142,131143,131144,131146,131147];
uh[10][12]=[131148,131149];
uh[10][13]=[131150,131151,131152,131153,131154,177987];
uh[10][14]=[131155,131156];
uh[10][15]=[131157,131159,131160,131161,131162,131163,131165,150735,173831];
uh[10][16]=[131158];
uh[10][17]=[131167];
uh[10][19]=[131168];

uh[20]=new Array();
uh[20][0]=[20008];
uh[20][1]=[20009,131169,131170];
[...]
(4676 lines, 564 kB)

我只是想看看这是否可行,并且它确实适用于我的普通台式电脑上的 Chrome 和 IE 等浏览器。data_codep.js 在 appr 中加载。1.15 秒。和 appr 中的 data_radical_stroke.js。375 毫秒。页面在 appr 中加载并执行。1.85 秒。这让我有点吃惊。即使是呈现数据也几乎是即时的。

但是,可能并不奇怪,它在 iPad1 上使 Safari 崩溃。

现在我知道这对浏览器的要求可能有点过分。在需要时从服务器获取数据显然是一种更有效的机制。(尤其是像 Node.js 这样的后端)我仍然很好奇这是否可以以更好、更有效的方式实现。

我想过加载一个字符串并用正则表达式将其切割,然后将每条数据 .push 到一个数组中,但是有了这么多的数据,这不会需要很长时间吗?我认为将其转换为 json 文件然后解析它也是如此。

如何用更小的足迹来做到这一点?

(注意:部首具有传统形状时附加 0,而具有简化形状时附加 1)

4

1 回答 1

0

将数据加载到 SPA 时,我使用Backbone 文档推荐的最佳实践,并在加载时将数据引导到页面中,而不是引发大型网络调用,当您稍后需要数据时,这会变慢。您还可以考虑将数据缓存到本地存储机制中(如果它不经常更改),这是可行的,因为这两个文件的大小总体上非常小。

在我看来,让数据达到你所要做的就是在你的 SPA 中这样的程度:

<script>var characterData = JSON.parse(<?php json_encode($data); ?>);</script>

在将尽可能多的数据加载到页面中的同时,预先保持 HTTP 请求最小化。JSON.parse是一种本机方法(我认为回到 IE8),而且速度非常快。当然,我建议您根据自己的数据负载对其进行基准测试。

于 2013-06-25T14:04:35.170 回答