问题如下:我每周创建4到5个小型网站,并使用工具(webpack、ejs等)。所以我一直在做的每一个网站,我都是在本地做npm install的。我的旧机器和硬盘没什么关系,但现在我只买了一台只有SSD的新笔记本电脑(没有机会回到HDD上)。重点是,我害怕杀死我的SSD驱动器太快做npm install每周4次。有什么合理的方法来优化这一点吗?也许我可以全局安装devDependencies或者在某个地方安装它一次并链接到它们,并且只安装本地的prod 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"
}提前谢谢。
更新:可能已经解决了。
提到这条线,我在靠近根的单独文件夹中安装了devdep,在项目的package.json上,我按如下方式链接了devdep:
"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",
/* ... */
}结果如下:

...and一切都很好。
现在,我想知道这是否是我的情况下最合适的解决方案(考虑到这只是本地开发所需的,我不使用docker或其他什么的),还是有更好的方法。
发布于 2019-03-05 08:18:04
更新:
我最初的解决方案是黑客,也有一些缺点。另一方面,正如@sachin所建议的那样,pnpm似乎是解决问题的直接解决方案。我还没有试过,但是如果文档没有说谎,那么就像按照安装指南一样简单,然后只使用$ pnpm命令而不是$ npm来安装项目的依赖关系。
在根文件夹中存储公共依赖项
解决问题的一种方法是让所有的项目文件夹都成为另一个项目的子文件夹--让我们把它称为root-,而后者又有一个package.json和一个node_modules。这个root项目有您的项目共享的所有公共开发依赖项: webpack、babel、node等。
文件夹结构示例
. 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这只是一个例子。唯一重要的部分是,dev依赖项位于项目的父项目的node_modules文件夹中。
好的部分
import或require都将使用root的节点模块。因此,应用程序代码将使用父级的node_modules,而不需要进一步配置。这是在任何文件夹树中执行require时node.js的默认行为:如果在工作目录中找不到node_modules,它总是在父目录中查找node_modules,直到根文件夹。node_modules二进制文件的子程序中的任何npm脚本也会使用它们。这很好。因此,如果在任何子文件夹中都有一个以webpack作为package.json中定义的npm脚本的项目,您可以通过命令行:npm run webpack调用它,而不需要在子文件夹中安装node_modules。因此,在示例中,如果root的node_modules具有tslint依赖项,则可以设置如下所示的web-project-1/package.json脚本:
"scripts": {
"lint": "tslint --project . --fix"
},当您在终端中运行npm run lint时,将使用root的node_modules tslint二进制文件来执行该命令。
同样的情况也发生在其他的构建步骤开发依赖项上,比如webpack、gulp、node-sass等等。
坏的部分
坏的部分是,如果您从npm install中的任何一个子程序中安装了package.json,那么该package.json中列出的依赖项也将安装在子程序中,即使它们已经存在于父级上。如果您想在其package.json中声明子级的dev依赖项,这使得这种方法相当麻烦:然后,每次执行npm install时,您都应该手动删除子级中重复的dep。
但是,由于您只传递dist文件夹,所以您实际上不需要列出其package.json中每个项目的开发依赖项。如果您需要使用另一个开发工具,可以将root的package-json传递给它们,这样它们就可以正确地获得开发依赖项。
与您的方法相比,这种方法的优点是您不需要在新项目的每个package-json中手动设置符号链接。
关键点
package.json上列出开发依赖项,除非您愿意在每个npm install之后手动从node_modules中删除它们,我认为这太麻烦了。package.json中列出它:它将安装在子项目的node_modules中。发布于 2020-04-07 08:39:06
我也处于类似的境地,因为我(也许太过)意识到我的SSD写作周期限制,并且担心所有的npm install都会缩短我的生命。
PNPM去营救!
一开始我不太情愿,因为我通常是在尝试新东西之前,但是一旦我尝试了,我就再也不会回到纯npm (当然,除非他们默认使它像pnpm那样工作)。
他们网站上的文档并不可靠,安装过程就像运行一个命令一样简单:
npx pnpm add -g pnpm然后,您可以像通常使用npm那样使用它。node_modules文件夹非常干净,因为它并不包含依赖项的每个依赖项,而只是包含项目实际依赖项的文件夹别名。
pnpm install它的速度要快得多,特别是如果您已经安装了一堆依赖项,因为这只是将它们链接到项目中,而不必再下载它们。
https://stackoverflow.com/questions/54981157
复制相似问题