Angular CLI 6:为什么需要它以及如何使用它



大家好!

Angular 2.0.0版于2016年9月发布。立即出现了许多在此框架上构建和构建应用程序的方法。 在Internet上,您可以找到各种口味的Angular种子。

我们还创建了自己的Angular种子:我们创建了一个通用的项目模板,要求所有开发前端的团队使用相同的应用程序结构。

六个月后的2017年3月,发布了Angular cli版本(cli-命令行界面)1.0.0。 这个想法作为基础,非常好:将在Angular 2+上开发应用程序的方法系统化。 标准化应用程序的结构,在应用程序内创建实体,并自动执行应用程序的组装。 Angular cli可以解决这些任务,从而大大节省您的时间。

在本文中,我将展示如何升级到Angular cli 6

使用自定义项目结构进行开发具有许多优点:

  • 完全控制应用程序;
  • 能够配置webpack / gulp /其他所有功能,并考虑到应用程序的所有功能。

也有缺点:

  • 如果有多个项目,则必须确保其结构相同;
  • 有必要监视使用过的npm模块和库的更新(例如,Angular和Webpack的开发非常动态);
  • 您将必须集成npm-modules并配置用于Angular的环境,连接热模块更换(HMR),使用提前(AOT)组件。

有几种方法可以弥补这些缺陷,其中一种是创建通用的项目模板 。 突出显示将不时更新它的开发人员。 为了强制所有前端团队使用相同的应用程序结构,在您的框架上应用最佳开发实践。 在此示例中,此框架将为Angular ,并且该应用程序将基于angular-cli

在撰写本文时,已发布了集成了webpack 4的第六个版本,其中有很多有关创新的信息,我将仅提及一些改进:

  • 自动创建组件库;
  • ng-update的出现,这使得对Angular cli项目的支持更加容易;
  • 与webpack 4集成,因此,最终捆绑包的尺寸更小,组装时间显着加快等。您可以在此处查看更新的完整列表;
  • 使用Schematics灵活配置Angular cli。

我必须说,在cli的第六版中有很多错误。 我会讲一些。 其中一些与angular cli相关,一些与webpack 4相关。例如,某些流行的webpack加载程序当前不支持收集器的第四版。 我确信这是暂时的困难。

应当指出,我认为开箱即用的cli功能足以解决标准应用程序中95%的任务。 如果您有幸修改其余的5%,请不要担心-您可以为项目配置angular cli。 的确,在该框架的第六版中,暂时禁用了允许您获取webpack.config的ng弹出功能,因此您必须稍作努力。

为过渡做准备


  1. 安装node.js > = 8.9的版本
  2. 我们执行npm i –g angular / cli (全局安装angular-cli以使用ng在控制台中执行命令)。
  3. 转到项目目录并执行ng new <您的项目名称> (我们将其称为项目:angular-cli-project,示例命令: ng new angular-cli-project-一个名为angular-cli-project的文件夹将出现在当前目录中)。

准备结果:



不仅要了解有关Angular cli的项目结构的更多信息。

接下来,我们将进行舒适开发的基本设置。

CLI设置


1)根据指南,我们连接了HMR (无需重新加载页面即可应用代码更改)。 还要在package.json中将hmr添加到脚本和--open标志中, 以免我们自己在浏览器中打开源页面:



在使用A6 cli撰写本文时,通过上述指南配置HMR时,您可能会遇到以下错误:

a)在angular.json中连接HMR配置时

"configurations": { "hmr": { "hmr": true, "fileReplacements": [{ "src": "src/environments/environment.ts", "replaceWith": "src/environments/environment.hmr.ts" }] }, … 

抱歉,您得到一个错误:
“架构验证失败,并出现以下错误:
数据路径“”不应具有其他属性(fileReplacements)“。

要解决此问题,请执行以下操作:

 "configurations": { "hmr": { "hmr": true, "browserTarget": "angular-cli-project:build:hmr" }, … 

不同之处在于,您必须指定“ browserTarget”:“ angular-cli-project:build:hmr” ,其中browserTarget属性的值由<project-name>:build:hmr组成

另外, HMR环境的替换必须不是在serve中完成,而是在Architect / build中完成

 "architect": { "build": { … "configurations": { "hmr": { "fileReplacements": [ { "src": "src/environments/environment.ts", "replaceWith": "src/environments/environment.hmr.ts" } ] }, … 

b) src / main.ts中的错误错误:找不到名称“模块”的问题已修复,如下所示:在tsconfig.app.json中,我们删除了“类型”行:[]

2. 连接预处理器

在angular.json中,添加:

 "projects": { … "prefix": "app", "schematics": { "@schematics/angular:component": { "styleext": "less" } } … 

如果您的样式在资产文件夹中,并且通过base.less或scss中的导入进行合并,并且输出需要一个.css文件,则将“ extractCss”:true添加到angular.json



同样,目前在HMR模式下,在全局更新中,无法通过导入导入较少的文件。 要变通解决此问题,临时安装less-loader@3.0.0

3.我们连接autoprefixer 。 在package.json中指定哪些浏览器需要前缀:

 "browserslist": [ "last 2 versions", "IE 10", "IE 11" ], … 

4.使用gulp和svgstore 添加图标处理 ,尤其是因为第四版的gulp终于问世了。 运行npm i gulp@4.0.0 gulp-inject gulp-rename gulp-svgmin gulp-svgstore --SD并创建一个小的Gulpfile.js (请参阅最终应用程序 )。

我们不会详细介绍Gulp-请在评论中回答所有问题。

index.html表示法中指定用于插入SVG的代码:

 <div style="height: 0; width: 0; overflow: hidden; opacity: 0;position: absolute; top: 0;left: 0;"> <!-- inject:svg --><!-- endinject --> </div> 

通过添加任务SVG来修改package.json

 "scripts": { ... "svg": "gulp svg", ... … 

现在,我们可以在模板中使用SVG,如下所示:

 <svg> <use href='#icon-check'/> </svg> 

5) 安装webpack-bundle-analyzer

通过运行命令: npm i webpack-bundle-analyzer –-SD

angular.json中添加“ statsJson”:true

 "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { ... "statsJson": true, ... 

现在,我们可以看到捆绑包实际由什么组成。 要以某种方式自动执行此操作,请将报告脚本添加到package.json

 "scripts": { ... "report": "webpack-bundle-analyzer dist/stats.json" ... … 

使用webpack-bundle-analyzer的示例:



基本功能设置完成。

现在打开我们的自定义角度应用程序,然后将模块,图像,样式等复制到准备好的模板中。 我将复制本文最终草案中的所有内容

我们执行以下命令: npm run hmr并从rxjs中获取一些错误,该错误已从第五版迁移到第六版。 下一指南将帮助修复它们

最终申请

我们执行以下命令: npm run build并得到结果:



PS如您所见,bundle的大小仍然足够大,但是它包括路由,rxjs等。但是,Angular团队宣布了新的渲染引擎Ivy和hello world应用程序大小为2.7 Kb。 期待它。

谢谢您的关注。

Source: https://habr.com/ru/post/zh-CN413543/


All Articles