npm install examplePackage
,那么这个包会被安装到你的硬盘上吗?那么这是否意味着你可以随时在任何文件中导入该包?这与在项目内部运行npm install examplePackage
有什么不同?是因为当你将项目推送到Github时,会有一个package.json供其他人遵循,并确保他们也拥有运行你的应用程序所需的必要库吗?Node如何知道在你的项目或硬盘中搜索包?它只是首先检查你的库,然后如果找不到它,就会在你的硬盘上查找吗?npm install examplePackage
,那么这个包会被安装到你的硬盘上吗?那么这是否意味着你可以随时在任何文件中导入该包?这与在项目内部运行npm install examplePackage
有什么不同?是因为当你将项目推送到Github时,会有一个package.json供其他人遵循,并确保他们也拥有运行你的应用程序所需的必要库吗?Node如何知道在你的项目或硬盘中搜索包?它只是首先检查你的库,然后如果找不到它,就会在你的硬盘上查找吗?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 examplePackage
。https://docs.npmjs.com/cli/install
命令行工具或通常包含可执行文件的软件包(例如webpack)可在node_modules/.bin
中使用,并且为了执行它们,它们必须位于您的shell的PATH
中或直接调用。因为在项目中调用本地安装的可执行文件非常常见,所以您可以在package.json
的scripts
部分中使用它们,而无需在其前面加上node_modules/.bin
。例如,要运行webpack,您可以定义一个脚本:
"scripts": {
"build": "webpack"
}
您可以直接运行npm run build
,而不必每次都运行./node_modules/.bin/webpack
。有关脚本的更多信息,请参见:https://docs.npmjs.com/misc/scripts
npm install webpack -g
全局安装了它,并且运行npm build
命令,是否会失败,因为它没有在你的项目中本地安装?如果将上面的脚本部分放在package.json文件中,它是否仍然能够在根目录中找到webpack? - stackjleiPATH
中,它就可以工作。全局安装(使用-g
)的包应该在你的PATH
中(大多数 Node.js 安装都会这样做,或者告诉你如何做)。 - Michael Jungo