【问题标题】:Could npm link cause the cannot find module problem?npm link会导致找不到模块问题吗?
【发布时间】:2019-01-01 22:06:28
【问题描述】:

我正在尝试从纯 JavaScript 项目中学习如何使用 TypeScript 模块的概念,在我看来我只能使用 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.log(result);

$ node index1.js
9

module-a 是我从我的 JavaScript 项目中 npm 链接到的 TypeScript 模块。它工作正常。现在:

$ 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.log(result);
+
+console.log(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-bmodule-a 没什么不同。但是为什么require('module-a')可以,require('module-b')不行?

真的是因为我的module-b npm 链接到了module-a吗?

module-bmodule-a 的整个npm 链接设置,以及所有代码,都可以在this repo 找到。

更新。我没有 module-amodule-b 的项目 package.json,但为什么 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'

【问题讨论】:

  • Module-b 需要在项目的 package.json 中。请分享文件内容。
  • module-amodule-b 都有文件index.js
  • no.. module-b 定义不正确。请在package.json 中查看module-bmodule-a 的“main”。 module-a 正确定义了它build/index.js 而 module-b 没有。

标签: javascript node.js typescript npm


【解决方案1】:

当 nodejs 需要一个文件夹时,它会尝试查找一个主文件。

默认主文件是index.js。由于您使用的是 TypeScript,因此您没有index.js,而是拥有index.ts

要定义一个主文件,您需要在package.json 中定义它。我可以看到你在module-a 中这样做了。

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

这意味着在安装过程中的某个时刻,您已将ts 编译为js,并且编译器的输出放置在文件夹build 中。

查看module-b,您的该模块的编译器也指向build 文件夹,但package.json“main”属性的值为“index.js”。我假设如果您像在module-a 中那样将其指向build/index.js,它将起作用。

【讨论】:

  • 哦,非常感谢 Mograbi 先生,我是新手,package.jsonmodule-b 是从其他人的地方分叉的。我永远无法自己解决这个问题,非常感谢您的帮助!!!
  • 这解决了我在 Angular 10 模块中的问题
猜你喜欢
  • 2014-08-24
  • 2013-03-08
  • 2022-01-22
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多