BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

w3ctech 2011 JavaScript专题会议(广州站)​综述

| 作者 崔康 关注 1 他的粉丝 发布于 2011年8月10日. 估计阅读时间: 18 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

w3ctech 2011 JavaScript专题会议(广州站)​日前在华师大附中召开,参会者近300人,来自国内技术社区的四位知名专家陈广琛、赵劼、周爱民、贺师俊分别做了精彩的演讲,涉及的内容包括​​​​云端NodeJS、JS异步解决方案Jscex、开源Javascript引擎Narcissus、ECMAScript 5的strict模式等。InfoQ中文站整理了大会的精彩内容,供读者参考。

云端JavaScript漫游指南

雅虎前端工程师陈广琛演讲的主题是《云端JavaScript漫游指南》​,他以丰富的实例和现场演示介绍了NodeJS的强大功能和云端部署的​知识。

正如陈广琛在开场白里所说,十年前的Javascript还要看VBScript、PHP、CGI的脸色,而如今Javascript的强大从前端延伸到了后端。在​解释JavsScript依靠NodeJS平台作为服务器端编程语言​的优势时​,他在会场演示了两个功能不大但让人印象深刻的NodeJS开发案例,这些以前Web开发人员需要采用其他语言实现的功能,如今用熟悉的JavaScript即可完成。让我们来体会一下NodeJS的魅力。

域名重定向(biz-to-me)代码示例​:

 const http = require('http');
 var server = http.createServer(function(request, response) {
    var host = request.headers['host'];
    var url = request.url; 

    console.log('request from: http://' + host + url);
    host = host.replace(/catchen\.biz$/, 'catchen.me');

    if (host == request.headers['host']) {
        host = 'catchen.me';
        url = '/'
    }

    var location = 'http://' + host + url;
    console.log('redirect to: ' + location);
    response.writeHead(302, {
        Location: location
    });

    response.write('Temporarily moved to <a href="' + location + '">' + location + '</a>.');
    response.end();
});
var port = process.env.PORT || 3000;

server.listen(port, function(){
    console.log("Listening on " + port);
});

​短URL解析(traceurl)的代码示例可以从这里查看。

从这两个例子中,我们可以看到一些亮点,比如:

  • 导入函数库时,可以赋值给命名常量,便于范围管理,像const http = require('http')。
  • 服务器端处理主要函数是createServer中传入的回调函数function(request, response)。
  • 从request解析http请求,用response返回响应。
  • 采用Javascript语言,参数Json风格。
  • 无需配置Apache。
  • 支持URL路由(字符串定义和正则表达式两种)。

陈广琛特别介绍了NodeJS的Express.js库,常用的功能包括:

  • 日志管理
  • 路由
  • cookie解析
  • session管理
  • 模板引擎

有志于从事NodeJS应用开发的朋友,可能会担心NodeJS相关的支持工具包(package)不够多从而导致开发比较麻烦。陈广琛建议大家利用NPM搜索已有的工具包。NPM是针对NodeJS的包管理器,可以用来安装和发布NodeJS应用,它能够管理依赖等。除了利用第三方的工具包,陈广琛还介绍了如何构建自己的package(见短URL解析代码示例),大体分为三步:

  • 使用module.exports编写模块。
  • 提供package.json和index.js文件。
  • 使用npm publish发布。

演讲的后半部分转到了演讲的关键字——云端。对于已经构建好的NodeJS应用,部署在何处?陈广琛指出,无论是租用机房的服务器还是购买VPS服务,都不是理想的选择,“云端”才是大势所趋。他介绍了四款NodeJS云端服务:

其中Heroku提供每月750小时的单进程免费服务,适合于简单的NodeJS应用和学习实践。

最后,陈广琛指出NodeJS的最大优势在于高并发和异步IO,只有应用存在这些需求时,NodeJS才会表现出相比其他平台或语言的过人之处。

提升JavaScript生产力的“异样”编程手段

