JavaScript的替代品


144

目前,唯一受完全支持的语言以及浏览器中用于DOM树操作的实际标准是JavaScript。看起来它具有深刻的设计问题,这使它成为了新手的漏洞和安全漏洞的雷区。

您是否知道存在任何现有或计划中的计划,以便在下一代浏览器中引入更好的(重新设计的)任何种类的语言(不仅是JavaScript)用于DOM树操作和HTTP请求?如果是,那么将其集成到Firefox中的路线图是什么?如果不是,出于什么原因(除了互操作性之外),JavaScript应该是浏览器平台上唯一受支持的语言吗?

我已经使用过jQuery,并且还阅读了“ javascript:好的部分”。确实,这些建议是好的,但是我无法理解的是:为什么只有javascript?在服务器端(您最喜欢的OS平台)上,我们可以使用每种语言(甚至是fortran)来操作DOM树。为什么客户端(浏览器平台)仅支持javascript?


4
Google Dart,Script#,CoffeeScript,JSX(这两种JS的不同实现),JavaScript Harmony等。有关更多信息,请参
见此

25
好问题。在10天内开发出的语言在2013

2
“为什么只使用javascript?在服务器端(您最喜欢的os平台)上,我们可以使用每种语言(甚至是fortran)来操作DOM树。为什么客户端(浏览器平台)仅支持javascript?” 在服务器端,您可以安装所需的任何东西,但是我不能强迫您的客户端安装其他插件/附加组件,如果我们有这么多的bug和javascript安全问题,请猜测如果有那么多的bug和安全问题,我们再添加一些吗?
彼得

6
@Peter我不知道你的论点是认真的还是在开玩笑。如果需要,人们可以很容易地安装平台。如果可以使用Javascript的替代方法并行之有效,那么商业提供商将只需要用户下载运行它所需的所有内容,就像他们一向使用Flash所做的一样,以及一时间使用Silverlight所做的。在客户端可能不会出现替代方案的所有原因中,确保您的用户拥有您的平台的困难并不是其中一个重要的问题。
2015年

1
@ely:结果很好吗?闪?Java小程序?银光?我什至从未安装过Silverlight实例。
塞巴斯蒂安·马赫

Answers:


41

javascript的问题不在于语言本身,而是一种完美的原型化和动态语言。如果您是来自OO的背景,则有一些学习上的困难,但这不是语言的错。

大多数人认为Javascript类似于Java,因为它具有相似的语法和相似的名称,但实际上它更像Lisp。实际上,它非常适合DOM操作。

真正的问题是它是由浏览器编译的,这意味着它根据客户端的使用方式非常不同。

实际的DOM不仅因浏览器而异,而且在性能和布局上也有很大差异。


修改以下有问题的说明

假设支持多种解释语言-您仍然遇到相同的问题。各种浏览器仍然会出现故障,并且具有不同的DOM。

另外,您还必须为每种语言在浏览器中内置一个解释程序,或者以某种方式将其安装为插件(可以在提供页面之前进行检查)。为了使Javascript保持一致需要很长时间。

您不能以相同的方式使用编译语言-然后,您将介绍一个不容易对其功能进行仔细检查的可执行文件。许多用户会选择不让它运行。

好的,那么对于已编译代码的某种沙箱呢?在我看来,听起来像Java Applets。或Flash中的ActionScript。或Silverlight中的C#。

某种IL标准呢?那有更多的潜力。用所需的任何语言进行开发,然后将其编译为IL,然后由浏览器将其编译为IL。

除此之外,Javascript已经是IL的一种了-只看GWT即可。它使您可以用Java编写程序,但可以将它们分发为HTML和JS。


进行进一步澄清后进行编辑

Javascript不是浏览器支持的语言,或者不是,不是浏览器支持的唯一语言:在Internet Explorer的黑暗年代,您可以选择Javascript或VBScript在IE中运行。从技术上讲,IE甚至没有运行Javascript-它运行了JScript(主要是为了避免向Sun支付Java一词的费用,Oracle仍然拥有Javascript的名称)。

问题在于VBScript是Microsoft专有的,而且还不是很好。尽管Javascript在其他浏览器(例如FireBug)中添加了功能并获得了一流的调试工具,但VBScript仍然仅支持IE,并且几乎不可调试(IE4 / 5/6中的开发工具不存在)。同时,VBScript也进行了扩展,成为OS中非常强大的脚本编写工具,但是浏览器中没有这些功能(当它们成为巨大的安全漏洞时)。

仍然有一些使用VBScript的公司内部应用程序(有些依赖于这些安全漏洞),并且它们仍在运行IE7(它们只是停止了IE6,因为MS最终将其杀死了)。

使Javascript达到目前的状态一直是一场噩梦,并且花费了20年的时间。它仍然没有一致的支持,某些浏览器仍然缺少语言功能(1999年指定),并且需要大量填充。

添加用于在浏览器中解释的备用语言面临两个主要问题:

  • 让所有浏览器供应商实施新的语言标准,这是他们20年来仍未针对Javascript进行管理的东西。

  • 第二种语言可能会削弱您已经拥有的支持,从而(例如)允许IE获得一流的Javascript支持,但又具有出色的VBScript。我真的不想为不同的浏览器使用不同的语言编写代码。

应当指出,Javascript还没有“完成”,它还在不断发展以在新的浏览器中变得更好。在最新的版本是超前于浏览器的实现年,他们的下一个工作。


5
我会说它是浏览器的“解释”,而不是“编译”的。
Flavius Stef,2009年

19
较新的浏览器在JavaScript上进行JIT编译。
Nosredna,2009年

4
我还搜索了jit声明,事实证明,Firefox 3.1将内置支持。请查看andreasgal.com/2008/08/22/tracing-the-webpeople.mozilla.com/~schrep/ tm-image-adjustment.swf
Flavius Stef

2
V8 JavaScript引擎(chrome)直接编译。
戴夫·史密斯,

3
我强烈不同意您的第一个回答“ JavaScript的问题不是语言本身”。我认为这在语法上是一种非常丑陋的语言,并且缺少您从大多数其他语言中获得的功能。至少我仍然需要大型应用程序中的功能(加载依赖项,可读的 OO原理)。如果我们必须从头开始(互联网),我认为JavaScript并不是语言的“最佳”选择。
SirLenz0rlot

28

编译成Javascript

就目前而言,使用一种可编译为Javascript的语言似乎是在编写更智能的代码时访问所有平台的唯一现实方法,而且很可能会长期存在。对于任何新产品,总会有某些原因使一个或多个供应商不急于发货。

(但是我真的不认为这是个问题。Javascript现在已经得到了很好的优化。如果用手工编写,机器代码也是不安全的,但是可以作为编译目标和执行语言使用。)

这么多的选择

有越来越多的语言可以编译为Javascript。可以在这里找到一个相当全面的列表:

值得注意的

我会提到一些我认为值得注意的(无疑会忽略一些我不知道的宝石):

  • Spider出现在2016年。它声称采用了Go,Swift,Python,C#和CoffeeScript的最佳创意。它不是类型安全的,但确实有一些次要的安全功能

  • Elm:Haskell可能是所有语言最聪明的语言,而Elm是Haskell for Javascript的变体。它具有高度的类型意识和简洁性,并提供功能性反应式编程,作为反应性模板或MVC意大利面的巧妙替代。但是对于过程程序员来说,这可能是一个很大的震惊

  • Google's Go的目标是简洁,简单和安全。Gopher可以通过GopherJS将Go代码编译成Javascript 。

  • Dart是Google后来取代Javascript的尝试。它通过类似于C / Java的语法以及可选的类型提供接口和抽象类。

  • Haxe类似于Flash的ActionScript,但是它可以针对多种语言,因此您的代码可以在Java,C,Flash,PHP和Javascript程序中重复使用。它提供类型安全和动态的对象。

  • Opalang在Javascript中添加了语法糖,以提供直接的数据库访问,智能的延续,类型检查并协助客户端/服务器分离。(绑定到NodeJS和MongoDB。)

  • GorillaScript“一种可编译为JavaScript的语言,旨在在尝试防止某些常见错误的同时向用户授权。” 与Coffeescript相似,但功能更全面,它提供了许多附加功能,以提高安全性并减少重复的样板样式。

  • LiteScript介于Coffeescript和GorillaScript之间。它为“内联”回调提供异步/ yield语法,并检查变量的拼写错误。

  • 微软的TypeScript是Javascript的一个小型超集,可让您对函数参数进行类型限制,这可能会捕获一些错误。同样,BetterJS允许您应用限制,但是在纯Javascript中,可以通过添加额外的调用或通过在JSDoc注释中指定类型来应用限制。现在,Facebook提供了另外执行类型推断的Flow

  • LiveScript是从Coffeescript衍生而来的,其简洁性广为人知,但对我来说却不太可读。可能不是团队的最佳选择。

如何选择?

选择另一种语言,有一些因素需要考虑

  • 如果将来有其他开发人员加入您的项目,他们要花多长时间才能上手并学习这种语言,或者他们已经知道它的机会是多少?

  • 该语言功能太少(代码仍将充满样板)还是功能太多(掌握将花费很长时间,并且在此之前某些有效代码可能无法辨认)?

  • 它具有项目所需的功能吗?(您的项目是否需要类型检查和接口?是否需要智能的延续以避免嵌套的回调地狱?是否有很多反应性?将来是否可能需要针对其他环境?)

未来...

