【问题标题】:Testing Closure Compiler output under Node.js在 Node.js 下测试 Closure Compiler 输出
【发布时间】:2011-12-05 03:27:10
【问题描述】:

我想使用 Vows 来测试无 DOM 的 JavaScript 代码,最好是直接针对已编译的 JS 运行。 我的誓言是用 CoffeeScript 编写的,但我不知道如何加载我的 JS;我尝试使用 eval 内联它:

vows = require "vows"
assert = require "assert"
eval('var e=this;function f(a,g){var c=a.split("."),b=e;!(c[0]in b)&&b.execScript&&b.execScript("var "+c[0]);for(var d;c.length&&(d=c.shift());)!c.length&&g!==void 0?b[d]=g:b=b[d]?b[d]:b[d]={}}function h(a){a.call(e)};(function(){var a;a={};h(function(){a=function(a){this.a=a};a.prototype.b=function(a){return this.a+a.a};f("Cl.LinearExpression",a);f("Cl.LinearExpression.prototype.plus",a.prototype.b)})}).call(this);');

vows
  .describe("Linear Expression")
  .addBatch
    "initialized with a number":
      topic: -> new Cl.LinearExpression 5

      "adds up with scalar": (cle) -> assert.equal 7, cle.plus 2

  .export(module)

但我得到“ReferenceError: Cl is not defined”。 在浏览器控制台中运行缩小的 JS 和 new Cl.LinearExpression(5); 可以正常工作,因此编译后的代码是可以的。 将 JS 加载到节点以供 Vows 测试的最佳方式是什么?

【问题讨论】:

  • 你可以用反引号内联JS,不要使用eval。

标签: node.js coffeescript google-closure-compiler vows


【解决方案1】:

与其使用eval,不如使用Node的require?您可以指向相对目录中的.js.coffee 文件,如下所示:

Cl = require './cl.js'

在该文件中,添加行

module.exports = Cl

当文件为required时,require的返回值为模块的exports

【讨论】:

  • 我想避免在我编译的 JS 中声明 module.exports,因为我不会将它作为节点库运行。我只是尝试过,但我收到错误“Cl is not defined”,堆栈跟踪显示它来自“cl.js”。似乎 Node 评估 JS 的方式与 Chrome 不同。
  • 你也可以写this.Cl = ...(在最外层范围内)。这将在浏览器中创建一个名为 Cl 的全局,并在 Node.js 中创建一个名为 Cl 的导出。使用 {Cl} = require './cl' 从您的测试中访问导出的对象。
  • 我不是在我的 JS 中的任何地方说 Cl = --- 它是由 Google 的 Closure 编译器编译的(具有高级优化功能),并且正在发生一些似乎在浏览器中起作用的魔法,但是不在节点中。
  • 那么您可能希望在浏览器环境中进行测试。如果你使用js-test-driver,你可以从命令行运行浏览器测试。
【解决方案2】:

您可以使用反引号按原样嵌入 javascript。

`var e=this;function f(a,g){ ... `

【讨论】:

  • 我不知道这个,谢谢。这比eval() 说得好,但我得到了同样的错误。
【解决方案3】:

这是一个命名空间问题;导入

codes = require "../out/compiled.js"
for k,v of codes
  global[k] = v

将所有编译好的 JS 对象添加到当前命名空间中,在 Vows 中可以访问它们。

不幸的是,我仍然不知道为什么在 compiled.js 的内联内容中使用 eval() 或反引号不起作用。

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2011-03-13
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多