2017-02-14 148 views
3

我对webpack的工作原理有些困惑。如果您在根目录中运行npm install examplePackage,是否将软件包安装到硬盘上?那么这是否意味着您可以随时在任何文件中导入该软件包?这与在项目中运行npm install examplePackage不同,这与之有何不同?是因为当你将项目推送到Github时,会有一个package.json供其他人使用,并确保他们有必要的库来运行你的应用程序?节点知道如何通过项目搜索包或硬盘驱动器?它只是先检查你的图书馆,然后如果它没有找到它,它会看你的硬盘?全球webpack安装与项目特定的webpack安装

回答

3

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

这确实意味着您可以从文件系统的任何位置导入已安装在/中的软件包。尽管在/中只安装所有依赖关系是可能的,但具有项目特定依赖关系的优点很多。可能最大的优点是,您可以轻松地与其他人共享您的项目,并且可以确保它能够为他们工作(假设兼容的Node.js版本)。

节点知道如何通过您的项目搜索包或硬盘?

它只在你的硬盘上,特别是在上面提到的node_modules目录中。正如您已经注意到的,您可以在package.json中指定依赖关系,但节点本身对此信息不做任何处理。相反,您需要运行npm install,这将安装所有列出的依赖关系package.json。之后,您可以正确导入这些模块。

注:npm install examplePackage不添加examplePackagepackage.json,它只是安装它。如果您想将其作为依赖项添加,请使用npm install --save examplePackage或者将其作为npm install --save-dev examplePackage的devDependency。 https://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

+0

对于webpack,如果你'npm install webpack -g',并且你运行'npm build',它不会工作,因为它没有在本地安装到你的项目中?如果您将脚本部分放在package.json中,那么它是否仍然能够在根目录中找到webpack? – stackjlei

+0

它会工作,如果它在你的shell的'PATH'中。全局安装(使用'-g')包应该放在你的'PATH'中(大多数的Node.js安装都会这样做,或者告诉你如何去做)。 –