2017值得一瞥的JavaScript相关技术趋势

简介:

2017值得一瞥的JavaScript相关技术趋势从属于笔者的Web 前端入门与工程实践,推荐阅读2016-我的前端之路:工具化与工程化获得更多关于2016年前端总结。本文主要内容翻译自,笔者对于每个条目进行了些许完善。

本文中提及的这些趋势可能离大部分开发者还很远,或者说离真正的大规模工程化应用还很远,不过不妨碍我们提前两三年了解下。本文仅代表原作者个人看法,不喜留言轻喷,译者也很好奇大家对这个列表的看法。

跨年前两天,Dan Abramov在Twitter上提了一个问题:

JS社区毫不犹豫的抛出了它们对于新技术的预期与期待,本文内容也是总结自Twitter的回复,按照流行度降序排列。有一个尚未确定的小点是既然函数式编程已不再是少数派,是否要把它踢出红毯呢?

WebAssembly

去年笔者就表示过了对于WebAssembly的期待,WebAssembly就是面向Web平台的底层代码。其初衷是希望能够使所有语言都能够编译运行到Web平台,这一点对于很多函数式编程、响应式编程的粉丝充满吸引力。特别是随着这几年JavaScript社区的突飞猛进,很多开发者并不能跟得上这门语言衍化的速度,因此他们也非常希望能够直接用自己习惯的语言而不是要去重头学一门从入门到直接放弃的语言。不过JavaScript目前还处于明显的上升势头,暂时还没人唱衰它。并且WebAssembly仍处于襁褓中,才进入到预览阶段,离真正的发布还有很长的距离。总结而言,笔者建议我们都应该对WebAssembly保持一定的关注,毕竟它会对未来的JavaScript造成极大的影响。如果你对于WebAssembly有兴趣,那么推荐阅读Eric Elliott的相关博客。

Elm

笔者个人不太意愿使用Elm,不过其特性还是很有借鉴价值

2016年不少的开发者参与到Elm的开发中,Elm不仅仅是JavaScript的扩展库,而是一门可以编译到JavaScript的编程语言,对于很多热衷于函数式编程的开发者是个不错的选择。参考Elm 入门介绍,Elm提供了如下特性:

  • 并不会存在运行时错误,没有null,没有undefined is not a funtion。
  • 非常友好的错误提示信息能够辅助你开发。
  • 比较严格的代码规范与项目架构,保证了你的应用在快速迭代中依然保持着最佳实践。
  • 自动为所有的Elm包添加语义版本描述。

总而言之,Elm为我们提供了优秀的工具来保证编写干净、简单与碎片化的代码,并且因为Elm是可以编译到JavaScript,因此很多JavaScript开发者都可以保持下关注或者尝试下。

babili(babel-minify)

Babili最早于2016年8月份发布,它是基于Babel工具链上的支持原生ES6语法的压缩工具。Henry Zhu在这篇文章中称述了为什么我们需要另一个压缩工具,关键点如下:

目前大部分压缩工具只能

够处理ES5代码,因此在压缩之前需要先进性编译,而Babili能够支持直接输入ES2015+。随着浏览器性能的提升,越来越多的浏览器支持直接运行ES2015的代码,因此我们不需要再进行转换编译。另外Babili也可以作为Babel preset引入到现有的Babel配置中,也可以作为直接使用的命令行工具。

这里举个简单的例子,我们编写了如下的ES6类:

 
  1. class Mangler {    
  2.    constructor(program) {    
  3.      this.program = program;    
  4.    }    
  5.  }    
  6.  // need this since otherwise Mangler isn't used    
  7.  new Mangler();  

之前,利用传统的Babel进行编译与压缩,会得到如下代码:

 
  1. // ES2015 code -> Babel -> Uglify/Babili -> Minified ES5 Code    
  2.  var a=function a(b){_classCallCheck(this,a),this.program=b};a();  

而Babili的效果如下:

 
  1. // ES2015 code -> Babili -> Minified ES2015 Code    
  2.  class a{constructor(b){this.program=b}}new a;  

OCaml

OCaml本身和JS没啥关系,不过列表接下来的两项都是基于OCaml,因此还是要先介绍下。如果你关注了近两年来的函数式编程崛起之路,你或许听过Haskell。而得益于OCaml能够编译到就S,其以后来居上的姿态凌驾于Haskell。Facebook的不少开发者都是OCaml的粉丝,他们的Hack、Flow以及Infer都是基于OCaml构建的。

BuckleScript

BuckleScript是基于OCaml实现的服务端框架,由著名的Bloomberg团队创造而来。Duane Johnson对他们的解释如下:

BuckleScript或者bsc,是个基于OCaml编译器的相对较新的JavaScript服务端框架。换言之,你可以使用优秀的函数式、自带类型的OCaml语言,同时也能继续背靠基于npm包管理器的Web生态系统。

