Є кілька способів підходу до цього, кожен зі своїми плюсами і мінусами:
need.main.filename
З http://nodejs.org/api/modules.html :
Коли файл запускається безпосередньо з Node, require.mainвстановлюється його module. Це означає, що ви можете визначити, чи запускався файл безпосередньо шляхом тестуванняrequire.main === module
Оскільки moduleзабезпечує filenameвластивість (як правило, еквівалентна __filename), точку входу поточної програми можна отримати, перевіривши require.main.filename.
Отже, якщо ви хочете базувати базовий каталог для свого додатка, ви можете зробити:
var path = require('path');
var appDir = path.dirname(require.main.filename);
Плюси мінуси
Це буде працювати відмінно більшу частину часу, але якщо ви використовуєте додаток з пусковим як PM2 або бігом мокко випробування, цей метод не вийде .
глобальний.X
Вузол має об’єкт глобального простору імен, який називається global- все, що ви додаєте до цього об’єкта, буде доступне скрізь у вашій програмі. Отже, у своєму index.js(або app.jsбудь-якому іншому головному файлі програми названо) ви можете просто визначити глобальну змінну:
// index.js
var path = require('path');
global.appRoot = path.resolve(__dirname);
// lib/moduleA/component1.js
require(appRoot + '/lib/moduleB/component2.js');
Плюси мінуси
Працює послідовно, але ви повинні покладатися на глобальну змінну, що означає, що ви не можете легко використовувати компоненти / тощо.
process.cwd ()
Це повертає поточний робочий каталог. Чи не надійні взагалі, так як це повністю залежить від того, що каталог процес був запущений з :
$ cd /home/demo/
$ mkdir subdir
$ echo "console.log(process.cwd());" > subdir/demo.js
$ node subdir/demo.js
/home/demo
$ cd subdir
$ node demo.js
/home/demo/subdir
додаток-root-шлях
Щоб вирішити цю проблему, я створив модуль вузла під назвою app-root-path . Використання просте:
var appRoot = require('app-root-path');
var myModule = require(appRoot + '/lib/my-module.js');
Модуль app-root-path використовує декілька різних методик для визначення кореневого шляху програми з урахуванням глобально встановлених модулів (наприклад, якщо ваш додаток працює, /var/www/але модуль встановлений в ~/.nvm/v0.x.x/lib/node/). Це не спрацює 100% часу, але це буде працювати в найбільш поширених сценаріях.
Плюси мінуси
Працює без конфігурації в більшості випадків. Також передбачено декілька приємних додаткових методів зручності (див. Сторінку проекту). Найбільшим мінусом є те, що він не працюватиме, якщо:
- Ви використовуєте пусковий апарат, наприклад, pm2
- І модуль не встановлений у
node_modulesкаталозі додатка (наприклад, якщо ви встановили його в усьому світі)
Ви можете обійти це, встановивши APP_ROOT_PATHзмінну навколишнього середовища, або зателефонувавши .setPath()на модуль, але в цьому випадку вам, мабуть, краще скористатися globalметодом.
Екологічна змінна NODE_PATH
Якщо ви шукаєте спосіб визначення кореневого шляху поточного додатка, одне з перерахованих вище рішень, ймовірно, підійде найкраще для вас. Якщо, з іншого боку, ви намагаєтеся надійно вирішити проблему з завантаженням модулів додатків, настійно рекомендую вивчити NODE_PATHзмінну середовища.
Система модулів Node шукає модулі в різних місцях. Одним з таких місць є всюди , де process.env.NODE_PATHточки . Якщо встановити цю змінну навколишнього середовища, ви можете requireмодулі зі стандартним завантажувачем модулів без будь-яких інших змін.
Наприклад, якщо ви встановите NODE_PATHна /var/www/lib, то наступне буде працювати нормально:
require('module2/component.js');
// ^ looks for /var/www/lib/module2/component.js
Чудовий спосіб зробити це npm:
"scripts": {
"start": "NODE_PATH=. node app.js"
}
Тепер ви можете запустити свою програму, npm startі ви золото. Я поєдную це з моїм модулем примусового контуру , який запобігає випадковому завантаженню програми без NODE_PATHнабору. Для ще більшого контролю за виконанням змінних умов навколишнього середовища див. Checkenv .
Один gotcha: NODE_PATH повинен бути встановлений поза додатком вузла. Ви не можете зробити щось подібне, process.env.NODE_PATH = path.resolve(__dirname)тому що завантажувач модулів кешує список каталогів, які він буде шукати до запуску програми.
[додано 4/6/16] Інший дійсно перспективний модуль, який намагається вирішити цю проблему, є хвилястим .