作为一名长期参与JavaScript编程的程序员,尽管阅读了很多文章,但仍有以下问题尚不清楚。
以下代码,
class Animal {
constructor(public name) { }
move(meters) {
console.log(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
move() {
console.log("Slithering...");
super.move(5);
}
}
class Horse extends Animal {
move() {
console.log("Galloping...");
super.move(45);
}
var sam = new Snake("Sammy the Python")
var tom: Animal = new Horse("Tommy the Palomino")
sam.move()
tom.move(34)
是否需要将其转换为ES5兼容形式才能与Node.js一起运行?
最后,我可以尝试使用类似上面的TypeScript / ES6代码的任何在线网站吗?
Unexpected strict mode reserved word
和console
输出无效。 请帮忙。谢谢。
答案 0 :(得分:12)
看看浏览器对ES6(ECMAScript 2015)的支持,我可以看到支持级别远低于Node.js,所以问题是,
许多不同的浏览器和许多不同的Javascript引擎,每个都有自己的ES6支持级别。 node.js的最新版本通常是V8引擎支持的最新版本。许多浏览器具有更长的发布周期,可能不是最新的,但每个浏览器都不同,并且有自己的发布策略和ES6支持级别。
如果Node.js和浏览器都使用现代V8引擎,为什么支持级别如此不同?
如果您将最新版本的node.js与Windows上最新版本的Chrome进行比较,您将不会发现支持方面存在很大差异。您正在查看的ES6支持图表对我来说似乎很老。例如,Chrome长期以来一直支持Set
对象,但您的图表显示false
。
看看Node.js中的ES6支持,我看到现在真的很少有ES6功能不受支持。但是,图表中支持的含义究竟是什么?即,
支持意味着您可以在没有转换器的情况下直接使用该功能,但其准确程度取决于声明它的文档的来源。一些文档对给定特征的所有各种边缘情况进行了广泛的测试。
其他人只是寻求一般实施。因此,例如,如果您正在查看对Set
对象的支持,并且它说"支持",那么这意味着您可以只编写使用{的纯Javascript {1}}对象,它将起作用。该文档的准确程度取决于其数据来源及其测试的彻底性。
这是否意味着即使我使用支持ES6功能编写,我仍然需要使用Babel编译器将ES6代码编译为ES5以便Node.js使用它?
没有。在支持ES6中给定功能的Javascript引擎中,您可以为该功能编写ES6代码,并直接在该Javascript引擎中运行它。不需要转换。
对于为Node.js运行的TypeScript ES6风格的JavaScript代码,它们仍然需要转换为ES5兼容形式,尽管Node.js几乎涵盖了所有ES6专长,对吗?即,
您显示的类定义是纯ES6代码。这些将在支持ES6的Javascript引擎中正常工作。
如果您编写Typescript代码,那么您必须将TypeScript转换为Javascript,因为没有Javascript引擎(我知道)直接支持TypeScript。将FormScript转换为Javascript时,通常可以指定是否希望转换器生成ES5兼容代码(将在ES5引擎或ES6引擎中运行)或ES6兼容代码(仅在ES6引擎中运行),具体取决于你的目标环境能够做什么。
是否需要将其转换为ES5兼容格式才能与Node.js一起运行?
您的特定代码似乎包含至少一个需要转换的TypeScript样式变量声明。其余的看起来像普通的ES6 Javascript,它可以在任何ES6引擎中运行而无需转换。
当我删除TypeScript时,修复代码中的一些语法错误并正确实现Set
构造函数,然后此代码在node.js v8.8.1(我目前已安装)中运行正常所有在Windows 10上的Chrome 63.0.3239.132,Edge 41.16299.15.0和Firefox 57.0.4:
Animal

您可以在任何希望查看结果的浏览器中自行运行此代码段(假设浏览器足够现代,可以支持堆栈溢出信号)。它适用于除IE 11.192.16299.0之外的所有当前版本的浏览器(毫不奇怪,IE不支持ES6)。
我将它复制到我的Chrome控制台,并收到一个我不明白的错误 - 意外的严格模式保留字,
当我尝试在node.js中运行您的代码,直到我从中删除TypeScript以便它只是简单的ES6时,这发生在我身上。我认为这个特殊错误是由此行中的 // Generic ES6 code
class Animal {
constructor(name) {
this.name = name;
}
move(meters) {
console.log(this.name + " moved " + meters + "m.");
}
}
class Snake extends Animal {
move() {
console.log("Slithering...");
super.move(5);
}
}
class Horse extends Animal {
move() {
console.log("Galloping...");
super.move(45);
}
}
var sam = new Snake("Sammy the Python");
var tom = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
引起的:
public
因为这不是ES6规范的一部分(它显然是TypeScript的一部分)。
似乎有一个问题是你想要问的问题,但并没有明确表达出来:"你怎么知道你是否需要转换?&# 34。
答案是您必须了解您希望运行的目标环境与您计划使用的最新功能之间的交叉。如果您正在编写仅在node.js中运行的服务器端代码,那么它就会简单得多。检查一个综合表格,例如http://node.green/,研究它对您计划使用的node.js版本所说的内容以及相关功能。如果它表明您应该能够使用该功能,那么使用该功能编写代码,为其编写测试用例并验证您编写的代码和您使用的功能是否都有效。将此内容添加到您的知识体系中,了解您可以在该版本的node.js中使用和不能使用的内容。然后,您可以假设node.js的所有未来版本也将支持该功能。
如果您正在编写代码以在浏览器中运行,那么生活就会复杂得多。如果您打算支持很多浏览器,并且根本不想担心ES6支持,那么只需转换到ES5目标并继续开展业务。
如果您想使用非转换代码,那么您需要在很多浏览器中进行大量测试。您必须首先确定要支持哪些浏览器的版本,然后您必须编写代码和测试用例,并且必须在您计划支持的每个浏览器中进行测试。真的没有捷径。当您发现无法正常工作的内容时,您必须寻找填充或解决方法或停止使用该ES6功能。
答案 1 :(得分:0)
在将要使用代码的环境中测试代码。使用可用的方法在您使用代码的环境中实现特定的标准或规范。或者尝试自己创建一种方法来解决在开发代码期间遇到的问题,同时注意到其他人能够从他们自己的角度解决和解决问题,错误或要求的进展和持久性问题。
简单地说,由于文档声明浏览器已实现规范或标准并不意味着实现与规范一致或根本没有实现。验证浏览器是否实现标准的唯一方法是自己测试代码。文件问题并尝试自己修复错误。
浏览器使用不同的引擎,包括Gecko,WebKit,而不仅仅V8;并且可以在规范的名称和实现方面随时间变化;见Monitor and potentially deprecate support for multitrack SourceBuffer support of 'sequence' AppendMode; How to use "segments" mode at SourceBuffer of MediaSource to render same result at Chomium, Chorme and Firefox?。有很多浏览器。例如,Lynx不使用V8。
网络平台测试项目是W3C协调尝试构建的 用于Web平台堆栈的跨浏览器测试套件。写一个测试 允许它们在所有浏览器中运行的方式提供浏览器项目 相信他们正在运送与之兼容的软件 其他实现,以及后面的实现 与他们的实现兼容。这反过来又给了Web 作者/开发人员相信他们实际上可以依赖Web 平台,以实现跨浏览器和工作的承诺 设备不需要额外的抽象层来覆盖 规范编辑和实施者留下的空白。
例如,对Web Speech API进行一次测试,其中volume
属性被指定为能够设置,但在设置{时,无法检测到Chromium或Firefox的音频输出更改{1}} volume
的属性指定范围内的不同值。
规格与实际浏览器实施完全不同。如果实施的话,可以在实际的浏览器实现之前很好地编写规范或标准。您可以使用browserify,或自己编写代码以在浏览器中使用NodeJS模块或其他非本机代码。