JS不比……差

让我从我迅速写这篇文章的原因开始,提到我最近在Twitter上阅读的Jason的一个很棒的评论:

我的开发人员,那就是类型安全性的去向:与您认为类型可以为您解决的问题和限制相比,您现在拥有更多隐藏的问题和限制。

但需要注意的是:您的生产代码中没有类型,只有IDE无法识别的已转码代码,这些代码将在最重要的位置和时间失败。


我想知道阻止TS爱好者使用流的原因是什么,因为类型确实是他们所追求的,流至少仅在JS之上,并且如果事情不能按预期运行,您只能责怪JS,而不能怪它未知的自我。

巴别塔

语言不是真正的一部分,但Babel是负责转换大多数现代代码的出色工具。

坏消息是,如果您也没有通过生产代码运行的测试,则可以忽略任何“ 绿色构建标志 ”,因为这实际上并不是通过用户运行的。

TL; DR您可能还需要在每个目标浏览器上测试实时产品代码。

事实上,除非您知道解决类issuse的插件或其他陷阱,否则TypeScript上失败的几乎所有东西都将在Babel 6上同样失败,因为ES6,ES7和ES8 并不是仅仅是糖 ”对于ES5。

而且,尽管Babel 7固定的类至少扩展了“ 恶作剧 ”,但生成的代码仍可能不是100%可靠的,因此…还要继续测试生产代码!


支持不滥用编译器的另一个小问题是最终代码大小。

以以下本地JS为例:

  const wut =(...等待)=> wait.join(''); 

它将变成:

  “使用严格”; 
var wut =函数wut(){
for(var _len = arguments.length,wait = Array(_len),_key = 0; _key <_len; _key ++){
wait [_key] =参数[_key];
}
返回wait.join('');
};

代替:

 函数wut(){return [] .join.call(arguments,'');  } 

您可以对这些变体进行基准测试,并意识到结果基本相同,只是dev代码的大小与机器代码的大小相比,一次最小化时权重49字节,而不是由Babel产生的106字节。

每当您散布论据并进行转换时,这种情况都会发生。 只是说…

我听说过关于Elm的很多很棒的事情,尽管我答应过自己,但会做得更多,但我经常因检查其问题而退缩。

该语言显然生成的JS具有出色的性能,并且没有运行时异常,但是它的最新问题是:

  • 如果两个模块定义相同的端口,则应该( 但不会 )错误
  • 编译器在写得不好的foldl lambda中挂在无限类型 e上
  • 不可能的记录扩展推断导致内存不足崩溃
  • 由于缺乏种类检查而导致的错误
  • 无限类型导致编译器挂起
  • 注释的定义在子注释中具有类型变量崩溃
  • 似乎不是无限的类型上的无限类型错误

尽管我很欣赏这种语言实际上没有多少未解决的问题,但我的大脑只在阅读那里的最后一本书时才爆炸,老实说,我还不觉得(尚未?)准备好探索,拥抱或理解这些错误中的任何一个。

受本机JS引擎(也可以推断类型)的束缚,但只是在事情没有按预期进行时就取消选择(而不是我的脸face“ 爆炸 ”),我想现在我会跳过Elm,但我很好奇知道它为您解决了多少VS JS。


我是否已经提到我喜欢JS运行时背后的努力使JS成为目前最快的脚本语言之一,同时又保留了自此以来对每个人都有利的东西,这就是它的易用性?

在版本2中,它仍然不支持模板文字…

更新 :它实际上以自己的方式运行。

好吧,好吧,我们正朝着比JS更注重WASM的语言发展,但是由于这篇文章是关于开发人员的想法,即JS总是比其他语言差,我想在飞走的同时在这里留下一些小的推文👋