我们来简要的看下BuckleScript代码风格,譬如用BuckleScript实现简单的服务端:

 
  1. let port = 3000    
  2.  let hostname = "127.0.0.1"    
  3.  let create_server http =    
  4.    let server = http##createServer begin fun [@bs] req resp ->    
  5.        resp##statusCode #= 200;    
  6.        resp##setHeader "Content-Type" "text/plain";    
  7.        resp##_end "Hello world\n"    
  8.      end    
  9.    in    
  10.    server##listen port hostname begin fun [@bs] () ->    
  11.      Js.log ("Server running at http://"^ hostname ^ ":" ^ Pervasives.string_of_int port ^ "/")    
  12.    end    
  13.  
  14.  let () = create_server Http_types.http  

编译输出为:

 
  1. 'use strict';    
  2.  var Pervasives = require("bs-platform/lib/js/pervasives");    
  3.  var Http       = require("http");    
  4.  
  5.  var hostname = "127.0.0.1";    
  6.  
  7.  function create_server(http) {    
  8.    var server = http.createServer(function (_, resp) {    
  9.      resp.statusCode = 200;    
  10.      resp.setHeader("Content-Type""text/plain");    
  11.      return resp.end("Hello world\n");    
  12.    });    
  13.    return server.listen(3000, hostname, function () {    
  14.      console.log("Server running at http://" + (hostname + (":" + (Pervasives.string_of_int(3000) + "/"))));    
  15.      return /* () */0;    
  16.    });    
  17.  }    
  18.  
  19.  create_server(Http);  

OCaml最大的特性就是其函数式语言特性,我们再看下其对于不可变类型的支持,我们使用OCaml stdlib实现的不可变类型如下:

 
  1. module IntMap = Map.Make(struct    
  2.    type t = int    
  3.    let compare (x : int) y = compare x y    
  4.  end)    
  5.  
  6.  let test () =    
  7.    let m = ref IntMap.empty in    
  8.    let count = 1000000 in    
  9.    for i = 0 to count do    
  10.      m := IntMap.add i i !m    
  11.    done;    
  12.    for i = 0 to count do    
  13.      ignore (IntMap.find i !m)    
  14.    done    
  15.  
  16.  let () = test()  

而如果要用Facebook Immutable实现的代码为:

 
  1. 'use strict';    
  2.  
  3.  var Immutable = require('immutable');    
  4.  var Map = Immutable.Map;    
  5.  var m = new Map();    
  6.  
  7.  function test() {    
  8.    var count = 1000000;    
  9.    for(var i = 0; i < count; ++i) {    
  10.      m = m.set(i, i);    
  11.    }    
  12.    for(var j = 0; j < count; ++j) {    
  13.      m.get(j);    
  14.    }    
  15.  }    
  16.  
  17.  test();  

性能评测下,二者的执行时间对比为:

  • BuckleScript: 1186ms
  • JavaScript: 3415ms

编译后的体积为:

  • BuckleScript (production): 899 Bytes
  • JavaScript: 55.3K Bytes

ReasonML

ReasonML与React师出同门,是基于OCamel设计的语法友好、编辑器支持程度高,并且有强大的编译工具支持的语言。建议阅读Sean Grove对ReasonML的介绍。本文简单介绍几个JavaScript与Reason的语法对比:

Purescript

另一个强类型、高性能的能够编译到JavaScript的编程语言,其定位与Elm类似,主要特性为:

  • 没有运行时错误
  • 严格的,类似于JavaScript的计算
  • 支持JavaScript 对象语法
  • 提供相较于Hashkell更强大方便的类型系统
  • 更方便地JavaScript库集成

Webpack-blocks

Dan Abramov说过,Webpack的定位就是在相对底层,因此将配置以编程块的方式实现会更加完备。

 
  1. const { createConfig, defineConstants, env, entryPoint, setOutput, sourceMaps } = require('@webpack-blocks/webpack2')          
  2.    const babel = require('@webpack-blocks/babel6')          
  3.    const devServer = require('@webpack-blocks/dev-server2')          
  4.    const postcss = require('@webpack-blocks/postcss')          
  5.    const autoprefixer = require('autoprefixer')          
  6.  
  7.    module.exports = createConfig([          
  8.      entryPoint('./src/main.js'),          
  9.      setOutput('./build/bundle.js'),          
  10.      babel(),          
  11.      postcss([          
  12.        autoprefixer({ browsers: ['last 2 versions'] })          
  13.      ]),          
  14.      defineConstants({          
  15.        'process.env.NODE_ENV': process.env.NODE_ENV          
  16.      }),          
  17.      env('development', [          
  18.        devServer(),          
  19.        devServer.proxy({          
  20.          '/api': { target: 'http://localhost:3000' }          
  21.        }),          
  22.        sourceMaps()          
  23.      ])          
  24.    ]);  

GraphQL

GraphQL是个不错的REST替代查询语言,特别是对于那些拥有大量数据的公司。这个案例分析很好地阐述了从REST到GraphQL的转变之路。我能够想象2017年GraphQL会继续处于上升势头,不过要谈到真的大规模实施,还要到2018年吧。

React Storybook

相信大家对于React Storybook并不陌生了,你能够独立于应用而交互式的开发你的组件,就如下图所示:

[jQuery 3.0]()

爷爷辈的jQuery仍然处于不断的迭代更新中,可能很多开发者忽略了2016年6月份发布的jQuery 3.0版本,可以参考这里获取更多信息。

