NodeJS 'Require' 在 coffeescript 中加载库,在 Javascript 中加载空对象

NodeJS 'Require' loading library in coffeescript, empty object in Javascript

我在 NodeJS 中遇到了一个有趣的问题,该问题时不时会在工作中出现,但我一直无法弄清楚。

我用 CoffeeScript 编写了一个后端,然后用 g运行t-contrib-coffee 将其编译到 ~/bin 目录中的 Javascript 中。我还包括一个库,我使用适当的私钥在 Bitbucket 上私下托管它,并通过 npm 安装。这个库也是用 coffeescript 写的。

通常我可以毫不费力地将这个库包含在 Javascript 中,就像我对任何其他库一样使用简单的要求。但是,偶尔其中一台使用后端的服务器会获得更新,然后停止工作。当我去检查错误时,它总是一样的 - 'require' 通过,但不是在 JavaScript 中加载实际的库,而是 returns 一个空对象 ({})。 运行 coffeescript 中的代码仍然有效,但无论我做什么 - 重新编译、重新安装所有依赖项、删除并克隆存储库,问题仍然存在。

我 运行 不知道它可能是我自己的问题,所以我希望这里的人以前遇到过这个问题,也许能够为我指明正确的方向。

在图书馆package.json:

{ 
    "name": "graph-engine",
    "main": "./lib/graph"
}

在图书馆的graph.coffee

class Graph
    constructor: () ->
      # Perform init

module.exports = Graph

然后在应用的 package.json:

{
    "graph-engine": "git+ssh://git@bitbucket.org:<team>/graph-engine.git"
}

最后,在应用本身中:

GraphEngine = require "graph-engine"
engineInstance = new GraphEngine()

这在 coffeescript 中运行良好,但是当使用 g运行t 编译应用程序时,对 g运行t-contrib-coffee 进行以下设置:

coffee:
  glob_to_multiple: 
    expand: true
    flatten: false
    cwd: 'src'
    src: ['**/*.coffee']
    dest: 'bin'
    ext: '.js'

编译后的应用程序 运行 无法正确加载库,而是返回一个空对象。再次强调,这并不总是会发生,因此我没有包含任何代码或 json 文件,因为我认为它们是不相关的。

尽管我至今仍不清楚行为随机性的确切原因,但我发现它与这些用 CoffeeScript 编写的库有关。

好像根据加载顺序,有时候第三方库会注册coffee脚本,而我自己的库会正确加载,而其他时候这些库会在我自己的库加载后加载,导致无法加载咖啡脚本。因此,解决方案非常简单——注册 coffeescript。这可以通过将以下内容放在 node.js 应用程序的开头来完成:

require('coffee-script/register')

请参阅 documentation 了解更多信息。