【问题标题】:Reduce size of Angular Element output with peerDependencies使用 peerDependencies 减小 Angular Element 输出的大小
【发布时间】:2019-05-08 13:32:52
【问题描述】:

我们正在尝试构建一个应该在 AngularJS 项目中使用的 Angular Element(使用 Angular 7)。输出的 .js 文件有 5 MB 大……太多了。

使用 webpack-bundle-analyzer 的分析表明,大部分空间都被 AngularJS 项目中也需要的依赖项使用 - 不必在代码中包含两次库。

所以我的想法是在 package.json 中将这些依赖项声明为 peerDependencies。我希望输出文件会变小。 但不幸的是,peerDependencies 的构建结果大小相同。我误解了 peerDependencies 的概念还是需要一个特殊的构建参数?

"dependencies": {
    "@angular/animations": "^7.2.7",
    "@angular/cdk": "^7.3.3",
    "@angular/common": "^7.2.7",
    "@angular/compiler": "^7.2.7",
    "@angular/core": "^7.2.7",
    "@angular/elements": "^7.2.7",
    "@angular/forms": "^7.2.7",
    "@angular/http": "^7.2.7",
    "@angular/material": "^7.3.3",
    "@angular/platform-browser": "^7.2.7",
    "@angular/platform-browser-dynamic": "^7.2.7",
    "@angular/router": "^7.2.7",
    "@angular/upgrade": "^7.2.7",
    "dateformat": "^3.0.2",
    "in-view": "^0.6.1",
    "keycode": "^2.1.9",
    "lodash": "^4.17.5",
    "material-design-icons": "^3.0.1",
    "ng2-nouislider": "^1.7.13",
    "nouislider": "^12.1.0",
    "reflect-metadata": "^0.1.12",
    "rxjs": "6.4.0",
    "rxjs-compat": "^6.0.0-rc.0",
    "zone.js": "^0.8.29"
  },
  "peerDependencies": {
    "compass-mixins": "^0.12.10",
    "core-js": "^2.5.4",
    "devextreme": "^18.2.6",
    "devextreme-angular": "^18.2.6",
    "devextreme-intl": "^18.2.6",
    "jquery": "^3.0.0",
    "muuri": "0.5.4",
    "moment": "^2.22.2"
  },
 "devDependencies": {
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "~7.3.4",
    "@angular/compiler-cli": "7.2.7",
    "@angular/language-service": "~7.2.7",
    "@angular/platform-server": "7.2.7",
    "@types/dateformat": "^1.0.1",
    "@types/jasmine": "^2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/jquery": "^3.2.12",
    "@types/node": "^8.9.5",
    "clang-format": "^1.0.32",
    "core-js": "^2.5.4",
    "codelyzer": "~4.5.0",
    "compass-mixins": "^0.12.10",
    "css-loader": "^0.28.7",
    "del": "^3.0.0",
    "devextreme": "^18.2.6",
    "devextreme-angular": "^18.2.6",
    "devextreme-intl": "^18.2.6",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "file-loader": "^1.1.1",
    "fs-extra": "^4.0.1",
    "html-loader": "^0.5.1",
    "html-webpack-plugin": "^3.2.0",
    "jasmine-core": "^2.99.0",
    "jquery": "^3.0.0",
    "karma": "~4.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "karma-sourcemap-loader": "^0.3.7",
    "karma-typescript": "^4.0.0",
    "lodash.throttle": "^4.1.1",
    "moment": "^2.22.2",
    "muuri": "0.5.4",
    "ng-packagr": "^5.1.0",
    "ng-annotate-webpack-plugin": "^0.2.1-pre",
    "ng-focus-if": "^1.0.7",
    "node-sass": "^4.10.0",
    "node-sass-json-importer": "^3.0.2",
    "pre-commit": "^1.2.2",
    "properties-loader": "0.0.1",
    "protractor": "~5.4.0",
    "sass-loader": "^7.0.1",
    "script-loader": "^0.7.2",
    "source-map-loader": "^0.2.1",
    "style-loader": "^0.21.0",
    "ts-loader": "^4.2.0",
    "ts-node": "~7.0.0",
    "tslint": "^5.11.0",
    "typescript": "3.2.4",
    "webpack-bundle-analyzer": "^3.0.3"
  }

例如,Devextreme 依赖项需要 1,88 MB 的磁盘空间,也作为对等依赖项。

【问题讨论】:

  • 你需要捆绑这个吗?它不是一个分布式库。这是一个包裹。所以主机包负责捆绑这个,不是吗?主机包应该只安装这个包。
  • 基本思想是:AngularJS 宿主不需要了解我们的 Angular 7 框架,只需包含生成的、与框架无关的 JavaScript - 由 Angular Elements 构建的自定义组件。我想当我们的项目作为一个包使用时,宿主也必须关心Angular 7……还是我错了?
  • 我认为你在某种程度上回答了你自己的问题。您的意图是将角度元素部署为自引导,因此无论主机环境如何,它都需要自己的依赖项。对等依赖项是为了减少包重复,这听起来像是一个不同的问题。
  • 感谢您的澄清......所以我想我们需要重新考虑一下这个场景。

标签: angular npm webpack angular-elements peer-dependencies


【解决方案1】:

commetns 中已经涵盖了对等依赖项部分,很明显您喜欢共享 Angular Element 的依赖项。问题是,这还没有得到官方支持。

解决方案可能是ngx-build-plus

使用这个 CLI 插件,可以在 Angular Elements 之间共享依赖关系。 这在第 5 步中进行了描述:

创建一个带有部分 webpack 配置的 webpack.extra.js 文件,告诉 webpack 排除像 @angular/core 这样的包:

module.exports = {
    "externals": {
        "rxjs": "rxjs",
        "@angular/core": "ng.core",
        "@angular/common": "ng.common",
        "@angular/platform-browser": "ng.platformBrowser",
        "@angular/elements": "ng.elements"
    }
}

【讨论】:

  • 感谢您的提示。我按照链接页面中的说明准备了项目。减少对上述依赖项有效,包大小减少到 4.7 MB(从 5 MB)。不幸的是,当我将最大的依赖项“devextreme”添加到外部列表时,它根本不会影响输出大小。
  • 由于我没有使用 DevExtreme 的经验,很遗憾我不能给你进一步的提示,但我希望你能弄清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多