资源大小

比触摸 DOM 慢的唯一事情就是与服务器通信。尤其是对于手机上网速慢的人。所以,你可以整天使用 Html.LazyHtml.Keyed 来优化代码,但如果加载速度慢的话,你的应用程序仍然会感觉很慢!

一个很好的改进方法是发送较少的位。例如,如果一个 122kb 的资源可以变成 9kb 的资源,则加载速度会更快!我们可以使用以下技术获得这样的结果

  • 编译。Elm 编译器可以执行诸如死代码消除和记录字段重命名之类的优化。这样,它就可以剪切未使用的代码并缩短生成的代码中的记录字段名称,如 userStatus
  • 最小化。在 JavaScript 世界中,有一些名为“minifier”的工具可以进行一系列转换。它们缩短了变量。他们是内联的。它们将 if 语句转换为三元运算符。它们将 '\u0041' 变成 'A'。为节省一些位可以做任何事!
  • 压缩。一旦你将代码尽可能缩小,就可以使用 gzip 等压缩算法来进一步缩小代码。它特别适用于 functionreturn 等关键字,你无法在代码本身中摆脱这些关键字。

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.jselm.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 的数据即可让人们获得此程序!

这里的重要命令是 elmuglifyjs,它们可以在任何平台上工作,因此在 Windows 上执行类似操作应该不太困难。

建议

我建议编写一个 Browser.application 并编译成一个 JavaScript 文件,如我们在本文中所看到的。在人们首次访问时,它将被下载(并缓存在本地)。与流行的竞争对手相比,Elm 创建的文件相当小,如你 在此 所见,因此此策略可以让你走得更远。

注意:理论上,使用 Elm 可以获得更小的资产。目前还无法实现,但如果你正在处理 50k 行或更多的 Elm 内容,我们希望了解你的情况,作为用户研究的一部分。详情 在此

符合 "" 的 个结果

    无符合 "" 的结果