2017年值得一窥的JavaScript相关技术趋势属于作者的web前端入门与工程实践,推荐阅读2016-我的前端之路:工具与工程了解更多2016年年终总结。本文主要内容翻译自,作者对每一项都做了一些改进。本文提到的这些趋势可能与大多数开发者相去甚远,或者与真正的大型工程应用相去甚远,但不妨碍我们提前两三年去了解它。本文仅代表原作者个人观点,不喜轻喷。译者也很好奇大家对这份榜单的看法。跨年夜前两天,DanAbramov在Twitter上提出了一个问题:JS社区毫不犹豫地抛出了对新技术的期待和期待。本文内容也是从推特的回复中总结出来的,按照热度从高到低排列。一个尚未确定的小点是,既然函数式编程不再是小众,那么它是否应该被踢出红地毯呢?WebAssembly作者在去年表达了对WebAssembly的期待。WebAssembly是Web平台的底层代码。它的初衷是让所有的语言都可以在Web平台上编译运行,这吸引了很多函数式编程和响应式编程的爱好者。尤其是近几年JavaScript社区的飞速发展,很多开发者已经跟不上这门语言进化的速度,所以他们也非常希望能够直接使用自己习惯的语言,而不是学习一门新的一种从入门到直接放弃的语言。不过,JavaScript仍处于明显的上升趋势,暂时无人唱。而WebAssembly还处于起步阶段,刚刚进入预览阶段,距离真正的发布还有很长的路要走。综上所述,笔者建议大家还是要关注WebAssembly,毕竟它对JavaScript的未来影响很大。如果你对WebAssembly感兴趣,那么我推荐阅读EricElliott的相关博客。Elm的作者个人不太愿意使用Elm,但它的特性还是很有价值的。2016年,众多开发者参与了Elm的开发。Elm不仅仅是一个JavaScript的扩展库,而是一个可以编译成JavaScript的程序。对于很多热衷于函数式编程的开发者来说,语言是一个不错的选择。参考Elm的介绍,Elm提供了以下特性:不会有运行时错误,不会有null,不会有undefinedisnotafunction。非常友好的错误信息可以帮助您进行开发。严格的代码规范和项目结构确保您的应用程序在快速迭代中仍然保持最佳实践。自动为所有Elm包添加语义版本描述。总而言之,Elm为我们提供了优秀的工具来确保干净、简单和碎片化的代码,并且由于Elm可以编译为JavaScript,因此许多JavaScript开发人员可以保持关注或尝试。babili(babel-minify)Babili于2016年8月首次发布,是一款基于Babel工具链的压缩工具,支持原生ES6语法。HenryZhu在本文中描述了为什么我们需要另一种压缩工具。重点如下:目前大部分压缩工具只能处理ES5代码,所以压缩前需要高级编译,而Babili可以支持直接输入ES2015+。随着浏览器性能的提升,越来越多的浏览器支持直接运行ES2015代码,不需要我们进行转换编译。此外,Babili还可以作为Babelpreset引入到已有的Babel配置中,或者作为命令行工具直接使用。这是一个简单的例子。我们编写了以下ES6类:classMangler{constructor(program){this.program=program;}}//needthissinceotherwiseManglerisn'tusednewMangler();得到如下代码://ES2015code->Babel->Uglify/Babili->MinifiedES5Codevara=functiona(b){_classCallCheck(this,a),this.program=b};a();而Babili的效果如下:://ES2015code->Babili->MinifiedES2015Codeclassa{constructor(b){this.program=b}}newa;OCamlOCaml本身与JS无关,但列表中接下来的两项是基于OCaml的,所以我们先介绍一下。如果您在过去两年关注过函数式编程的兴起,您可能听说过Haskell。得益于OCaml编译成S的能力,后来居上的态度超越了Haskell。许多Facebook开发者都是OCaml的粉丝,他们的Hack、Flow和Infer都是基于OCaml的。BuckleScriptBuckleScript是一个基于OCaml的服务器端框架,由著名的Bloomberg团队创建。DuaneJohnson对它们的解释如下:BuckleScript或bsc是一个相对较新的基于OCaml编译器的JavaScript服务器端框架。换句话说,您可以使用优秀的功能、自类型的OCaml语言,同时继续依赖基于npm包管理器的Web生态系统。让我们简单了解一下BuckleScript代码风格。例如使用BuckleScript实现一个简单的服务器:letport=3000lethostname="127.0.0.1"letcreate_serverhttp=letserver=http##createServerbeginfun[@bs]reqresp->resp##statusCode#=200;resp##setHeader"Content-Type""text/plain";resp##_end"Helloworld\n"endinserver##listenporthostnamebeginfun[@bs]()->Js.log("Serverrunningathttp://"^hostname^":"^Pervasives.string_of_intport^"/")endlet()=create_serverHttp_types.http编译输出为:'usestrict';varPervasives=require("bs-platform/lib/js/pervasives");varHttp=require("http");varhostname="127.0.0.1";functioncreate_server(http){varserver=http.createServer(function(_,resp){resp.statusCode=200;resp.setHeader("Content-Type","text/plain");returnresp.end("Helloworld\n");});returnserver.listen(3000,hostname,function(){console.log("Serverrunningathttp://"+(hostname+(":"+(Pervasives.string_of_int(3000)+"/"))));return/*()*/0;});}create_server(Http);OCaml的特点就是它的函数式语言特性,我们再来看看它的支持不可变类型,我们使用OCamlstdlib实现不可变类型,如下:.addii!mdone;fori=0tocountdoignore(IntMap.findi!m)donelet()=test()如果你想用FacebookImmutable实现代码:'usestrict';varImmutable=require('immutable');varMap=Immutable.Map;varm=newMap();functiontest(){varcount=1000000;for(vari=0;i
