对于依赖于另一个文件夹中的基本文件的 Browserify 文件,如何获取 NodeJS 中的当前文件夹?

How do I get the current folder in NodeJS for a Browserify'd file that relies on a base file in another folder?

我正在使用 AmpersandJS,我正在尝试模拟 Ember 的 pod 结构,而不是典型的文件夹类型结构:

app
|-- views
    |-- index.js
    |-- login.js
    |-- people.js
|-- templates
    |-- index.jade
    |-- login.jade
    |-- people.jade

您改为拥有每个组件的文件夹:

app
|-- index
    |-- view.js
    |-- template.jade
|-- login
    |-- view.js
    |-- template.jade
|-- people
    |-- view.js
    |-- template.jade
|-- base-view.js

我正在使用 templatizer 来编译我的模板:

templatizer(__dirname + '/app', __dirname + '/app/templates.js');

这将使模板对象看起来像这样(为了解释而简化):

{
    "index.template": "<div>index</div>",
    "login.template": "<div>login</div>",
    "people.template": "<div>people</div>"
}

在基本视图中,我有以下内容,按照约定 return 模板:

var BaseView = AmpersandView.extend({
  template: function() {
    // pretend that I'm cleaning up __dirname here
    return templates[__dirname].template;
  }
});

在我的其他视图中,我扩展了基本视图:

// in app/index/view.js:
var IndexView = BaseView.extend({ ... });

我 运行 遇到的问题是,当基础视图通过 Browserify 时,__dirname 被设置为基础视图模板的文件夹,而不是扩展它的视图.因此,__dirname 将始终是 /app,即使 /app/index/view.js 是正在呈现的视图。

我想知道是否可以获取当前视图的目录名而不是基本视图。我知道我可以向基本视图将读取的每个视图添加类似 templatePath 的内容,但我正在努力避免必须这样做。

所以我认为这归结为 javascript 范围问题。您需要从每个子类视图的范围中获取 __dirname 并将其附加到实例上,以便覆盖正常工作。有几种方法可以实现这一点(我不熟悉 Ampersand 状态 extend),但我的第一个建议是:

var IndexView = BaseView.extend({props: {__dirname: __dirname}});

这将在正确的范围内抓取 __dirname 并使其可用。然后,您需要实现引用 this.__dirname 而不仅仅是 __dirname.

的 BaseView 模板函数
var BaseView = AmpersandView.extend({
  template: function() {
    // pretend that I'm cleaning up __dirname here
    return templates[this.__dirname].template;
  }
});