无法要求全局npm模块

3

我有以下问题。我使用npm install -g uuid安装了uuid。 当我尝试运行以下代码时:

var uuid = require("uuid");
console.log(uuid.v1());

抛出异常:

module.js:339
throw err;
^

Error: Cannot find module 'uuid'
at Function.Module._resolveFilename (module.js:337:15)
at Function.Module._load (module.js:287:25)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (d:\CodingProjects\HTML\TestJavascript.js:16:12)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:467:10)

如果我使用 npm install uuid 在本地安装模块,则可以正常工作。但是为什么呢?我该怎么做才能让全局包起作用? 我尝试从 Language & Frameworks -> Javascript -> Libraries 下载它,但如果我不在项目中本地安装它,仍然会出现异常。 提前致谢。
2个回答

4
原因在于 npm 安装软件包的方式。
当你运行 npm install -g <package> 时,你告诉 npm 全局安装 <package>。这在你希望将该软件包作为命令行工具使用时非常有效,例如像 Gulp 这样的工具:
$ npm install -g gulp
$ cd path/to/project
$ gulp

然而,当你想要依赖于一个包时,这种方法就不起作用了。
要依赖于一个包,你应该在项目目录中进行本地安装。这是npm的一个关键优势:本地安装使得管理依赖项和升级它们变得更加容易。使用不带-g标志的npm install命令就是专门为此而设的。当你运行该命令时,将会……
$ npm install uuid

foo目录下创建foo/node_modules目录,并在其中安装uuid模块。之后,您可以在foo目录(或其任何子目录)中创建一个.js文件,并从中引用uuid模块,一切都会正常工作。
至于WebStorm:从Language & Frameworks → Javascript → Libraries下载库实际上并不会下载一个npm包,它只是下载并安装库类型的定义。类型定义帮助WebStorm在您的代码中使用库时构建更好的自动完成。

非常感谢。你的回答帮助我理解了这些事情的工作原理。 - DPM
@DPM:我很高兴它有帮助。 - Ivan Akulov

2
如果您想使用全局包,您只需要在本地目录中创建一个指向全局包的链接即可。这也被称为创建符号链接(symlink)。因此,在本地目录中运行“npm link uui”将允许您使用全局包而无需将其下载到本地目录中。如果您分析本地目录,您会注意到已经创建了一个(链接)文件夹,这意味着它仅是指向全局包的指针。因此,简而言之,如果您想使用全局包,则“npm link”是实现它的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接