Я использую AmpersandJS и я пытаюсь подражать стручок структуру Эмбер так, что, вместо типичных папок-на-типа структуры:Как получить текущую папку в NodeJS для файла Browserify'd, который опирается на базовый файл в другой папке?
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>"
}
В базовой точке зрения, я следующий, который будет возвращать шаблон по соглашению:
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
устанавливается в папку шаблона базового вида, а не вид, который простирающуюся I т. В результате __dirname
всегда будет /app
, хотя /app/index/view.js
- вид, который отображается.
Мне было интересно, возможно ли получить имя dirname текущего вида, а не базовый вид. Я знаю, что я могу добавить что-то вроде templatePath
для каждого представления, которое будет читать базовый вид, но я стараюсь не делать этого.
Спасибо за ответ! Это определенно проблема; Browserify преобразует JS, выполняя что-то вроде: '(function (dirname) {...}). Call (this, '/ app')'. Поскольку на данный момент это «жестко закодировано», единственный способ заставить dirname работать правильно - это передать его из подкласса. –
FYI это не функция браузера. Вот как node.js реализует соглашения CommonJS. Каждый модуль завернут в тело функции с данными CommonJS, представленными в качестве аргументов. [точную информацию здесь] (https://github.com/joyent/node/blob/4d9c81b7e2522c5d5d9d35058cbb0bce1228d360/src/node.js#L799). Browserify просто гарантирует, что они также доступны в браузере. –