Node требуется абсолютный путь
У меня есть каталог, который выглядит так:
-- app/
|- models/
|- user.js
|- config.json
Я хочу, чтобы мой файл user.js
требовал config.json
. Сейчас я использую require('/config')
, но это не работает. Что я делаю не так? Я бы хотел избежать использования require('../config')
.
Ответы
Ответ 1
Ответ прост: вы не делаете ничего плохого. Согласно небольшому исследованию, функция require ищет одно из:
- основной модуль, такой как фс
- относительный путь к файлу, который вы указываете в вызове require
- поиск в каталоге для модуля с соответствующим именем в папке node_modules где-то в родительском каталоге файла, в котором вызывается функция require.
См.: http://www.bennadel.com/blog/2169-Where-Does-Node-js-And-Require-Look-For-Modules-.htm И: http://nodejs.org/api/modules. HTML # loading_from_node_modules_Folders
Оба вышеупомянутых ресурса ссылаются на возможность также изменять переменную среды NODE_PATH, однако это звучит как очень плохая практика и, как минимум, сделает ваш код менее переносимым. Это также, вероятно, даже не сработало бы для файла, подобного config.json, поскольку, хотя я никогда этого не делал, я представлял, что изменение переменной NODE_PATH изменяется только тогда, когда require() ищет файлы package.json, соответствующие реальным модулям.
В итоге смотрите: Как сделать, чтобы require в node.js был всегда относительно корневой папки проекта? как упомянуто выше Петром Ковальчуком. На этот пост у вас есть два реальных варианта:
- Используйте относительные пути к файлам.
- Упакуйте нужный вам ресурс как настоящий модуль с файлом package.json и поместите его в папку node_modules.
Наконец, имейте в виду, что то, что вы пытаетесь сделать, противоречит сути программы, которую вы используете. Я думаю, что это один из случаев, когда вы в конечном итоге сделаете вашу жизнь проще (и ваших соавторов!), Перейдя на грань Node и используя относительные пути к файлам в соответствии с замыслом проекта.
Ответ 2
Я не мог найти лучшего решения, чем написать собственный модуль 😊.
Итак, мне нравится чистый код, и такой уродливый путь внутри require
убивал меня. Я нашел много решений, как это исправить, но то, что мне понравилось, идеально подходило для систем Linux, но не для Windows. Тогда я решаю это исправить.
Сексуальная требуется 💃🏻💃🏻💃🏻
После тестирования в некоторых проектах я решил сделать его открытым исходным кодом ".
const user = require('../../../database/user'); // 👎 what you have
// OR
const user = require('$db/user'); // 👍 no matter how deep you are
const product = require('/database/product'); // 👍 alias or pathing from root directory
Начиная
Три простых шага, чтобы использовать его.
-
Установите пакет: npm install sexy-require --save
-
Включите require('sexy-require')
один раз в начало вашего основного файла приложения.
require('sexy-require');
const routers = require('/routers');
const api = require('$api');
...
-
Необязательный шаг. Конфигурация пути может быть определена в файле .paths
в корневом каталоге вашего проекта.
$db = /server/database
$api-v1 = /server/api/legacy
$api-v2 = /server/api/v2
Список путей
В любом месте вашего проекта вы можете получить определенные пути быстрого доступа:
const path = require('sexy-require');
console.log(path.$db); // -> '/full/path/to/app/server/database'
Ответ 3
Кажется, что функция загрузки модуля добавляет node_modules/
к аргументу. Например, поместите следующий script в /tmp/t.js
:
meow = require('meow/meow.js');
создайте (mkdir
) /tmp/node_modules/
и попробуйте запустить его с BSD ktrace
(или Linux 'strace
, который обеспечивает сопоставимую функциональность). Node попытается открыть следующее:
-
/tmp/node_modules/meow/meow.js
-
/tmp/node_modules/meow/meow.js.js
-
/tmp/node_modules/meow/meow.js.json
-
/tmp/node_modules/meow/meow.js.node
-
/tmp/node_modules/meow/meow.js/package.json
-
/tmp/node_modules/meow/meow.js/index.js
-
/tmp/node_modules/meow/meow.js/index.json
-
/tmp/node_modules/meow/meow.js/index.node
Если у вас нет подкаталога node_modules/
рядом с вашим script, он вообще не будет искать нигде относительно вашего script.
Ответ 4
global.__require = function (file) {
return require(__dirname + '/' + file)
}
Поместите это в верхнюю часть вашего файла точки входа (например, index.js
). Тогда вы можете просто использовать
const foo = __require('src/foo')
.
Я использую двойное подчеркивание как оду __dirname
но вы можете переименовать его как угодно!
Ответ 5
Я не думаю, что нам нужно обсуждать эту проблему. Это дизайн для простого разработчика.
Если нам требуется /config.json, возможно, в подпапке есть много config.json, что, как правило, усложняет понимание
-- app/
|- controller
|- config.json(2)
|- models/
|- user.js
|- config.json(3)
|- config.json(1)
Теперь скажите мне, как вы знаете, какой конфигурационный файл вам нужно выбрать.
Решение: user.js
var config1 = require('../config.json');
var config2 = require('../controller/config.json');
var config3 = require('./config.json');
если есть только один конфиг, вам лучше указать глобальную переменную и использовать ее оттуда.