Может ли ссылка npm вызвать проблему с модулем не удается найти?

Я пытаюсь изучить концепцию использования модулей TypeScript из простых проектов JavaScript, и кажется мне, что я могу использовать только связанный модуль npm, но не модуль, который npm ссылается на другие. Позвольте мне объяснить на примере:

$ cat index1.js 
const { add, multiply, divide } = require('module-a')

const newfunc = (a, b) =>
       divide(multiply(add(a, b), 6), 2);

const result = newfunc(1, 2)
console.info(result);

$ node index1.js
9

module-a - это модуль TypeScript, с которым я связался через npm из своего проекта JavaScript. И работает нормально. В настоящее время:

$ diff -wU 1 index1.js index2.js
--- index1.js   2019-01-01 16:25:50.000000000 -0500
+++ index2.js   2019-01-01 16:37:33.000000000 -0500
@@ -1,2 +1,3 @@
 const { add, multiply, divide } = require('module-a')
+const { myfunc } = require('module-b')

@@ -7 +8,3 @@
 console.info(result);
+
+console.info(myfunc(1, 2));

$ node index2.js
internal/modules/cjs/loader.js:605
    throw err;
    ^

Error: Cannot find module 'module-b'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
    at Function.Module._load (internal/modules/cjs/loader.js:529:25)
    at Module.require (internal/modules/cjs/loader.js:657:17)
    at require (internal/modules/cjs/helpers.js:22:18)
...

$ ls -l node_modules/
total 0
lrwxrwxrwx 1 tong tong 30 2019-01-01 16:17 module-a -> /usr/lib/node_modules/module-a
lrwxrwxrwx 1 tong tong 30 2019-01-01 16:28 module-b -> /usr/lib/node_modules/module-b

$ ls -l /usr/lib/node_modules/module-b
lrwxrwxrwx 1 root root 83 2019-01-01 16:32 /usr/lib/node_modules/module-b -> /paths/to/ts-modules-test/module-b

То есть для меня module-b ничем не отличается от module-a. но почему это нормально для require('module-a'), но не для require('module-b')?

Неужели это потому, что мой module-b npm связан с module-a?

Полную настройку ссылок npm с module-b на module-a и весь код можно найти по адресу это репо.

ОБНОВИТЬ. У меня нет проекта package.json ни для module-a, ни для module-b, но почему module-a работает? Более того, после создания module-c/package.json проблема осталась прежней:

$ find . 
.
./node_modules
./node_modules/module-a
./node_modules/module-b
./index1.js
./index2.js

$ npm init --force --yes
Wrote to /paths/to/ts-modules-test/module-c/package.json:

{
  "name": "module-c",
  "version": "1.0.0",
  "description": "",
  "main": "index1.js",
  "dependencies": {
    "module-a": "^1.0.0",
    "module-b": "^1.0.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

$ node index2.js
internal/modules/cjs/loader.js:605
    throw err;
    ^

Error: Cannot find module 'module-b'

Модуль-b должен находиться в пакете проекта package.json. пожалуйста, поделитесь содержимым файла.

guy mograbi 01.01.2019 23:32

есть ли у module-a и module-b файл index.js?

guy mograbi 02.01.2019 01:25

нет .. module-b определяется некорректно. пожалуйста, посмотрите "main" в package.json для module-b и module-a. Модуль-a правильно определяет build/index.js, а модуль-b - нет.

guy mograbi 02.01.2019 02:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
4 055
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда nodejs требует папку, он попытается найти основной файл.

По умолчанию основной файл - index.js. Поскольку вы используете TypeScript, у вас нет index.js, но вместо этого у вас есть index.ts.

Чтобы определить главный файл, вам нужно будет определить его в package.json. Я вижу, что вы сделали это в module-a.

{
   "main": "build/index.js"
}

Это означает, что в какой-то момент во время установки вы скомпилировали ts в js, и выходные данные компилятора были помещены в папку build.

Глядя на module-b, ваш компилятор для этого модуля также указывает на папку build, но свойство «main» package.json имеет значение «index.js». Я предполагаю, что если вы укажете его на build/index.js, как в module-a, он будет работать.

О, спасибо большое, мистер Мограби, я новичок в этом, и package.json из module-b был разветвлен из чужого места. Я бы никогда не смог разобраться в этом самостоятельно, большое спасибо за помощь !!!

xpt 02.01.2019 04:17

Это устраняет мою проблему в модуле Angular 10.

Pavan Jadda 09.07.2020 21:51

Другие вопросы по теме