出于好奇,coffee-script 模块如何处理 require 'xxx'?它必须先编译所需的文件,然后节点才能加载它......它是否对'require'函数有特定的处理?
谢谢。
出于好奇,coffee-script 模块如何处理 require 'xxx'?它必须先编译所需的文件,然后节点才能加载它......它是否对'require'函数有特定的处理?
谢谢。
看起来这一切都在这里处理:
https://github.com/jashkenas/coffee-script/blob/master/src/extensions.coffee
这利用了节点注册在加载时运行回调的扩展的能力。现在似乎已弃用此功能,但该功能仍然存在并且可以正常工作。
它也做其他事情,包括一些粗糙的猴子补丁,但这是最相关的片段:
# Load and run a CoffeeScript file for Node, stripping any `BOM`s.
loadFile = (module, filename) ->
answer = CoffeeScript._compileFile filename, false
module._compile answer, filename
# If the installed version of Node supports `require.extensions`, register
# CoffeeScript as an extension.
if require.extensions
for ext in CoffeeScript.FILE_EXTENSIONS
require.extensions[ext] = loadFile
所以如果我有一个coffee
文件与该行
x = require './ls.coffee'
并直接用咖啡运行它,例如coffee foo.coffee
,ls.coffee
加载咖啡扩展(编译并运行)。
但是,如果我编译该脚本coffee -c foo.coffee
并使用 node 运行它,node foo.js
则会出现错误。Node 不再有require
扩展集,它看到的只是 Coffeescript 代码。