IBM高级咨询师、InfoQ中文站编辑赵劼以《提升JavaScript生产力的“异样”编程手段》为题介绍了其创建的Javascript开源项目Jscex,对深陷异步编程困扰的开发人员很有启发和帮助。

老赵在开场阶段一如既往地批评Java语言的不足,他以构建书籍索引为例,C#语言的实现代码如下:

// C#
List<string> keywords = ...;
var result = keywords
    .GroupBy(k => k[0].ToUpper())
    .ToDictionary(
        g => g.Key,
        g => g.OrderBy(k => k).ToList());

与此形成鲜明对比的是Java语言的实现代码:

List<String> keywords = ...;
Map<Character, List<String>> result = new HashMap<...>();
for (String k: keywords) {
    char firstChar = k.charAt(0);
    if (!result.containsKey(firstChar)) {
        result.put(firstChar, new ArrayList<String>());
    }
    result.get(firstChar).add(k);
}
for (List<String> list: result.values()) {
    Collections.sort(list);
}

老赵总结了Java的四点不足:

  • 命令式编程(强调怎么做)
  • 复杂的匿名类型语法
  • 强制写清所有类型名
  • 无法扩展既有类型

而现代语言的常见特性是什么呢?

  • 声明式编程(做什么)
  • 易用的Lambda表达式语法
  • 类型推断(对于静态语言)
  • 无侵入的类型扩展

老赵指出,Javascript有着优秀的特性,不过在异步编程时存在不足,会破坏代码局部性,将逻辑拆分地支离破碎,同时对异步操作之间的协作和组合、异常处理及取消造成了困难,开源项目Jscex(JavaScript Computation EXpression)正是为了解决这些问题,其借鉴了F#的计算表达式特性,Jscex是Javascript语言扩展,通过非常巧妙的手段让开发人员享受异步编程的乐趣。比如,在定义异步操作时,需要采用如下代码形式:

// 使用异步构造器执行编译后的代码
var somethingAsync = eval(Jscex.compile("async",
    function (...) {
        // 实现
    }
));

调用形式如下:

function () {
    var res = $await(<async work>);
}

适用的异步任务包括:HTTP请求、UI事件、时钟回调、查询响应、Web Service响应、代理消息等。这种编程方式使得开发人员在异步处理时不会被无处不在的SetTimeout()函数困扰,确保代码结构清晰、便于维护。

老赵特别介绍了其Jsces编译器所采用的核心思想和技术:

  • 视JavaScript代码为DSL
  • 使用函数的toString方法获得代码
  • 使用eval动态执行代码

关键思路可以概括为:

var compile = function (f) {
    // 获得函数代码
    var code = f.toString();
    // 解析代码至语法树
    var ast = parse(code);
    // 生成新代码
    return generateCode(ast);
}

其优点包括:

  • 载体即为普通JS代码,行为一致
  • 无需额外编译步骤
  • 可以使用原有JavaScript编辑环境

针对eval的性能和安全问题,老赵指出JScex支持在发布前生成编译后的代码,去除eval和compile的开销,解除与编译器的依赖。

目前社区中存在多种异步框架和异步语言,老赵在对比分析时表示,Jscex的优势在于:

  • 使用JavaScript表达逻辑
  • 极高的灵活度和表达能力
  • 只需少量学习
  • 完全使用JavaScript语法
  • 完全保留JavaScript语义
  • 完全保留JavaScript编程体验

Jscex基于BSD协议开源,目前托管于githubsndacode上。感兴趣的读者朋友可以阅读老赵为InfoQ中文站独家撰写的深度技术文章《使用Jscex改善JavaScript异步编程体验》。

JS in JS——在JS中实现JS引擎的详细剖析

资深技术专家、支付宝架构师周爱民分享了Mozilla开源Javascript引擎Narcissus(采用Javascript实现)在语法分析、语句执行方面的技术细节,让到场的开发人员对Javascript有了更深的理解。

