问题如下:
我每周制作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",
/* ... */
}
结果是这样的:
...一切正常。
现在,我想知道这是否是最适合我的情况的解决方案(考虑到这只是本地开发人员的需要,我不使用docker之类的东西)还是有更好的方法呢?
答案 0 :(得分:1)
我下面的原始解决方案是hacky,有一些缺点。另一方面,如@sachin Gupta所建议,pnpm 似乎是解决问题的直接方法。我还没有尝试过,但是如果文档没有撒谎,实际上就像following the installation guide一样简单,然后只需使用命令$ pnpm
而不是$ npm
来安装项目的依赖项。
解决问题的一种方法是让所有项目文件夹都成为另一个-root
-的子文件夹,该文件夹又具有package.json
和node_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
文件夹中。
子文件夹中的任何import
或require
都将使用root
的节点模块。因此,您的应用程序代码将使用父级的node_modules
,而无需进一步配置。当您在任何文件夹树中执行require
时,这就是node.js的默认行为:如果它在工作目录中找不到node_modules
,它将始终在父目录中寻找node_modules
直到根文件夹。
使用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 lint
,root
,node_modules
等,也是如此。
糟糕的是,如果您webpack
的任何子项gulp
中,则node-sass
中列出的依赖项也将安装在子项中,即使它们是已经存在于父级上。如果要在子级npm install
中声明子级的dev依赖项,则使此方法变得很讨厌:然后,每次执行package.json
时,都应在子级中手动删除重复的dep。
但是,由于您仅交付package.json
文件夹,因此您实际上并不需要在其package.json
中列出每个项目的开发依赖关系。如果您需要与其他开发人员合作,则可以将npm install
的{{1}}传递给他们,这样他们就可以正确获得开发依赖关系。
与您的方法相比,此方法的优势在于您无需在新项目的每个dist
中手动设置符号链接。
package.json
上列出dev依赖项,除非您愿意在每个root
之后从package-json
手动删除它们,这对于我相信很麻烦。package-json
中列出它:它将安装在子项package.json
中。 答案 1 :(得分:0)
我处于类似的位置,因为我(也许太多)非常清楚我的SSD写入周期限制,并担心所有npm install
都会缩短使用寿命。
起初我不太愿意,因为我通常在尝试新事物之前就开始了,但是一旦尝试了,我就再也不会回到纯npm
了(除非他们默认使它像pnpm一样工作)
他们的网站上没有文档,安装就像运行一个命令一样简单:
npx pnpm add -g pnpm
然后您可以像通常使用npm
一样使用它。 node_modules
文件夹要干净得多,因为它不包含依赖项的每个依赖项,而只是项目实际依赖项的文件夹别名。
pnpm install
速度如此之快,特别是如果您已经安装了一堆依赖项,因为那样就可以将它们链接到项目,而无需再次下载它们。