在npm安装到SSD驱动器上需要建议

时间:2019-03-04 10:21:10

标签: node.js npm

问题如下: 我每周制作4-5个小型网站,并使用工具(webpack,ejs等)。因此,我一直在研究的每个网站都是在本地进行npm install。我的旧硬盘驱动器还可以,但是现在我有了一台只有SSD的新笔记本电脑(没有机会返回HDD)。关键是,我怕每周执行4次npm install会很快杀死我的SSD驱动器。有什么合理的方法可以优化此效果吗?也许我可以全局安装devDependencies或将其安装一次并链接到它们,并且仅在本地安装dependencies产品?

这是我的平均package.json深度:

"dependencies": {
  "siema": "^1.5.1"
},
"devDependencies": {
  "autoprefixer": "^9.1.5",
  "copy-webpack-plugin": "^4.5.2",
  "ejs-compiled-loader": "^1.1.0",
  "group-css-media-queries-loader": "^2.0.2",
  "postcss-loader": "^3.0.0",
  "babel-core": "6.26.3",
  "babel-loader": "7.1.5",
  "babel-polyfill": "^6.0.16",
  "babel-preset-env": "1.7.0",
  "babel-preset-stage-0": "^6.0.15",
  "clean-webpack-plugin": "0.1.19",
  "cross-env": "5.2.0",
  "css-loader": "1.0.0",
  "file-loader": "1.1.11",
  "html-webpack-plugin": "3.2.0",
  "jimp": "^0.6.0",
  "mini-css-extract-plugin": "^0.4.3",
  "node-sass": "4.9.2",
  "optimize-css-assets-webpack-plugin": "^5.0.1",
  "puppeteer": "^1.11.0",
  "raw-loader": "^1.0.0",
  "sass-loader": "7.0.3",
  "style-loader": "0.21.0",
  "uglifyjs-webpack-plugin": "^2.0.1",
  "url-loader": "1.0.1",
  "webpack": "4.16.3",
  "webpack-cli": "3.1.0",
  "webpack-dev-server": "^3.1.10",
  "webpack-merge": "4.1.3"
}

谢谢。

更新:可能已解决。

参考this thread,我将devdeps安装在靠近root的单独文件夹中,并在项目的package.json处将devdeps链接如下:

"devDependencies": {
  "autoprefixer": "file:c:/_npmg/node_modules/autoprefixer",
  "copy-webpack-plugin": "file:c:/_npmg/node_modules/copy-webpack-plugin",
  "ejs-compiled-loader": "file:c:/_npmg/node_modules/ejs-compiled-loader",
  /* ... */
}

结果是这样的:

node_modules: size and structure

...一切正常。

现在,我想知道这是否是最适合我的情况的解决方案(考虑到这只是本地开发人员的需要,我不使用docker之类的东西)还是有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

更新:

我下面的原始解决方案是hacky,有一些缺点。另一方面,如@sachin Gupta所建议,pnpm 似乎是解决问题的直接方法。我还没有尝试过,但是如果文档没有撒谎,实际上就像following the installation guide一样简单,然后只需使用命令$ pnpm而不是$ npm来安装项目的依赖项。

将常见依赖项存储在根文件夹中

解决问题的一种方法是让所有项目文件夹都成为另一个-root-的子文件夹,该文件夹又具有package.jsonnode_modules 。这个root项目具有您项目共享的所有常见开发依赖项:webpack,babel,node-sass等。

文件夹结构示例

. root/
+-- node_modules/
+-- package.json
|   +-- web-project-1/
|     +-- package.json
|     +-- src/
|       +-- main.js
|       +-- index.html
|     +-- dist/
|       +-- index.html
|   +-- web-project-1/
|     +-- package.json
|     +-- src/
|       +-- main.js
|       +-- index.html
|     +-- dist/
|       +-- index.html

这只是一个例子。唯一重要的部分是,开发依赖项位于项目的父项node_modules文件夹中。

好的部分

  1. 子文件夹中的任何importrequire都将使用root的节点模块。因此,您的应用程序代码将使用父级的node_modules,而无需进一步配置。当您在任何文件夹树中执行require时,这就是node.js的默认行为:如果它在工作目录中找不到node_modules,它将始终在父目录中寻找node_modules直到根文件夹。

  2. 使用node_modules二进制文件的子级中的任何npm脚本也将使用它们。那很整齐。因此,如果在任何子文件夹中都有一个webpack作为package.json中定义的npm脚本的项目,则可以从命令行:npm run webpack调用它,而无需{ {1}}安装在子文件夹中。

因此,在此示例中,如果node_modules的{​​{1}}具有root依赖性,则可以设置node_modules脚本,例如:

tslint

当您在终端中运行web-project-1/package.json时,"scripts": { "lint": "tslint --project . --fix" }, 的{​​{1}} tslint二进制文件将用于执行该命令。

对于其他所有构建步骤dev依赖项,例如npm run lintrootnode_modules等,也是如此。

不良部分

糟糕的是,如果您webpack的任何子项gulp中,则node-sass中列出的依赖项也将安装在子项中,即使它们是已经存在于父级上。如果要在子级npm install中声明子级的dev依赖项,则使此方法变得很讨厌:然后,每次执行package.json时,都应在子级中手动删除重复的dep。

但是,由于您仅交付package.json文件夹,因此您实际上并不需要在其package.json中列出每个项目的开发依赖关系。如果您需要与其他开发人员合作,则可以将npm install的{​​{1}}传递给他们,这样他们就可以正确获得开发依赖关系。

与您的方法相比,此方法的优势在于您无需在新项目的每个dist中手动设置符号链接。

要点

  • 父级必须具有项目的所有dev依赖项。
  • 您不能在子项package.json上列出dev依赖项,除非您愿意在每个root之后从package-json手动删除它们,这对于我相信很麻烦。
  • 如果您在一个特定项目中需要依赖关系的另一个版本,则实际上您可以 package-json中列出它:它将安装在子项package.json中。

答案 1 :(得分:0)

我处于类似的位置,因为我(也许太多)非常清楚我的SSD写入周期限制,并担心所有npm install都会缩短使用寿命。

PNPM进行救援!

起初我不太愿意,因为我通常在尝试新事物之前就开始了,但是一旦尝试了,我就再也不会回到纯npm了(除非他们默认使它像pnpm一样工作)

他们的网站上没有文档,安装就像运行一个命令一样简单:

npx pnpm add -g pnpm

然后您可以像通常使用npm一样使用它。 node_modules文件夹要干净得多,因为它不包含依赖项的每个依赖项,而只是项目实际依赖项的文件夹别名。

pnpm install

速度如此之快,特别是如果您已经安装了一堆依赖项,因为那样就可以将它们链接到项目,而无需再次下载它们。