周爱民首先抛出了三个例子,让大家判断一下运行结果分别是什么(读者可以尝试一下):

function() {
}()

function() {
}(1)

(function() {
})(1)

在强调了理解Javascript语法的重要性之后,周爱民介绍了Narcissus项目的基本情况,它由js.js、jsdefs.js、jsparse.js和jsexec.js四个文件组成。其中重点是后两个文件。jsparse.js主要用于语法分析。在Narcissus中,语法层次由高到低分为Script、Statements、Statement、ParenExpression、Expression等,都视为Node。以var a, i = 100 , v = i + 100;为例,其语法树为:


(图片来源:周爱民幻灯片资料) 

jsexec.js文件主要包含了语句执行的引擎代码,周爱民介绍了Javascript语言上下文执行环境、new、with、function、object、eval 等重要概念、技术的实现细节和对开发者的启示。以new为例,其中的关键代码如下:

v = f.__construct__(a, x);

……

FOp.__construct__ = function(a,x) {
  var o = {}, p = this.prototype;
  o.__proto__ = p;
  var v = this.__call__(o, a, x);
  if (isObject(v)) return v;
  return o; 

周爱民建议大家认真读一下Narcissus项目的源代码,有助于体会Javascript的精髓。jsparse.js和jsexec.js两个文件的代码都在1000行左右,感兴趣的读者可以结合周爱民的视频学习Narcissus项目,这是一个很好的起点。 

ECMAScript 5——Improve the Safety of JavaScript

盛大创新院研究员贺师俊在第四场演讲中以ECMAScript 5为主题精彩收尾。他首先指出了ECMAScript的发展方向,包括:

  • API扩展和标准化:JSON、Array.protoype.forEach/map/filter...
  • 通用化,可实现平台对象:get/set accessor、Object.defineProperty等等
  • 适应于PITL(programming-in-the-large)

他认为Javascript传统上是小型开发语言,存在一些不足:

  • 设计为一门依赖于host环境的脚本语言
  • 无内置module/namespace
  • 缺少较全面的标准API库
  • 缺乏各种invariants约束的能力
  • 残缺的OO

正式因为存在这些缺陷,导致开发人员在使用Javascript编程时,经常掉进危险的陷阱。贺师俊结合日常工作中的亲身实践列举了几个,包括this引用、with语句等,都会引起潜在的代码漏洞,在企业级开发中,由于代码结构比较复杂,使得开发人员在调试bug时难以定位。比如下面这个小例子:

Dog.prototype.setName = function(name) {
    this.name = String(name).toLowerCase()
}

贺师俊认为String(name)并不是一种鲁棒性的实践方式,反而可能在开发人员的不经意间导致代码的错误而且不易发现,比如:

var q = new Dog()
q.setName(q)    // q.setName('q')

如何解决这些问题呢?贺师俊建议开发人员在条件允许的情况下开启ECMAScript 5的strict模式,并应用一些辅助开发工具包,例如guard.jsjsguardsjsHelpers OverloadTrademark/Guard proposal等。 

没有参会的朋友可以通过主办方w3ctech的相关页面下载幻灯片和观看演讲视频。JavaScript专题会议北京站和上海站分别将在8月27日和9月24日举行,感兴趣的读者可以报名(北京)和预约(上海)参加。InfoQ中文站将继续关注国内Web技术社区的发展。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

Re: 个人观点 by 崔 康

赞成,这种趋势已经越来越明显,Javascript的生态环境已经逐步壮大,舍我其谁的感觉。现在触角伸到了后端,短期内可能无法撼动其他主流编程语言的地位,但是其地位不可小觑。
随着各种平台的网络化以及HTML逐渐成为最通用的UI标准,做为HTML主要脚本语言,Javascript在客户端开发中有可能成为最重要的语言。

个人观点 by 连 树峰

看好javascript的未来,由前端逐渐向后端发展,最有希望统一前后端的语言

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT