如何从 .NET 编译 CoffeeScript?

Posted

技术标签:

【中文标题】如何从 .NET 编译 CoffeeScript?【英文标题】:How can I compile CoffeeScript from .NET? 【发布时间】:2011-02-22 04:35:53 【问题描述】:

我想编写一个 HttpHandler,它可以即时编译 CoffeeScript 代码并发送生成的 javascript 代码。我尝试过 MS [JScript][1] 和 IronJS,但没有成功。我不想使用 [Rhino][2],因为 Java 依赖项会使其难以分发。

【问题讨论】:

这也应该被标记为.net,你不觉得吗? 【参考方案1】:

我没有直接的答案,(我希望你能找到答案),但不妨看看下面的内容,看看它是如何完成的。

Jint - .NET 的 JavaScript 解释器 Using IKVM to compile Rhino 将摆脱 Java 运行时要求。 jcoffeescript。我没有看过 jcoffeescript,但我认为这取决于 JRuby 和 Rhino。你也可以IKVM.NET 这个。

【讨论】:

【参考方案2】:

由于 CoffeeScript 编译器现在可以在 Internet Explorer 上运行,经过最近的几次调整,它应该也适用于其他 MS 风格的 JavaScript。尝试从最新版本中包含extras/coffee-script.js,您应该可以使用CoffeeScript.compile(code)

【讨论】:

我已经尝试过在 IE 中运行的版本,它仍然会导致 JScript 和 IronJS 崩溃。 崩溃怎么办?如果您想讨论它或寻求帮助,请随时进入 FreeNode 上的#coffeescript。 我已经更详细地更新了这个问题。 JScript 给出错误,IronJS 使进程崩溃。我没有收到#coffeescript 的回复。 这没有多大意义...... Lexer.extensions 是一个空数组(除非你扩展了 CoffeeScript,但你没有扩展)。我不明白为什么 JScript 不能声明“_e”变量,尤其是当 Internet Explorer 没有问题时。如果您能告诉我如何在 Windows 虚拟机上进行设置 (ha),我会很高兴进行调查。 为了将错误跟踪到行号,我使用了 js 美化器。我认为它引入了我描述的错误。【参考方案3】:

我尝试通过基于 Windows 的脚本主机(或只是 wscript)运行捆绑的 extras/coffee-script.js,但它没有报告任何问题。然后我添加了这一行:

WScript.Echo(CoffeeScript.compile('a: 1'));

在文件末尾并再次通过wscript 运行它,它会正确打印生成的 JavaScript。

你在使用 COM 对象吗?您能否分享更多负责初始化 MScript 对象引用的代码?

【讨论】:

我试过了,它在 WScript 上运行良好,但相同的脚本无法在 Microsoft.JScript.Vsa.VsaEngine 上运行。所以问题是我无法从代码中运行它。 Microsoft.JScript.Vsa 不是已弃用吗? System.CodeDom.Compiler 有什么有用的吗?【参考方案4】:

CoffeeScript-dotnet

用于编译 CoffeeScript 的命令行工具。包括一个文件系统观察程序,以在 CoffeeScripts 更改时自动重新编译它们。大致相当于linux/mac的coffee-script节点包。

CoffeeSharp

包括一个类似于 CoffeeScript-dotnet 的命令行工具以及一个 http 处理程序,当从 asp.net 站点请求时编译 CoffeeScripts。

SassAndCoffeeScript

Asp.net mvc 库,可根据要求编译 sass 和 coffeescript 文件。还支持缩小和合并。

Manually Compile With IronJS

IronJS 是一个 .NET javascript 解释器,可以成功加载 CoffeeScript 编译器并编译 CoffeeScript。

使用 Node.js 手动编译

获取 node binaries 并将 bin 目录添加到您的路径。写一个node.js script to load the CoffeeScript compiler and your CoffeeScript files and save the compiled javascript。

【讨论】:

也不能正常工作。这个 sn-p 导致它失败。 gist.github.com/566951 CoffeeSharp +1。它可以通过 Nuget 获得,但请记住 cmdline 编译器是用 F# 编写的,因此如果您使用 CI,您需要将 Fsharp 核心文件部署到您的 CI 服务器,或者手动构建一个独立的版本并使用它。 【参考方案5】:

我已经设法使用 IKVM、jcoffeescript 和 Rhino 从 .NET 编译 CoffeeScript。这很简单,只是没有参数的 JCoffeeScriptCompiler 构造函数重载不起作用。使用 java.util.Collections.EMPTY_LIST 作为参数运行正常。

我就是这样做的:

    下载 IKVM、jcoffeescript 和 Rhino。 针对 js.jar 运行 ikvmc,创建 js.dll。 针对 jcoffeescript jar 运行 ikvmc。 在 Visual Studio 中添加对 jcoffeescript dll 的引用。可能需要更多参考资料,但您会收到警告。 在您的代码中运行 new org.jcoffeescript.JCoffeeScriptCompiler(java.util.Collections.EMPTY_LIST).compile()。

下一步是创建构建任务和/或 HTTP 处理程序。

【讨论】:

【参考方案6】:

您可以使用 Node.js (here are self-contained Windows binaries),而不是使用 CScript。

【讨论】:

【参考方案7】:

我尝试将未修改的 extras/coffee-script.js 文件编译为 jsc,用于 .NET 的 JScript.NET 编译器,但我遇到了很多错误。以下是值得注意的:

'require' 是一个新的保留字,不应用作标识符 'ensure' 是一个新的保留字,不应用作标识符 “全局对象”类型的对象没有这样的成员

其他错误是由上述错误引起的。

【讨论】:

你编译机智/fast-关闭所有JScript扩展? @Sean McMillan 当我在/extras 中执行jsc /fast- coffee-script.js 时,我收到了太多警告并生成了一个exe 文件。我不确定它是否成功生成。无论如何,我将添加一个代码来处理控制台输入,看看我是否可以让它正常运行。感谢您的提示。【参考方案8】:

查看使用 Jurassic JavaScript 实现的新 coffeescript-dotnet 项目。

【讨论】:

【参考方案9】:

Visual Studio 2010 中的 CoffeeScript

它是 Chirpy 的分支(chirpy 是一种用于混搭、缩小和验证 javascript、样式表和无点文件的工具)

“好的,我想我在我的 fork 上得到了它,主要是基于其他人的工作。检查一下: http://chirpy.codeplex.com/SourceControl/network/Forks/Domenic/CoffeeScriptFixes"

来自http://chirpy.codeplex.com/workitem/48

【讨论】:

【参考方案10】:

Chirpy 现在完全支持 CoffeeScript: http://chirpy.codeplex.com/

【讨论】:

请注意,目前还没有语法高亮。【参考方案11】:

IronJS 现在支持 CoffeeScript,并且通常比其他 .NET JS 引擎更快:

我在这里有一篇关于将两者连接在一起的博文:http://otac0n.com/blog/2011/06/29/CoffeeDemo-A-Simple-Demo-Of-IronJS-Using-CoffeeScript.aspx

【讨论】:

【参考方案12】:

您可能还想查看 jurassic-coffee,它也是一个运行 jurassic 原始编译器的咖啡脚本编译器。

它具有链轮样式“#= require file.coffee”或“#= require file.js”,可用于在编译之前保持 .coffee 文件模块化和组合以及嵌入 .js 文件。

它带有一个带有 .js 和 .coffee 文件的文件观察器的 HttpHandler,它跟踪哪些 .coffee 文件需要重新编译,并将其余部分传递给已编译的 *.js 文件。

jurassic-coffee 也可以作为 Nuget 包使用

https://github.com/creamdog/JurassicCoffee

【讨论】:

【参考方案13】:

你特别说你想写一个运行时编译器,所以这可能不是你想要的,但如果主要是有一种方法来生成 javascript 结果,Mindscape Web Workbench 很有趣。它是 Visual Studio.NET 2010 的免费扩展,可在扩展管理器中使用。它提供 Intellisense、语法高亮并在您编写时编译为 JS。我刚刚开始使用它,但看起来很有希望。 Scott Hanselman 谈到它here。它还支持 LESS 和 Sass。

【讨论】:

【参考方案14】:

我已经完成了一个在幕后使用 Windows Script Host 的 HttpHandler:https://github.com/duncansmart/LessCoffee 并且效果很好(它还编译了 *.less 文件)。

在 NuGet 上:http://nuget.org/List/Packages/LessCoffee

它基于这个简单的包装器:https://github.com/duncansmart/coffeescript-windows

【讨论】:

【参考方案15】:

我使用 v8 编写了一个交互式 shell。

https://github.com/mattn/coffee-script-v8

这作为单个可执行文件工作。 (不要使用外部文件) 它不能使用require()。但足以学习coffeescript。

【讨论】:

【参考方案16】:

我的主编辑器是 VS 2010,我喜欢 WorkBench 扩展。很高兴每次您点击保存时自动编译为 js

他们提供付费版本,可以自动缩小/缩小您的 js 和 css 文件,因为无论如何 your.coffee 和 .scss 都是您的源文件。

我鼓励所有 VS 用户继续安装它,尤其是在您运行 VS 2010 时。

唯一的敲门声,有人请纠正我或启发我,是 .coffee 语法它没有像 html、js、c# 代码那样突出显示。可能是因为我使用了来自http://studiostyl.es/ 的配色方案,并且记录在案http://studiostyl.es/schemes/coffee- 只是共享名称coffee 没有我知道的对coffeescript 的特殊语法高亮支持。但是今天没有理由不开始使用工作台插件!

好的工作台网站声称:语法突出显示,也许是我选择的 studiostyle.es。

【讨论】:

【参考方案17】:

我知道这很旧,但我来这里是为了回答一个非常相似的问题:如何让我的 CoffeeScript 使用 Visual Studio 2012 Express 进行编译?请注意,免费的 Express 版本不允许任何扩展,因此我无法继续使用已经为我服务了相当长一段时间的 Mindscape Workbench 扩展。

事实证明这很容易。只需使用 NuGet 安装 Jurassic-Coffee 包即可。

使用此软件包优于 mindscape 工作台的一个优点是您可以直接从 html 中的脚本标签引用您的咖啡。它会缩小并缓存已编译的 JS,因此您只有在请求的咖啡文件发生更改时才工作。

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="home.coffee"></script>
</head>

mindscape 工作台允许您将不同的咖啡脚本文件捆绑在一起,这对于模块化咖啡脚本非常方便。您也可以使用 Jurassic Coffee 执行此操作,方法是利用 #= require 语句包含其他咖啡模块文件,例如:

#= require Classes\GridWrapper.coffee
class UsersGrid
  constructor:->
     @grid = new GridWrapper()

我认为在咖啡文件中添加 #= require 状态实际上比 Mindscape 工作台方法更干净、更清晰,这种方法将所有这些隐藏在其界面后面,因此您很容易忘记您有哪些依赖项。

注意 有一个潜在的陷阱。 Nuget 安装程序会将 httphandler 条目放入您的 web.config 中,该条目可能与 IIS Express 集成托管管道模式不兼容。

因此您可能会看到以下错误:

检测到不适用于集成的 ASP.NET 设置 托管管道模式。

要解决这个问题,只需删除下面显示的处理程序。

<system.web>
  //other stuff

  <httpHandlers>
    <add type="JurassicCoffee.Web.JurassicCoffeeHttpHandler,JurassicCoffee" validate="false" path="*.coffee" verb="*" />
  </httpHandlers>

</system.web>

【讨论】:

【参考方案18】:

您可以简单地将其移植到 C# 中。我已将 Jison 移植到 C#(这是使 CoffeeScript 运行的基础项目)。我认为这可能有点不同,但两个 Jison 解析器的工作方式相同。

我还没有将请求拉回 Jison 的主要架构,但很快就会这样做。

https://github.com/robertleeplummerjr

【讨论】:

以上是关于如何从 .NET 编译 CoffeeScript?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 包的 distutils 安装的构建阶段编译 CoffeeScript?

编译器如何编译自己?

coffeescript 多行字符串编译成多行字符串

用JavaScript编写的CoffeeScript

在保存时编译 CoffeeScript?

Rails 啥时候编译 CoffeeScript?