Это гидрология, рассказывающая об опыте хождения по яме. Демо этой статьи было загружено намой 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, завершение пути или определение функции перехода, все работает нормально.