CoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScriptCoffeeScript = require './'
child_process = require 'child_process'
helpers = require './helpers'
path = require 'path'
{patchStackTrace} = CoffeeScript檢查 Node 內建的原始碼對應堆疊追蹤轉換是否已啟用。
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 會快取所有原始碼對應,如果存在的話。它們會出現在 getSourceMap 中,並透過 filename 擷取。
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 腳本能夠直接分岔 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