将 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 相关的库。我只想严格安装 运行 我的应用程序(expressbody-parsercookie-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 中重复,所以不用担心。