Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dart是如何编译成javascript的?_Javascript_Dart - Fatal编程技术网

dart是如何编译成javascript的?

dart是如何编译成javascript的?,javascript,dart,Javascript,Dart,我使用dart2js编译.dart文件,但编译后的.js文件包含我不希望看到的代码。dart如何编译成javascript dart代码: import 'dart:html'; void main() { querySelector("#answer").onClick.listen(check); } void check(MouseEvent event){ var answer; answer = (querySelector("#text_answer") as In

我使用dart2js编译.dart文件,但编译后的.js文件包含我不希望看到的代码。dart如何编译成javascript

dart代码:

import 'dart:html';


void main() {
  querySelector("#answer").onClick.listen(check);
}

void check(MouseEvent event){
  var answer;
  answer = (querySelector("#text_answer") as InputElement).value;
  answer = answer.toUpperCase();

  if (answer == "CHOCOLATE") {
    querySelector("#text").text = "Smells like... you are right! Well, try to find somthing round, made of glass;)";
    return;
  } else {
    querySelector("#text").text = "No, No, No. Try one more time. There’s white and milk and dark. These three types you might eat. As a type of candy, it really can’t be beat";
  }
}

编译后的.js代码有7000多行(没有注释)。

其中有相当多的代码模拟Dart提供的功能,但无法直接转换为ES5(如类、混合等)

还有相当多的代码包含了polyfills缺少的浏览器功能,使相同的Dart代码可以在所有浏览器中工作,例如jQuery

理论上,这段代码可以放在一个库文件中(
像jQuery
),但这个文件会很大

为了减小大小,Dart使用树抖动(去除所有未从
main()
文件中实际引用的代码(直接或可传递)。此外,还可以删除未使用的类的所有方法或未使用的库函数,以及使用其他部分的类和库

这意味着对于每个应用程序,JS输出中实际包含的Dart库部分可能会有所不同。
因此,除了手工编写的应用程序代码生成的js之外,不可能有一个默认的
dart.js
文件添加到
index.html

您没想到会看到什么?问题在于名为
dart2js
的工具不是编译器。编译器将高级编程语言转换为低级编程语言高级编程语言。但是Javasrcript不是一种低级编程语言。dart2js是一种transpiler(我不知道为什么Google Dart开发人员将这种过程称为编译而不是翻译)。这种不准确(编译而不是翻译)可能会误导任何人(例如,这个问题的作者)但一切都是正确的,dartjs翻译代码并添加运行库代码。从技术上讲,“编译器”将一种语言的程序转换为另一种语言的语义等效程序。它与直接执行程序的“解释器”不同。“transpiler”只是编译器的另一个名称,通常只用于编译成另一种用户可写语言(例如,从Dart到JavaScript),而不是低级机器语言(assemebler、字节码、机器码)。不过,Transpiler是编译器,因此将dart2js称为编译器是正确的。