将 Angular 的依赖项移动到 devDependencies
Move Angular's dependencies to devDependencies
我使用 Angular CLI ng new my-dream-app
生成了一个项目,我注意到我在 package.json
中得到了以下依赖结构
{
"dependencies": {
"@angular/animations": "~8.2.11",
"@angular/common": "~8.2.11",
"@angular/compiler": "~8.2.11",
"@angular/core": "~8.2.11",
"@angular/forms": "~8.2.11",
"@angular/platform-browser": "~8.2.11",
"@angular/platform-browser-dynamic": "~8.2.11",
"@angular/router": "~8.2.11",
"rxjs": "~6.4.0",
"tslib": "^1.10.0",
"zone.js": "~0.9.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.803.14",
"@angular/cli": "~8.3.14",
"@angular/compiler-cli": "~8.2.11",
"@angular/language-service": "~8.2.11",
"@types/node": "~8.9.4",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "^5.0.0",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.1.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~3.5.3"
}
}
现在假设我正在使用 CLI 生成的项目和处理静态资产的后端框架(例如 expressjs)。
此外,假设我想在某个云服务上部署我的应用程序。
我可以在本地构建静态资产,然后将整个项目移动到云端,我会 运行 npm i --production
只安装依赖项,然后 运行 npm start
但是,我不想在云端安装任何 Angular 相关的库。我只想严格安装 运行 我的应用程序(express
、body-parser
、cookie-parser
等)所需的内容。
现在是真正的问题:如果我手动将 Angular 的 dependencies
移动到 devDependencies
,CLI 是否仍能正常工作?诸如 ng 更新之类的东西?它会把一些依赖项从 devDependencies
移回 dependencies
吗?它会创建重复条目吗?
Angular CLI 创建一个 package.json
文件,其中列出了 dependencies
下的 Angular 项目运行时所需的包,以及使用devDependencies
下的 CLI。我真的不建议将 dependencies
移动到 devDependencies
,但我知道这样做的一般想法,因为在运行时,包已经使用 Webpack 打包到您的应用程序中。
回答您的问题:要使用 CLI 构建 Angular 2+,您肯定需要 Angular 的核心包(例如 @angular/core
、@angular/compiler-cli
、 etc...) 安装,因此将这些包移动到 devDependencies
并使用 npm i --production
将使您无法构建您的应用程序。因此,我不建议您使用 npm i --production
。
我的建议是使用 npm prune --production
如果您不想稍后安装它们(例如,在构建之后,如果您部署您的应用程序)。这就是我的团队所做的。
此外,为了回答您的最后一个问题,ng update
使用 npm
CLI 安装软件包; AFAIK,NPM 不允许在其 package.json
中重复,所以不用担心。
我使用 Angular CLI ng new my-dream-app
生成了一个项目,我注意到我在 package.json
{
"dependencies": {
"@angular/animations": "~8.2.11",
"@angular/common": "~8.2.11",
"@angular/compiler": "~8.2.11",
"@angular/core": "~8.2.11",
"@angular/forms": "~8.2.11",
"@angular/platform-browser": "~8.2.11",
"@angular/platform-browser-dynamic": "~8.2.11",
"@angular/router": "~8.2.11",
"rxjs": "~6.4.0",
"tslib": "^1.10.0",
"zone.js": "~0.9.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "~0.803.14",
"@angular/cli": "~8.3.14",
"@angular/compiler-cli": "~8.2.11",
"@angular/language-service": "~8.2.11",
"@types/node": "~8.9.4",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "^5.0.0",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.1.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"protractor": "~5.4.0",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~3.5.3"
}
}
现在假设我正在使用 CLI 生成的项目和处理静态资产的后端框架(例如 expressjs)。 此外,假设我想在某个云服务上部署我的应用程序。
我可以在本地构建静态资产,然后将整个项目移动到云端,我会 运行 npm i --production
只安装依赖项,然后 运行 npm start
但是,我不想在云端安装任何 Angular 相关的库。我只想严格安装 运行 我的应用程序(express
、body-parser
、cookie-parser
等)所需的内容。
现在是真正的问题:如果我手动将 Angular 的 dependencies
移动到 devDependencies
,CLI 是否仍能正常工作?诸如 ng 更新之类的东西?它会把一些依赖项从 devDependencies
移回 dependencies
吗?它会创建重复条目吗?
Angular CLI 创建一个 package.json
文件,其中列出了 dependencies
下的 Angular 项目运行时所需的包,以及使用devDependencies
下的 CLI。我真的不建议将 dependencies
移动到 devDependencies
,但我知道这样做的一般想法,因为在运行时,包已经使用 Webpack 打包到您的应用程序中。
回答您的问题:要使用 CLI 构建 Angular 2+,您肯定需要 Angular 的核心包(例如 @angular/core
、@angular/compiler-cli
、 etc...) 安装,因此将这些包移动到 devDependencies
并使用 npm i --production
将使您无法构建您的应用程序。因此,我不建议您使用 npm i --production
。
我的建议是使用 npm prune --production
如果您不想稍后安装它们(例如,在构建之后,如果您部署您的应用程序)。这就是我的团队所做的。
此外,为了回答您的最后一个问题,ng update
使用 npm
CLI 安装软件包; AFAIK,NPM 不允许在其 package.json
中重复,所以不用担心。