有没有一种方法可以为require注册新的CoffeeScript扩展?

3
我目前将我的测试文件命名为test.coffee.unit来进行单元测试...(这将产生输出test.spec.unit)。

然而,当调用require "test.coffee.unit"时,Node解释该文件为JavaScript并导致无法评估。我一直在查看文档和https://github.com/jashkenas/coffee-script/blob/master/lib/coffee-script/coffee-script.js#L192,希望找到一种方法,但我没有看到任何有希望的东西。

我还看了一下https://github.com/joyent/node/blob/master/lib/module.js#L347http://nodejs.org/api/modules.html#modules_all_together,以了解其中的信息...

总结:

是否有一种方法可以注册.coffee.unit或只是.unit扩展,使require将其评估为CoffeeScript?

1个回答

1
你有两个选择。
  1. 修改 coffee-script 源代码。
  2. 提取所需的源代码部分,并将其修改为适用于不同范围的代码。
对于任何一种方法,你都需要参考 coffee-script node 模块的 section-19 部分
相关代码展示了如何配置 require 扩展:
if require.extensions
  for ext in ['.coffee', '.litcoffee', '.coffee.md']
    require.extensions[ext] = loadFile

coffee-script 代码用于加载文件的方式:

loadFile = (module, filename) ->
  raw = fs.readFileSync filename, 'utf8'
  stripped = if raw.charCodeAt(0) is 0xFEFF then raw.substring 1 else raw
  answer = compile(stripped, {filename, sourceMap: true, literate: helpers.isLiterate filename})
  sourceMaps[filename] = answer.sourceMap
  module._compile answer.js, filename

你需要追踪依赖项。大多数依赖项都在coffee-script模块的导出中。例如,
compile(stripped, {filename, sourceMap: true, literate: helpers.isLiterate filename})

cs = require 'coffee-script'
cs.compile(stripped, {filename, sourceMap: true, literate: cs.helpers.isLiterate filename})

非常欢迎您编辑此答案并提供完整的解决方案。


谢谢!很遗憾咖啡并没有更简单的机制来注册扩展。好答案... - Rehno Lindeque
1
是的...这是一个简单的解决方案来更改代码。只需要导出loadFile即可。 - Brigand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接