Pixi.js

如果你打算在浏览器中实现精彩的2D效果,特别是对于使用WebGL的游戏开发者,Pixi.js是个值得一看的库,可以参考这里获取更多的Demo。

Preact与[inferno]()

非常优秀的React的替代库。

Rust

Rust可以编译到JavaScript啦(通过emscripten)。

Custom Elements

Custom Elements(包括Shadow DOM)一直不被主流的开发者接受,不过看似2017这一点将会发生些许变化。变化的关键因素在于浏览器支持比例的改善。个人还是蛮期待Custom Elements的,可以关注SmashingMag或者Google’s关于Custom Elements的解释。

WebRTC

很难相信WebRTC已经五岁了,Facebook、Slack、Snapchat以及WhatsApp都在他们的服务中集成了WebRTC。可以预见WebRTC会在2017年被更多的公司采用,蒸蒸日上。

Next.js

Next.js是个基于React、Webpack与Babel构建的,支持服务端渲染的小框架,其来源于ZEIT团队,在React社区获得了不小的关注度。


作者:佚名

来源:51CTO

相关文章
|
3月前
|
前端开发 JavaScript 测试技术
深入 JavaScript:理论和技术(下)
深入 JavaScript:理论和技术(下)
41 0
|
3月前
|
存储 JavaScript 前端开发
深入 JavaScript:理论和技术(上)
深入 JavaScript:理论和技术(上)
30 0
|
3月前
|
数据可视化 前端开发 JavaScript
数据可视化技术的较量:D3.js与Tableau的比较与选择
在当今信息爆炸的时代,数据可视化成为了帮助我们理解和传达数据的重要工具。本文将重点对比并评估两个主流的数据可视化技术和工具,即D3.js和Tableau。我们将探讨它们的优势、适用场景以及选择的关键因素,以帮助读者在选择合适的数据可视化工具时做出明智的决策。
|
3天前
|
数据可视化 JavaScript 前端开发
【专栏】数据可视化技术与工具:D3.js 和 Tableau 的比较和选择
【4月更文挑战第27天】D3.js 和 Tableau 是两种流行的数据可视化工具。D3.js,一个JavaScript库,以其灵活性和定制性著称,适合创建复杂、个性化的可视化效果,但需要编程技能。Tableau,一款用户友好的分析软件,提供直观界面和强大分析功能,适合快速生成常见图表。在选择时,应考虑项目需求、团队技术能力、数据规模和性能要求。两者可单独使用,也可结合发挥各自优点。随着数据可视化需求的增长,这些工具将持续发展并提供更好的解决方案。
|
8天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
1月前
|
JavaScript 前端开发 安全
关于 JavaScript 代码的反混淆技术
关于 JavaScript 代码的反混淆技术
75 0
|
1月前
|
Rust 前端开发 JavaScript
前端技术的未来:WebAssembly与JavaScript的融合之路
【2月更文挑战第12天】本文旨在探讨WebAssembly(以下简称Wasm)与JavaScript(以下简称JS)的结合如何为前端开发带来革命性变化。传统上,JS一直是前端开发的核心,但随着Wasm的出现,我们看到了前端性能和功能的新天地。文章首先介绍Wasm的基本概念,然后分析其对前端开发的影响,包括性能提升、新功能实现以及开发模式的变化。最后,探讨了Wasm与JS融合的未来趋势,以及这种融合如何推动前端技术的进步。
|
1月前
|
Rust 前端开发 JavaScript
探索前端技术的未来:WebAssembly与JavaScript的融合之路
【2月更文挑战第12天】 随着Web技术的不断进步,前端开发正迎来一场革命性变革。本文将深入探讨WebAssembly(以下简称Wasm)与JavaScript(以下简称JS)的结合如何为前端开发带来前所未有的性能提升与新的编程模式。我们将从两者的基本概念入手,探索它们各自的优势与局限,然后深入分析Wasm和JS协同工作时能够解锁的潜力,最后展望这一技术趋势如何塑造未来的前端开发生态。本文旨在为前端开发者提供洞见,帮助他们理解并准备好迎接这一即将到来的技术浪潮。
|
1月前
|
Rust 前端开发 JavaScript
前端技术的未来演进:WebAssembly与JavaScript的深度融合
【2月更文挑战第11天】 在数字化时代,前端技术的迅速发展不仅推动了用户体验的革新,也促进了Web应用的性能提升。本文将探讨WebAssembly(以下简称Wasm)与JavaScript(以下简称JS)之间的深度融合如何成为前端技术发展的关键转折点。不同于传统的技术文章摘要,我们将通过一种叙事式的预览引导读者进入这一技术领域的探索之旅,揭示Wasm和JS结合后为前端开发带来的无限可能性和挑战。
|
2月前
|
前端开发 JavaScript API
JavaScript中的异步编程技术及应用
【2月更文挑战第2天】传统的JavaScript编程方式在处理异步操作时存在诸多不足,为了解决这一问题,近年来涌现出了一系列异步编程技术,本文将深入探讨Promise、async/await等异步编程解决方案,并结合实际案例展示其在前端开发中的应用。