Сгенерируйте package.json из скрипта Node, читая зависимости - PullRequest
1 голос
/ 10 апреля 2019

У меня есть около 300 малых и средних приложений Node, которые моя команда создала за последние несколько лет, и я пытаюсь их очистить и организовать. Достаточно сказать, что мои заветные помощники не всегда тщательно использовали флаг --save с npm install, поэтому файлы package.json часто не отражают все зависимости. В других случаях они включают пакеты, которые на самом деле не используются, потому что кто-то ДЕЙСТВИТЕЛЬНО использует --save, а затем передумал о необходимости этих пакетов.

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

Я мог бы написать скрипт, который считывал исходный код в виде текстового файла, использовал регулярные выражения для поиска require и import и получал имена пакетов. Я могу заниматься версионированием самостоятельно. Но это кажется не элегантным и неэффективным.

Я заметил, когда я запускаю webpack в проекте, что компилятор обрабатывает код, обнаруживая любой недопустимый синтаксис и, что более важно, любой импорт пакета, который недоступен, потому что он не был установлен.

Обычно я бы раздражался в процессе выполнения неизвестного сценария, но, поскольку это все сценарии, написанные известными сущностями, я не беспокоюсь о неправомерных действиях. Мне в основном непонятно, почему такая программа, как webpack, анализирует файл .js без необходимости его выполнения и возвращает конкретные ошибки с номерами строк.

Мне даже необязательно автоматизировать процесс добавления отсутствующих зависимостей в файл package.json - многие из 300 приложений построены правильно. Но это все равно спасет меня, чтобы быстро обнаружить, чего не хватает.

Включает ли выполнение сценария, чтобы увидеть, работает ли он, виртуальную машину? Или это так же просто, как запустить скрипт из другого скрипта? Естественно, что сами приложения не являются пакетами, поэтому попытка require их не сработает. Может быть, он использует JSLint?

1 Ответ

1 голос
/ 15 апреля 2019

Webpack не запускает никаких скриптов, которые запускают ваш код, чтобы убедиться, что он работает.Он использует Babel, который является транспортером (который также не запускает ваш код).

Способ работы компиляторов состоит в том, что они сканируют ваш код и проверяют, что все синтаксически правильно, например, соответствующие скобки или фигурные скобки,была ли объявлена ​​используемая вами переменная, а в статически типизированных языках - правильны ли ваши типы.В то время как / после этого они выкладывают код, который может использовать целевая система.В случае C компилятор берет ваш код C и превращает его в машинный код или сборку, в зависимости от указанных вами опций.

Разница между компилятором и транспортером, как правило, заключается в том, что компиляторы переводят кодвниз (по направлению к уровню машины) и транспортеры переводят код горизонтально.Подумайте Typescript -> Javascript или, в данном случае, ES6 + Javascript -> ES [совместимый] Javascript.Это означает, что для того, чтобы Babel преобразовал ваш код ES6 во что-то более совместимое, он должен прочитать все ваши файлы и выполнить базовые проверки целостности .В частности, если он увидит, что вы импортируете код, он попытается получить доступ к модулю / файлам, потому что это инструкция.Если этого не произойдет, то будет выдано сообщение об ошибке.

По этой же причине вы увидите ошибки компиляции, но не ошибки времени выполнения, как в других языках.Если Babel действительно запустит ваш код для проверки ошибок, он также может найти ошибки во время выполнения.Тем не менее, код имеет много ветвей выполнения, поэтому найти их, а затем установить условия для их выполнения - это грандиозная задача.Вот почему у нас есть инструменты тестирования.Для более непосредственного решения ваших вопросов / проблем:

Запускает ли сценарий, чтобы увидеть, работает ли он, виртуальную машину?

Нет

Или это так же просто, как запускать скрипт из другого скрипта?

Нет

Мне в основном непонятно, как такая программа, как webpack, анализирует файл .jsбез необходимости его выполнения, и возвращает конкретные ошибки с номерами строк.

Используется Babel и

Но это кажется не элегантным и неэффективным.

к сожалению, это в основном то, что делает Бабель.


Примечание

Я дважды проверил документы Webpack и увидел, что у них есть свой собственный транспортер,но он обрабатывает только операторы импорта / экспорта и рекомендует использовать другой транспортер, такой как Babel или Bublé, для переноса остальных, что я имею в виду, когда имею в виду, как Webpack использует Babel.

См. с чего начать .

...