Используйте __dirname в классе, скомпилированном в Typescript AMD

Я ищу решение для использования __dirname (или эквивалентного) внутри класса TypeScript, скомпилированного в AMD, __dirname там не существует. И поскольку это машинописный текст, я не могу (или не знаю, как) импортировать module, который содержит uri, что позволяет мне получить uri.

Я нашел решение один раз, но я не помню, как, и я не могу найти его снова до сих пор.

Я взглянул на это, но это чистый javascript, и я использую машинописный текст, я пытался импортировать модуль, но получаю ошибку TS.

https://stackoverflow.com/questions/9027429/how-to-use-nodejs-global-module-objects-in-requirejs-modules


person Vadorequest    schedule 01.02.2014    source источник
comment
Обычно я ожидаю, что он будет в каком-то файле определений. Но можно было просто добавить: declare var __dirname: string;   -  person WiredPrairie    schedule 02.02.2014
comment
Но __dirname будет пустым, если я это сделаю. Мне нужно иметь доступ к пути к текущему каталогу   -  person Vadorequest    schedule 02.02.2014
comment
Во время выполнения он не будет пустым. Он просто действует как заполнитель для компилятора.   -  person WiredPrairie    schedule 02.02.2014
comment
Хорошо, я думаю, вы не понимаете, но на самом деле я этого не говорил. Я использую requireJs, которые удаляют глобальные переменные nodejs __dirname, __filename, они недоступны внутри модуля requirejs.   -  person Vadorequest    schedule 02.02.2014


Ответы (2)


Одним из решений является:

В app.js создайте глобальную переменную:

__basePath = __имя_каталога;

Затем в сценарии AMD используйте __basepath + 'relativePathFromBasePath' для загрузки файла.

Я знаю, что нашел другое решение, но не могу вспомнить, как.

person Vadorequest    schedule 02.02.2014

Я не использую TypeScript, но на основе кода TypeScript, который я видел, и на основе того, что я знаю о RequireJS, я считаю, что вы должны иметь доступ к module.uri следующим образом:

import module = require("module");
console.log(module.uri);

Имя module — это специальный. Вы также можете использовать require.toUrl(<module name>) (это Url, как в URL, тогда как указанная выше переменная — uri, как в URI), но она не кажется такой полезной, как module.uri для этой задачи. Во-первых, вам нужно будет включить имя модуля в вызов.

module.uri может содержать .., поэтому его нужно очистить. Насколько я понимаю, ваш код работает на стороне сервера, поэтому в Node.js мы бы назвали path.dirname(path.normalize(module.uri)).

person Louis    schedule 02.02.2014
comment
Я попытался, но моя IDE не смогла найти библиотеку модулей, и я получил ошибки IDE, а .ts больше не компилировался в .js. :/ - person Vadorequest; 02.02.2014
comment
Вы можете получить доступ к require.toUrl? Мне это не очень нравится, потому что вам нужно передать имя модуля, но это сработает. - person Louis; 02.02.2014
comment
Да, у меня есть доступ к require, потому что он автоматически импортируется с помощью requirejs! - person Vadorequest; 02.02.2014
comment
Я спросил, есть ли у вас доступ к require.toUrl, а не только к require. Насколько я понимаю, TypeScript может дать вам доступ к require, но так, чтобы функция toUrl не была видна коду TypeScript. - person Louis; 02.02.2014
comment
В настоящее время я работаю над другой проблемой, и из-за этой проблемы я пока не использую AMD, пока не найду решение, поэтому я не могу проверить это сейчас, но я обновлю эту тему, когда я найти решение. Проблема: stackoverflow .com/questions/21506083/ - person Vadorequest; 02.02.2014