全局安装webpack和项目特定安装webpack的区别

6
我对webpack的工作原理有些困惑。如果在根目录下运行npm install examplePackage,那么这个包会被安装到你的硬盘上吗?那么这是否意味着你可以随时在任何文件中导入该包?这与在项目内部运行npm install examplePackage有什么不同?是因为当你将项目推送到Github时,会有一个package.json供其他人遵循,并确保他们也拥有运行你的应用程序所需的必要库吗?Node如何知道在你的项目或硬盘中搜索包?它只是首先检查你的库,然后如果找不到它,就会在你的硬盘上查找吗?
1个回答

7

npm install examplePackage会在当前目录的node_modules中安装该包。当您在Node.js中使用require('examplePackage')导入模块时,它首先检查是否为核心模块(例如fs)。如果不是核心模块,则开始查找当前目录中的node_modules。如果在该目录中未找到该模块,则移动到父目录并检查其node_modules目录。依此类推,直到找到该模块或达到文件系统的根目录。请参见https://nodejs.org/api/modules.html#modules_loading_from_node_modules_folders

这确实意味着您可以从文件系统上任何地方导入已在/中安装的包。虽然只需在/中安装所有依赖项即可,但具有项目特定依赖项的许多优点。最大的优点可能是您可以轻松地与他人分享您的项目,并且您可以确保它将适用于他们(假设兼容的Node.js版本)。

Node如何知道搜索您的项目还是硬盘驱动器?

它只会在硬盘驱动器上查找,特别是在上述提到的node_modules目录中。正如您注意到的那样,您可以在package.json中指定依赖项,但Node本身不会对此信息做任何操作。相反,您需要运行npm install,这将安装package.json中列出的所有依赖项。之后,您可以正确地导入这些模块。

注意:npm install examplePackage不会将examplePackage添加到您的package.json中,它只是安装它。如果要将其作为依赖项添加,请使用npm install --save examplePackage或作为devDependency使用npm install --save-dev examplePackagehttps://docs.npmjs.com/cli/install

CLI

命令行工具或通常包含可执行文件的软件包(例如webpack)可在node_modules/.bin中使用,并且为了执行它们,它们必须位于您的shell的PATH中或直接调用。因为在项目中调用本地安装的可执行文件非常常见,所以您可以在package.jsonscripts部分中使用它们,而无需在其前面加上node_modules/.bin。例如,要运行webpack,您可以定义一个脚本:

"scripts": {
  "build": "webpack"
}

您可以直接运行npm run build,而不必每次都运行./node_modules/.bin/webpack。有关脚本的更多信息,请参见:https://docs.npmjs.com/misc/scripts


对于webpack,如果你使用npm install webpack -g全局安装了它,并且运行npm build命令,是否会失败,因为它没有在你的项目中本地安装?如果将上面的脚本部分放在package.json文件中,它是否仍然能够在根目录中找到webpack? - stackjlei
如果它在你的 shell 的 PATH 中,它就可以工作。全局安装(使用 -g)的包应该在你的 PATH 中(大多数 Node.js 安装都会这样做,或者告诉你如何做)。 - Michael Jungo

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