06月02, 2013

[译文]dart的九个误解

英文链接:http://blog.sethladd.com/2012/10/9-dart-myths-debunked.html

误解1: dart将取代javascript

错~ dart 为非主流开发者(不会javascript)提供一个可以帮助他们在现代web中更有成效地构建高性能apps的途径。现在有很多富有技巧和专业的Javascript开发者,但是同样有很多很多的开发者熟悉Java,C#,C++,ActionScript等等。

那些开发者对于他们常使用的工具及语言抱有很大的期待,所以我们的目标是满足并超出他们的期望。我们在语言里加入类,接口,可选的静态类型,词法范围,可选参数,泛型以及更多。我们在生产能够重构,快速修复,静态分析,调试等更多的编辑器。

误解2:要么Dart要么Javascript

错!无论是Javascript还是Dart都是google信赖并投资的技术。Google参与TC39,规划javascript未来的组织。他们也在V8上继续工作,这是最快的javascript引擎。Chrome工程师也继续他们推进web未来的新标准比如Web Components的工作。同时,早期构建V8的团队现在也在研究Dart。我们希望有一天Chrome内部具备V8和Dart Vm。

误解3: Dart只为Chrome

错! Dart可以编译成Javascript,所以它理论上可以在现代浏览器上运行,比如IE9,Safari, Firefox, Opera, Chrome等。现在Dart的当务之急是能够继续在多浏览器上研究。

误解4: Dart需要我用类,库以及更多的重量型概念工作

错! Dart涵盖了从非类型函数的简单脚本到包含各种bell和whistles的100k行代码。你当然可以写不需要类或者库的代码。但是我们希望你的代码增长时能够在适合你的结构中找到你的乐趣。

简单的脚本例子:

shoutItOut(String msg) => print('${msg.toUpperCase()}!');
main() {
    shoutItOut("Dart is fun");
}

误解5: Dart不能使用Javascript代码

错! Dart现在有一个同步Js的互操作的库。你可以使用Dart代码为那些同步,有状态的Javascript APIs比如Google Maps和Twitter API

这里是使用Dart操作Twitter API

void main() {
    js.scoped(() {
    // Create a JavaScript function called display that forwards to the Dart
    // function.
        js.context.display = new js.Callback.once(display);

    // Inject a JSONP request to Twitter invoking the JavaScript display
    // function.
        document.body.nodes.add(new ScriptElement()..src =
    "https://search.twitter.com/search.json?q=dartlang&rpp=20&callback=display");
    });
}

// Display the JSON data on the web page.
// Note callbacks are automatically executed within a scope.
void display(var data) {
    var results = data.results;
// The data and results objects are proxies to JavaScript object,
// so we cannot iterate directly on them.
    for (var i = 0; i < results.length; ++i) {
            var result = results[i];
            var user = result.from_user_name;
            var time = result.created_at;
            var text = linkify(result.text);
            var div = new DivElement();
            div.innerHTML = '<div>From: $user</div><div>$text</div><p>';
            document.body.nodes.add(div);
    }
}

误解6: 没有jQuery支持,Dart用处不大

错! Dart有一个HTML库用来清理(重格式)DOM,并使其感觉像Dart。虽然这不是很像jQuery的,但它越来越接近。下面是一个使用Dart将元素添加到网页上的例子:

#import('dart:html');

  void main() {
    var button = new ButtonElement();
    button.text = 'Click me';
    button.classes.add('important');
    button.on.click.add((e) => window.alert('Clicked!!'));
    document.body.elements.add(button);
  }

如果你喜欢也可以使用方法链式引用:

#import('dart:html');

  void main() {
    var button = new ButtonElement()
          ..text = 'Click me'
          ..classes.add('important')
          ..on.click.add((e) => window.alert('Clicked!!'));

    document.body.elements.add(button);
  }

误解7: Dart的javascript输出实在太大了

错!我们现在是在我们的第三代Dart-to-JavaScript编译器,有明显的更少的输出。例如,2012-10-08那天,一个“Hello World”应用程序的大小是2350字节。我们的dart2js计划执行“摇树”(这个很形象,摇摇树干可以把一些成熟的果子摇下来),输出实际上在使用的代码,忽视永远不会被调用的库代码。

误解8: Dart编译成Javascript很难调试

错!多亏源码映射,你可以使用Chrome的开发工具来调试由原来Dart代码编译的JavaScript代码。一位源码映射文件创建了原始的源代码(DART)和编译输出(JavaScript)之间的映射。

这里是一个图像显示Dart代码在Chrome里的开发工具“source”选项卡里面。这里没有DartVM,只是源码映射。你甚至可以设置断点!

误解9: 我使用Web组件也许要等待4-5年

错!由于Dart编译为JavaScript,我们可以通过使用Dart构建的Web组件编译出在现在的浏览器运行的代码。Dart团队目前支持构建Web组件https://github.com/dart-lang/dart-web-components,您可以接下来试试吧。学习http://blog.sethladd.com/2012/11/your-first-web-component-with-dart.html

总结

我很高兴能够澄清Dart的一些误解,感谢Addy的采访。Dart仍在不断发展,我们喜欢反馈。你可以找到更多信息在http://dartlang.org,跟随我们的开源在https://github.com/dart-lang工作,一些包含bugs和功能的请求在网址 http://dartbug.com。我们期待着您的回音!