杰夫·沃克(Jeff Walker)写了一系列令人发人深省的有关“ Javascript问题”的博客文章,包括为什么他认为TypeScriptDartCoffeescript都不能提供适当的解决方案。他在结论中提出了一些改进语言的理想功能。


ES6扩展了Javascript的功能,使您可以更清楚地指定类,并通过生成器“内联异步”。仍然是动态输入!
joeytwiddle

Elm的方法类似于氮气或N2O(erlang框架),这就是我喜欢它的原因。
DenisKolodin '16

如今,我们在ES8和TypeScript中以及异步等待中都有一些CoffeeScript的语法糖。TypeScript防止了我工作场所的许多错误,尽管仍有一些意外的机会!
joeytwiddle

现在还有Wasm,它允许各种其他语言在浏览器中运行。但是,与DOM的通信仍在通过JavaScript进行。
joeytwiddle

22

JavaScript应该是浏览器平台上唯一受支持的语言吗?

是的,没有。谷歌有一种叫做Dart的替代方法,它确实可以编译为JavaScript,就像jQuery一样,它试图使DOM操作更加容易。尝试一下可能会很有趣,请检查一下。

也可以看看


15

确实,JavaScript在某一点上很难处理,但是自那时以来,Web开发社区已经走了很长一段路。相反,我鼓励您看看jQuery。这很容易,并且抽象出了所有各种问题。

确实没有其他方法可以全面使用。想到了Flash,但ECMA脚本也是如此,对于大多数事情来说,它可能已被淘汰。


1
或MooTools,Prototype和Dojo。jqueryvsmootools.com是mootools和jquery之间的绝佳比较。
莱恩·佛罗伦萨

Javascript天生没有错。您可能会提到IE的JScript中的问题以及一般的渲染问题以及与各种浏览器的不一致。
加文2009年

7

短期而言,我会使用jQuery之类的东西来隐藏浏览器的不兼容性。从长远来看,像Silverlight或Adobe AIR之类的技术可能会使其在将来成为一个非常不同的雷区(但仍然是雷区)。


1
+1用于使用jQuery隐藏浏览器不兼容性。我读了一本书,解释了其中一些机制的工作原理,当我说jQuery减轻了该部门程序员的头疼时,我深信不疑。
维维安河

1
事后看技术答案总是很奇怪。现在我们知道了网络赢了:银光,闪光灯和空气都死了,剩下的胜利者在所有怪异而奇妙的咒语中都使用了javascript。
oligofren 2015年

6

道格·克罗克福德 Doug Crockford )向Google演讲详细介绍了JavaScript的坏处和未来。自1999年以来,它实际上并没有发生太大变化-可以说是一件好事(只要您知道它们的局限性,几乎所有浏览器都可以运行相同的代码),而Doug展示了这些优点的所在大多是误会,结果却非常有力。

对于DOM操作,可以将JQuery看作是一个客户端库,该客户端库用一些难以替换的糟糕的DOM API替换为易于编写的精美代码。


5

如果您认为JavaScript有很多问题,建议您参阅Doug Crockford的书, JavaScript:The Good Parts。(或者在Google的“ Crockford JavaScript”中找到他做过的几个视频演示。)Crockford勾画出一个安全的子集和一组实践,并特别列出了要避免的部分语言。

我没有计划将JavaScript替换为操作DOM的实际方法。因此,最好学会安全好地使用它。


1
再读一遍。显然,他在阅读答案后编辑了问题。
戴夫·史密斯

4

在客户端方面,Javascript是操作DOM的唯一方法。就服务器端而言,有多种方法。


4

Internet Explorer支持可插拔脚本语言,尽管IE中唯一可靠地包括JScript的是VBScript。

据我所知,浏览器中似乎普遍存在对动态语言的偏见,而JavaScript似乎足以满足这种需求,因此网络效应使其他任何语言都无法使用。该语言实际上非常强大,尽管它在浏览器中的实现还有很多不足之处。


1
不要在IE中使用VBScript-大MS认为这是VB的一种可怕变体,但事实并非如此。它实际上不像正常的VB或VBScript那样工作,并且Javascript的运行速度较慢。
基思

1
例如,非浏览器实现中可用的WebKit或Gecko的JavaScript / ECMAScript实现缺少什么?那句话使我完全困惑。
2009年

4

如果您愿意将您的客户/访问者限制在特定的浏览器上,并且可能希望要求他们安装插件,则可以查看MS Silverlight - Wikipedia上具有可读性的概述。使用Silverlight 2,您可以在客户端运行以C#,IronPython,IronRuby,VB.NET等编写的代码;来自Mono项目的Silverlight 的免费Moonlight克隆承诺将为Linux带来相同的功能。

