Это гидрология, рассказывающая об опыте хождения по яме. Демо этой статьи было загружено намой GitHub
задний план
Причина в том, что при написании Node достаточноrequire ('../../../../helper.js')этот относительный путь. Он недостаточно интуитивно понятен, чтобы говорить об этом. Если он будет использоваться в другом месте в будущем, его нельзя будет скопировать напрямую, и относительный путь придется пересчитывать, поэтому я надеюсь использовать абсолютный путь (другими словами, всегда относительный к корневой путь) для его представления.
Более простое решение - инкапсулироватьrequireфункция:
global.rootRequire = function(name) {
return require(__dirname + '/' + name);
}
в нашемrootRequireВ функции будут добавлены все пути__dirnameпрефикс, реализующий абсолютный путь.
Проблем с этой функцией нет, но похоже, что VSCode недостаточно хорошо поддерживает такой вид написания (большой парень, который его тоже хочет посоветовать), что проявляется в следующих двух проблемах:
- Хотя мы ставим
rootRequireОпределяется как глобальный, но при вводе слова в других файлах автодополнения нет - Модули, введенные таким образом, не могут перейти к реализации модуля и не могут видеть внутреннюю структуру модуля.
requireИмпортировать не проблема.
После дальнейшего тестирования даже такой способ написания не работает:
let r = require
let a = r('../test/a')
найдено в VSCodeaимеет типanyИ потерял много информации.
решение
Другими словами, инкапсуляцияrequireСпособ неосуществимый, только использовать роднойrequireфункция, то мы можем только видеть, как повлиять на процесс поиска модуля.
Встроенный набор процессов и порядка наверняка не изменяется, кажется только изNODE_PATHЭта глобальная переменная запускается. мы знаемrequireфункция пойдетNODE_PATHНайдите модуль в каталоге проекта, поэтому, если он установлен в качестве корневого пути проекта, может быть реализована загрузка по абсолютному пути. Попробуйте, каталог проекта выглядит так:
project
|-----main
|------index.js
|-----util
|------utils.js
очень простое определениеutils.js, он экспортирует объект:
// utils.js
module.exports = {
key:' value'
}
существуетindex.jsнаписал в:
let utils = require('utils/utils')
console.log(utils.key)
затем выполнитьnode main/index.js, точно не скомпилируется.
но если указаноNODE_PATHЭто не то же самое, он может нормально работать в это время:
export NODE_PATH=$PWD && node main/index.js
оптимизация
Укажите прямо в командной строкеNODE_PATHЕсть две проблемы:
- Изменился способ запуска проекта, другие разработчики тоже пострадают, но это не большая проблема, т.к. обычно он запускается через команды.
- Если вы запускаете узел по другому пути, то
$PWDОн изменится, этот метод недостаточно безопасен.
Так что лучше указать в файле вводаNODE_PATH, т.к. путь к этому файлу вообще не меняется. такindex.jsМожет быть преобразован в это:
let path = require('path')
process.env.NODE_PATH = path.resolve(__dirname, '../') ;
require('module').Module._initPaths();
let utils = require('utils/utils')
console.log(utils.key)
Прелесть этого способа написания в том, что независимо от того, где мы выполняемnode path/to/index.jsполучит правильный результат.
Наконец надо исправить написаниеrequireКогда функция используется, проблема завершения пути, просто добавьтеjsconfig.jsonфайл и добавьте следующее:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"baseUrl": "./",
},
"exclude": [
"node_modules"
]
}
ядро"baseUrl": "./"эта линия. поэтому, когда мы пишемutilsКогда это слово используется, вы можете наслаждаться автозаполнением.
Пока что, будь то выполнение Node, завершение пути или определение функции перехода, все работает нормально.