CoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScript
CoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScript
检查 Node 内置的 source map 堆栈跟踪转换是否已启用。
nodeSourceMapsSupportEnabled = process? and (
process.execArgv.includes('--enable-source-maps') or
process.env.NODE_OPTIONS?.includes('--enable-source-maps')
)
unless Error.prepareStackTrace or nodeSourceMapsSupportEnabled
cacheSourceMaps = true
patchStackTrace()
加载并运行 Node 的 CoffeeScript 文件,去除任何 BOM
。
loadFile = (module, filename) ->
options = module.options or getRootModule(module).options or {}
目前 CoffeeScript.compile
会缓存所有存在的 source map。它们可以通过 filename
获取的 getSourceMap
获取。
if cacheSourceMaps or nodeSourceMapsSupportEnabled
options.inlineMap = true
js = CoffeeScript._compileFile filename, options
module._compile js, filename
如果安装的 Node 版本支持 require.extensions
,则将 CoffeeScript 注册为扩展。
if require.extensions
for ext in CoffeeScript.FILE_EXTENSIONS
require.extensions[ext] = loadFile
修补 Node 的模块加载器,使其能够处理多点扩展。这是一种糟糕的做法,不应该被要求。
Module = require 'module'
findExtension = (filename) ->
extensions = path.basename(filename).split '.'
从点文件移除初始点。
extensions.shift() if extensions[0] is ''
从最长的可能扩展开始,逐步缩短。
while extensions.shift()
curExtension = '.' + extensions.join '.'
return curExtension if Module._extensions[curExtension]
'.js'
Module::load = (filename) ->
@filename = filename
@paths = Module._nodeModulePaths path.dirname filename
extension = findExtension filename
Module._extensions[extension](this, filename)
@loaded = true
如果我们在 Node 上,则修补 child_process.fork
,以便 Coffee 脚本能够直接 fork CoffeeScript 文件和 JavaScript 文件。
if child_process
{fork} = child_process
binary = require.resolve '../../bin/coffee'
child_process.fork = (path, args, options) ->
if helpers.isCoffee path
unless Array.isArray args
options = args or {}
args = []
args = [path].concat args
path = binary
fork path, args, options
用于查找附加到最顶层模块的 options
对象的实用程序函数。
getRootModule = (module) ->
if module.parent then getRootModule module.parent else module