node.js - 如何仅安装 typescript 依赖项并构建(package.json,npm),构建时避免 150MB 的依赖项
问题描述
我想知道是否有办法:
- 只安装构建所需的依赖项,避免 150MB 的垃圾;
- 建造;
- 然后删除仅需要构建但不需要运行的依赖项。
这更像是一个疑问而不是现在的需要
我有以下依赖项:
"devDependencies": {
"@types/node": "^16.0.0",
"@typescript-eslint/eslint-plugin": "^4.31.1",
"@typescript-eslint/parser": "^4.31.1",
"commitizen": "^4.2.4",
"cz-conventional-changelog": "3.3.0",
"eslint": "^7.12.1",
"eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.3",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^5.0.0",
"prettier": "^2.4.1",
"ts-node-dev": "^1.1.8",
"typescript": "^4.3.5"
},
"dependencies": {
"dotenv": "^10.0.0"
}
而且我注意到了一点,我在编译 typescript 时有很多无用的依赖项,因为只是为了编译,我只需要 3 个:
"devDependencies": {
"@types/node": "^16.0.0",
"typescript": "^4.3.5"
},
"dependencies": {
"dotenv": "^10.0.0"
}
只有这 3 个依赖项才 60MB,如果我真的想要,我可以编译,删除依赖项并使用npm install --production
大约 1MB 的东西,这对我来说很棒,因为最终可以尽可能轻(有点夸张,但很酷)。现在,当我完全npm install
处理所有依赖项时,我达到了 150MB(这真的令人失望)。
我的问题是,有一种方法可以最小化构建过程中安装的依赖项,而不是将类型移动到依赖项(因为它们不是“生产”依赖项,仅用于“构建”)?
实际上在构建时我这样做:
npm i
npm run build
rm -rf node_modules # not sure if needed
npm i --production
这将生成一个小版本,但在此过程中,我需要安装大约 150MB 的不需要的软件包。
笔记:
- 我正在考虑在构建之前将其删除,但我想避免这样做
- 我考虑过可选依赖项,但看起来他们没有这个目的
- 我想保持依赖关系,因为它们在与其他人合作时保持代码一致并有助于避免错误
- “更大”的依赖是
typescript
61M,第二个是prettier
20M,我只typescript
需要构建,但我不需要它们中的任何一个来运行。 - 我只是想在构建时“解决”这个问题,在编码时我并不关心它
- 这里的问题不在最终构建中,而是在下载不必要的依赖项的过程中
解决方案
这里的问题不在最终构建中,而是在下载不必要的依赖项的过程中
这是在docker中完成的吗?
存在一个解决方案 - 您根据 package-lock.json 或 yarn.lock 的内容缓存依赖项
https://medium.com/@stepanvrany/how-to-build-nodejs-docker-image-using-cache-c401137661d0
推荐阅读
- c# - 在c#asp.net中通过postasync方法传递多个数据
- ios - 如何将闭包函数的返回值设置为变量?
- php - 如何使用 VK bot 确认服务器的 URL?
- python - 如何在python字符串中的子字符串之间查找子字符串?
- c++ - 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- memory-leaks - Kotlin伴随对象中的内存泄漏?
- javascript - 使用 scroll-spy 更改导航栏背景类
- python - scikit-learn 中带有 FeatureUnion 的自定义转换器 mixin
- youtube - videojs-youtube,如果同时设置了开始和结束参数,则两者都不起作用
- java - 如果项目已经有一个运行时类,我如何访问 java Runtime.getRuntime()?