问题如下:我每周制作4-5个小网站,并使用工具(webpack,ejs等)。因此,我一直在努力的每个网站,我在当地做了npm install
。我的旧机器配备硬盘驱动器是可以的,但现在我只买了一台带SSD的新笔记本电脑(并且没有机会返回硬盘)。关键是,我害怕每周做4次npm install
太快杀死我的SSD驱动器。有没有合理的方法来优化这个?也许我可以在全球范围内安装devDependencies
或者在某处安装它并链接到它们,并在本地安装仅prod dependencies
?
这是我的平均package.json
deps:
"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或其他东西)或者是否有更优化的方法。
我下面的原始解决方案是hacky,并且有一些缺点。另一方面,正如@sachin Gupta所建议的那样,pnpm似乎是解决问题的直接解决方案。我还没有尝试过,但如果文档没有说谎,就像following the installation guide一样简单,然后只需使用命令$ pnpm
而不是$ npm
来安装项目的依赖项。
解决问题的一种方法是让所有项目文件夹成为另一个-let的子文件夹,称之为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
这只是一个例子。唯一重要的部分是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
。所以,在这个例子中,qazxsw poi的qazxsw poi有一个qazxsw poi依赖,你可以设置root
脚本,如:
node_modules
当你在终端中运行tslint
时,web-project-1/package.json
的"scripts": {
"lint": "tslint --project . --fix"
},
tslint二进制文件将用于执行该命令。
每个其他构建步骤开发依赖项都会发生同样的情况,例如npm run lint
,root
,node_modules
等。
不好的一面是,如果你从他们的webpack
gulp
任何一个孩子,那个node-sass
中列出的依赖关系也会安装在孩子们身上,即使他们已经存在于父母身上。如果你想在他们的npm install
中声明孩子们的dev依赖关系,这使得这种方法非常讨厌:你应该在每次执行package.json
时手动删除孩子们中的重复deps。
但是,由于您只提供package.json
文件夹,因此您不需要在其package.json
中列出每个项目的dev依赖项。如果你需要与另一个开发人员合作,你可以将npm install
的dist
传递给他们,这样他们就可以获得dev依赖关系了。
这种方法的优势在于您不需要在新项目的每个package.json
中手动设置符号链接。
root
上列出dev依赖项,除非你愿意在每次package-json
后从package-json
手动删除它们,这是我认为太麻烦了。package.json
中列出它:它将安装在子项的node_modules
中。