Улучшение автозаполнения узлов VSCode

Node.js внешний интерфейс Командная строка Безопасность

Это гидрология, рассказывающая об опыте хождения по яме. Демо этой статьи было загружено намой GitHub

задний план

Причина в том, что при написании Node достаточноrequire ('../../../../helper.js')этот относительный путь. Он недостаточно интуитивно понятен, чтобы говорить об этом. Если он будет использоваться в другом месте в будущем, его нельзя будет скопировать напрямую, и относительный путь придется пересчитывать, поэтому я надеюсь использовать абсолютный путь (другими словами, всегда относительный к корневой путь) для его представления.

Более простое решение - инкапсулироватьrequireфункция:

global.rootRequire = function(name) {
    return require(__dirname + '/' + name);
}

в нашемrootRequireВ функции будут добавлены все пути__dirnameпрефикс, реализующий абсолютный путь.

Проблем с этой функцией нет, но похоже, что VSCode недостаточно хорошо поддерживает такой вид написания (большой парень, который его тоже хочет посоветовать), что проявляется в следующих двух проблемах:

  1. Хотя мы ставимrootRequireОпределяется как глобальный, но при вводе слова в других файлах автодополнения нет
  2. Модули, введенные таким образом, не могут перейти к реализации модуля и не могут видеть внутреннюю структуру модуля.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Есть две проблемы:

  1. Изменился способ запуска проекта, другие разработчики тоже пострадают, но это не большая проблема, т.к. обычно он запускается через команды.
  2. Если вы запускаете узел по другому пути, то$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, завершение пути или определение функции перехода, все работает нормально.