实际上,大多数Web应用程序和网站的开发人员都希望达到Silverlight(最终是Moonlight)目前无法提供的更广泛的受众-这意味着坚持使用Javascript,或者可能是Flash(使用类似的编程语言ActionScript)。

因此,即使对于拥有庞大的工程师团队和营销预算以及附带免费软件项目的Microsoft来说,获得实质性的思想份额,采用和吸引其他任何东西也被证明是一场艰苦的战斗(以减轻对专有锁定的担心) ),这可能有助于解释为什么Mozilla基金会(例如Mozilla Foundation)对实现这一目标的兴趣很少。您说:“除了互操作性”,但是鉴于我们观察到Silverlight的进步,显然,互操作性的问题在这里很重要。


3

如前所述,您具有Flash(ActionScript,这是Javascript的派生语言)和Silverlight / Moonlight(IronPython,IronRuby,JScript,VBScript,C#)可以通过插件在浏览器中运行(第一个更为普遍) 。

如果您喜欢Ruby ,还有另一种选择:HotRuby,它是JavaScript中的ruby实现,将在浏览器中运行。它还不是很成熟,但是您可以看一下。


3

我还没有看到提到的一件事(哦,我在写作时看到Alcides提到了HotRuby,Nosredna提到了GWT和Script#),并且想抛弃一下,有[插入语言]的许多实现- JavaScript(例如,允许您将RubyPythonC#JavaObj-J / Cappuccino [类似于Obj-C / Cocoa]或Processing [for Canvas]转换为客户端上或部署前的JavaScript)其中还具有各种抽象库])。当然,如果要在客户端上翻译它会带来性能开销,但是如果您对另一种语言更满意,它将为您提供一定的灵活性。

不过,就我个人而言,我建议学习爱JavaScript。这是一门出色,功能强大的语言,一旦您了解它就相当优雅。我面临着相反的困境,希望获得一个能够满足我所有需求的功能强大的服务器端JavaScript / DOM解决方案。/主动提出的意见


我提到了GWT和Script#。对于那些对Script#感兴趣的人,链接是projects.nikhilk.net/ScriptSharp
Nosredna,2009年

感谢您将我指向Obj-J / Cappuccino。创建Web应用程序真是太棒了,我只打开了它是因为您提到了它,而且名称(和可可相关性)吸引了我。
Timo 2013年

2

不,JavaScript是它,但是它会发展。下一个版本是“ JavaScript和谐”,如果您使用Google可以了解更多信息。

有时,有人建议将字节码解释器与JavaScript一起放入浏览器。至少在一段时间内可能不会发生。

我碰巧喜欢JavaScript。但是,还有其他解决方案,包括将Java编译为JavaScript的GWT和将C#编译为JavaScript的Script#。


2

jQuery(仍然是JavaScript,但是)确实可以帮助您,他们对几乎所有浏览器都具有支持,并且学习起来并不难:)


2

JavaScript是网络的英语。英语历史悠久,因为它有强大的海军征服了各个国家。这可以与使用JavaScript征服网络的大公司相提并论。这是一种来自多种欧洲资源(希腊语,拉丁语,日耳曼语,法语甚至是一些中文和印度语)的语言。多年来,JavaScript从其他语言(结构,面向对象,功能性)中借鉴了很多概念。在不同的地方说英语,方言和口音略有不同,这会使理解变得困难。就像JavaScript有不同的浏览器对它的解释有些不同。

尽管英语一开始很容易学习,但英语的发音却非常不一致,而且例外情况也多于规则。就像JavaScript一样,它总是在提供惊喜。

尽管有不同的口音,JavaScript是网络上的通用语言。就像您可能不是英语并在这里用英语写一样,每个Web浏览器都具有一定程度的英语理解能力。IE6就像那个在履历表上说自己很流利的人,但是只参加了为期两周的英语作为外语课程。

已经尝试取代英语作为世界主要语言,例如世界语。但是他们都失败了,因为地球上大多数人会说英语。同样,很难引入更好的JavaScript替代方案。


1

我认为Javascript不会很快被替换。对于完全不同的富客户端方法,您可能需要研究Flex(基于Flash的技术)。


1

也许类似haxe(请参阅haxe.org)可以为您提供帮助。它是一种看起来比JavaScript干净的语言,可以编译为JavaScript,因此可以在浏览器中运行。

我知道这不是您问题的直接答案,但是我认为这可能对您来说很有趣。


1

许多人都知道Javascript并不是最好的和最漂亮的语言。但是,当前浏览器支持它,因此很难引入其他语言。我们根本不需要其他浏览器大战。

这解释了为什么我不知道切换到另一种客户端语言的计划。

但是我认为,如果您开始考虑DOM模型以及如何使用DOM模型,那么Javascript并不是那么糟糕。DOM模型的工作方式导致了许多与JS杂乱的事情。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.