资源大小
比触摸 DOM 慢的唯一事情就是与服务器通信。尤其是对于手机上网速慢的人。所以,你可以整天使用 Html.Lazy
和 Html.Keyed
来优化代码,但如果加载速度慢的话,你的应用程序仍然会感觉很慢!
一个很好的改进方法是发送较少的位。例如,如果一个 122kb 的资源可以变成 9kb 的资源,则加载速度会更快!我们可以使用以下技术获得这样的结果
- 编译。Elm 编译器可以执行诸如死代码消除和记录字段重命名之类的优化。这样,它就可以剪切未使用的代码并缩短生成的代码中的记录字段名称,如
userStatus
。 - 最小化。在 JavaScript 世界中,有一些名为“minifier”的工具可以进行一系列转换。它们缩短了变量。他们是内联的。它们将
if
语句转换为三元运算符。它们将'\u0041'
变成'A'
。为节省一些位可以做任何事! - 压缩。一旦你将代码尽可能缩小,就可以使用 gzip 等压缩算法来进一步缩小代码。它特别适用于
function
和return
等关键字,你无法在代码本身中摆脱这些关键字。
Elm 使得为你的项目设置这一切变得很容易。无需一些复杂的构建系统。这只是两个终端命令!
说明
第一步是用 --optimize
标志进行编译。这会执行缩短记录字段名称等操作。
第二步是压缩生成的 JavaScript 代码。我使用一个名为 uglifyjs
的压缩器,但你也可以使用其他压缩器。uglifyjs
的妙处在于它所有的特殊标志。这些标志解锁的优化在普通 JS 代码中不可靠,但由于 Elm 的设计,对于我们来说是完全安全的!
将这些放在一起,我们可以使用两个终端命令优化 src/Main.elm
elm make src/Main.elm --optimize --output=elm.js
uglifyjs elm.js --compress 'pure_funcs=[F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9],pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output elm.min.js
在此之后,你将拥有一个 elm.js
和一个较小的 elm.min.js
文件!
注意 1:
uglifyjs
在此被调用了两次。一次用于--compress
,一次用于--mangle
。这么做是有必要的!否则uglifyjs
将忽略我们的pure_funcs
标志。注意 2:如果
uglifyjs
命令在你的终端中不可用,你可以运行命令npm install uglify-js --global
下载它。如果你没有npm
,你可以使用 nodejs 获取它。
脚本
很难记住所有用于 uglifyjs
的标志,因此最好编写一个脚本来执行此操作。
假设我们想要一个产生 elm.js
和 elm.min.js
文件的 bash 脚本。在 Mac 或 Linux 上,我们可以像这样定义 optimize.sh
#!/bin/sh
set -e
js="elm.js"
min="elm.min.js"
elm make --optimize --output=$js "$@"
uglifyjs $js --compress 'pure_funcs=[F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9],pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output $min
echo "Compiled size:$(wc $js -c) bytes ($js)"
echo "Minified size:$(wc $min -c) bytes ($min)"
echo "Gzipped size: $(gzip $min -c | wc -c) bytes"
现在,如果我针对我的 TodoMVC 代码运行 ./optimize.sh src/Main.elm
,我将在终端中看到类似这样的内容
Compiled size: 122297 bytes (elm.js)
Minified size: 24123 bytes (elm.min.js)
Gzipped size: 9148 bytes
很酷!我们只需要发送大约 9kb 的数据即可让人们获得此程序!
这里的重要命令是 elm
和 uglifyjs
,它们可以在任何平台上工作,因此在 Windows 上执行类似操作应该不太困难。
建议
我建议编写一个 Browser.application
并编译成一个 JavaScript 文件,如我们在本文中所看到的。在人们首次访问时,它将被下载(并缓存在本地)。与流行的竞争对手相比,Elm 创建的文件相当小,如你 在此 所见,因此此策略可以让你走得更远。
注意:理论上,使用 Elm 可以获得更小的资产。目前还无法实现,但如果你正在处理 50k 行或更多的 Elm 内容,我们希望了解你的情况,作为用户研究的一部分。详情 在此!