xpt*_*xpt 9 javascript node.js typescript
作为一名长期参与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)
Run Code Online (Sandbox Code Playgroud)
是否需要将其转换为ES5兼容形式才能与Node.js一起运行?
最后,我可以尝试使用类似于上面的TypeScript/ES6代码的任何在线网站吗?
Unexpected strict mode reserved word和console输出没有在那里工作.请帮忙.谢谢.
jfr*_*d00 14
看看浏览器对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对象的支持并且它表示"支持",那么这意味着您可以只编写使用该Set对象的纯Javascript,它就可以正常工作.该文档的准确程度取决于其数据来源及其测试的彻底性.
这是否意味着即使我使用支持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,修复代码中的一些语法错误并Animal正确实现构造函数时,此代码在node.js v8.8.1(我目前已安装)和Chrome 63.0.3239.132,Edge 41.16299中工作正常.所有在Windows 10上的15.0和Firefox 57.0.4:
// 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);Run Code Online (Sandbox Code Playgroud)
您可以在任何希望查看结果的浏览器中自行运行此代码段(假设浏览器足够现代以支持堆栈溢出信号).它适用于除IE 11.192.16299.0之外的所有当前版本的浏览器(毫不奇怪IE不支持ES6).
我将它复制到我的chrome控制台,并得到一个我不明白的错误 - 意外的严格模式保留字,
当我尝试在node.js中运行你的代码直到我从中删除TypeScript以便它只是简单的ES6时,这发生在我身上.我认为这个特殊错误是由public以下行引起的:
constructor(public name) { }
Run Code Online (Sandbox Code Playgroud)
因为那不是ES6规范的一部分(它显然是TypeScript的一部分).
似乎有一个问题是你想要问的,但是没有明确表达的是:"你怎么知道你是否必须转变?".
答案是您必须了解要运行的目标环境与计划使用的最新功能之间的交叉.如果您正在编写仅在node.js中运行的服务器端代码,那么它就会简单得多.检查一个综合表格,例如http://node.green/,研究它对您计划使用的node.js版本所说的内容以及相关功能.如果它表明您应该能够使用该功能,那么使用该功能编写代码,为其编写测试用例并验证您编写的代码和您使用的功能是否都有效.将该内容添加到您的知识体系中,了解您可以在该版本的node.js中使用和不使用的内容.然后,您可以假设node.js的所有未来版本也将支持该功能.
如果您正在编写代码以在浏览器中运行,那么生活就会复杂得多.如果您计划支持许多浏览器并且根本不想担心ES6支持,那么只需转换到ES5目标并开始您的业务.
如果你想使用非转换代码,那么你需要在很多浏览器中做很多测试.你必须先指定到底哪个哪个版本的浏览器,你要支持,然后你必须写代码和测试用例,你必须向你打算支持所有浏览器中测试英寸 真的没有捷径.当您发现不起作用的东西时,您将不得不寻找polyfill或解决方法或停止使用该ES6功能.
| 归档时间: |
|
| 查看次数: |
11804 次 |
| 最近记录: |