LINUX.ORG.RU

Запуск node скрипта

 


0

1

Хочу запустить node скрипт

Есть некий проект

/app1/index.js
/app2/index.js
/app3/index.js

index.js - одинаковый во всех директориях. Хочу вынести его в /share/index.js

Далее прописываю в package.json

"main": "../share/index.js"


Потом пытаюсь запустить
cd /app1/
node .


Запускается /share/index.js но с ошибкой Cannot find module ...
Модуль этот находится в /app1/node_modules.

Как запустить скрипт /share/index.js но чтобы он думал что запускается в папке /app1/ ?

И ещё... Если нет в папке /app1/ded.js то файл ищется в /share/
Тобишь какое то наследование нужно на уровне ФС

★★★★

Ответ на: комментарий от crutch_master

Симлинк да, думал и делал уже. В целом норм, но буду путаться и перезатирать всегда. Тут чисто человеческий фактор.

index.js : require("../share/index.js")

ну это тоже самое по сути что и прописать «main»: "../share/index.js"

Ладно я решил уже первую проблему, скопировал в /share/ всю недостоющую требуху

Остается вопрос с наследованием. Погуглил, все сходится к «node require fallback» https://stackoverflow.com/questions/48065357/require-how-to-do-a-fallback-whe...

Это надо свой врапер require-fallback делать, это не подходит

Собственно мне что осталось нужно: если файла нет в папке - искать его в /share/. Можно штатным способом такое сделать? Изучал package.json что то не найду магического заклинания там

Ты опять делаешь какую-то херню?

Да все мы делаем херню по сути )

gobot ★★★★ ()
Ответ на: комментарий от crutch_master

Не понял...
Мне нужно типа include directoryes, чтобы указать ноде в каких папках искать скрипты, если их нет в текущей

gobot ★★★★ ()
Ответ на: комментарий от gobot

Не понял

Делаешь свой пакет, свой регистр (verdaccio, например), деплоишь в регистр, ставишь его в зависимость во все остальные проекты.

Мне нужно типа include directoryes, чтобы указать ноде в каких папках искать скрипты, если их нет в текущей

У тебя не начнётся такое, что 3 проекта будут инклюдить друг у друга?
Есть еще один костыль-вей, вызывать копирование/создание симлинка на index.js прямо в ноде, а потом делать require.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Делаешь свой пакет, свой регистр (verdaccio, например), деплоишь в регистр, ставишь его в зависимость во все остальные проекты

Дык, и будет у меня в каждой (/app1 /app2 /app3) папке по копии проекта? Я сейчас наоборот от этого ухожу

Есть еще один костыль-вей, вызывать копирование/создание симлинка на index.js прямо в ноде, а потом делать require.

про симлинк я писал выше


В общем, почитал я https://nodejs.org/api/modules.html
Если указываешь в require "./bla" «/bla» "../bla" то пути относительные и нода не будет искать пакет в других дирах. А у меня в коде везде стоит "./bla" и "../bla"/ Тобишь без переписывания кода на "../../share/logger" не выйдет. А пакет logger ищет свой конфиг в "./config_logger" которого нет в /share
Надо изощряться в путями... Может все же есть другой лаконичный путь, чтобы обхитрить ноду и сделать require пакета из app1/../share/logger но чтобы у logger была дира app1/

gobot ★★★★ ()
Ответ на: комментарий от gobot

Я сейчас наоборот от этого ухожу

Кмк, зря. Не факт, что какое-то изменение в shared не поставит всех раком.

crutch_master ★★★★★ ()
Ответ на: комментарий от CryNet

Разве это не устаревшая фича, и не лучше юзать просто import?

А они не по-разному работают? Можно сделать reimport чего нибудь? Там есть await import(...) но стоит ли он того?

устаревшая фича

var типа тоже устаревшая, ага. Однако под repl писать код удобнее с var. Больше слушай всяких метросекуалов в коротких штанишках.

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Та ты не понял (мне нужно было написать это сразу). Мне интересно, вроде бы как import и require в Node работает одинаково. Или нет? Просто я не могу понять когда и что лучше юзать.

Я не про сабж темы, я в общем :)

CryNet ★★★★★ ()
Последнее исправление: CryNet (всего исправлений: 1 )
Ответ на: комментарий от CryNet

Мне интересно, вроде бы как import и require в Node работает одинаково

Вообще не тыкал в import, но он, вроде как, статичный и выполняется до запуска рантайма (ну, кроме того, который await import(...)).
(нода мне говорит Cannot use import statement inside the Node.js REPL, alternatively use dynamic import. так-то) Еще я хз, как с даже с динамическим импортом делать горячую перезагрузку модулей и можно ли её вообще делать.
Например, вот такую херню я сделал, чтобы перегружать модули на ходу:

var unload = function(module) {delete require.cache[require.resolve(module)]}
var reload = function(module) {unload(module); return require(module);}
С динам. импортом я не знаю, как там.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 3 )
Ответ на: комментарий от crutch_master

Cannot use import statement inside the Node.js REPL, alternatively use dynamic import

Может указан старый стандарт в package.json, где ещё нет import?

Просто пробую Node, то везде юзаю import. Разницы не вижу (мб не хватает скилла её увидеть xD)

CryNet ★★★★★ ()
Ответ на: комментарий от CryNet

Может указан старый стандарт в package.json

Repl. Код сразу пишется, сразу выполняется, сразу просматривается результат, потом дебаг и т.д. по кругу. Пляски package.json не нужны.

Просто пробую Node, то везде юзаю import

Если ты кодишь как на жабке т.е. покодил, сохранил сорцы, собрал, запустил сервис, посмотрел, что вышло, повторил, то разницы и не заметишь.

crutch_master ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.