You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
考虑假设的,但通常的情况。我们正在研究一个功能A中位于三个文件夹深处的组件,并且我们要从位于两个文件夹深处的核心导入服务。这将导致导入语句看起来像import {SomeService} from '../../../core/user/user-settings/user-settings.service'这样。
v1.6.0-beta.2
Bug Fixes
@ngtools/webpack: fix elide removing whole imports on single match (62f3454), closes #8518
v1.5.2
Bug Fixes
@ngtools/webpack: fix elide removing whole imports on single match (62f3454), closes #8518
前言
使用Angular CLI开发Angular应用程序是一个非常愉快的体验!
Angular团队
为我们提供了惊人的CLI
工具,支持大部分开箱即用的构建项目所需要的功能。标准化的项目结构,具有全面的测试功能(单元测试和e2e测试),代码脚手架,支持使用环境特定配置的生产级构建。这是一个强大功能的脚手架,为我们每个新项目节省了大量的时间。这里要感谢
Angular团队
!虽然
Angular CLI
从一开始就非常好用,也有很多吐槽点(吐槽在最后),但是我们可以利用一些潜在的配置改进和最佳实践来使我们的项目更加完善!我们需要了解什么?
安装和使用(需要科学上网,不然以下安装会有各种问题)
安装nodejs
官网下载即可,注意:下载v8.x版本
安装 Angular CLI
注意:Windows下面安装angular-cli有两个典型的坑,一个是node-sass被墙了,第二个就是node-gyp依赖于某些API,必备需要安装:python2.7(一定要2.7)、Visual Studio(包含VB,C++等,不过有点大10g左右)
如果安装不成功可以使用以下方式:
创建新项目
注意:ng new my-app 失败?npm-gyp没安装,环境不行- Environment setup and configuration
1. 规划模块--基于核心模块,共享模块和特性模块与懒加载的模块结构的最佳实践
一个好的设计方式是把我们的应用程序分成至少三个不同的模块 - 核心模块,共享模块和特性模块(尽管我们可能需要多个特性模块)【特性模块就是我们常说每个功能页面】,如果我们不想使用第三方UI组件库,那我们还需要一个UI模块来修饰。
CoreModule【核心模块】
在Angular官网模块部分也专门指出用核心模块,只在应用启动时导入它一次,而不会在其它地方导入它。
在所有每个应用程序(单例服务)上必须有且仅有一个实例的服务应该在这里实现。典型的例子可以是认证服务或用户服务。我们来看一个CoreModule实现的例子。
core.module.ts
SharedModule 【共享模块】
在Angular官网模块部分也专门指出用共享模块,只在特性模块里导入它一次,而不需要再去导入其他Angular核心模块和第三方模块,我们自定义组件,指令,管道。
所有的应用组件,指令和管道应该在这里管理。这些组件不会在其构造函数中从核心或其他功能导入和注入服务。他们应该通过使用它们的组件模板中的属性来接收所有的数据。这一切都归结于SharedModule对我们的应用程序的其余部分没有任何依赖性的事实。这也是导入和导出UI组件,业务通用组件的理想场所。
shared.module.ts
CoreModule和SharedModule区别
总结:CoreModule 只有导入没有导出,SharedModule有导入导出,却没有服务依赖注入管理,这个需要在 CoreModule 里面操作。
使用Angular CLI构建项目结构
我们可以在创建新项目后立即生成Core和Shared模块。这样,我们将准备从一开始就生成额外的组件和服务。
运行
ng generate module core
可以生成模块核心。具体规则可以看这里ng generate然后在
core
文件夹中创建index.ts
文件,并重新导出CoreModule本身。代码:
export * from './core.module';
在进一步开发的过程中,我们会再出口更多的公共服务,这些服务应该在
index.ts
提供。core/index.ts
如何访问:
app.module.ts
好处我不需要关心里面的CoreModule 所在文件位置,只需要关心我对于的导出依赖名称即可。
同样,我们可以为共享模块做同样的事情。
FeatureModule 【特性模块】
在Angular官网模块部分也专门指出用特性模块,特性模块是带有@NgModule装饰器及其元数据的类,就像根模块一样。 特性模块的元数据和根模块的元数据的属性是一样的。根模块和特性模块还共享着相同的执行环境。 它们共享着同一个依赖注入器,这意味着某个模块中定义的服务在所有模块中也都能用。
它们在技术上有两个显著的不同点:
特性模块用来提供了内聚的功能集合。 聚焦于应用的某个业务领域、用户工作流、某个基础设施(表单、HTTP、路由),或一组相关的工具集合。
将为我们的应用程序的每个独立功能创建多个功能模块。功能模块应该只从CoreModule导入服务。
如果功能模块A需要从功能模块B导入服务,则考虑将该服务移入CoreModule。
这将保持我们的代码清洁,易于维护和扩展的新功能。这也减少了重构所需的工作量。如果正确执行,我们将确信更改一个功能不会影响或破坏我们的应用程序的其余部分。
LazyLoading 【懒加载模块】
懒加载需要配合路由完成. 可以看伪代码
app-routing.module.ts
我们应该尽可能延迟加载我们的功能模块。理论上,应用程序启动期间只能同步加载一个功能模块以显示初始内容。在用户触发导航之后,每个其他功能模块应该被延迟加载。
附上一张自己YY的应用架构图
2. 为应用程序和环境文件夹设置别名
别名我们的应用程序和环境文件夹将使我们能够实施干净的入口,这将在整个应用程序中保持一致。
考虑假设的,但通常的情况。我们正在研究一个功能A中位于三个文件夹深处的组件,并且我们要从位于两个文件夹深处的核心导入服务。这将导致导入语句看起来像import {SomeService} from '../../../core/user/user-settings/user-settings.service'这样。
是不是很不爽。。。
更不爽的是,任何时候我们想改变这两个文件中的任何一个的位置,我们的导入语句就会中断,需要重新去改引入url地址,有些编辑器可以帮我们重构这个问题,例如:Webstorm。
曾经看过vue-cli,在它里面构建里面路径是‘@/xxx’ 如果没有记错,(ps:因为快一年没有使用了)。应该是这样的,@代表src,这个是webpack里面设置的别名功能。
在Angular-cli去改Webpack配置是一个很麻烦的事情,我们可以修改
tsconfig.json
配置。为了能够使用别名,我们必须添加
baseUrl
和paths
属性到我们的tsconfig.json文件中,像这样...注意:如果报错找不到@app/xxxx模块,需要把
"baseUrl": "src"
换成"baseUrl": "./src"
。随着我们的路径,我们现在可以导入像这样的环境和服务...
user.module.ts
您可能已经注意到我们直接从
@app/core
而不是@app/core/user/user .service
导入实体(如上例中的UserService)。这是可能的,这要归功于重新导出主index.ts
文件中的每个公共实体。我们创建一个index.ts文件每个包(文件夹),他们看起来像这样...在大多数应用程序中,特定功能模块的组件和服务通常只需要访问来自CoreModule的服务和来自SharedModule的组件即可。有时这可能不足以解决特定的业务案例,我们还需要某种“共享功能模块”,为其他功能模块的有限子集提供功能。
在这种情况下,我们将最终得到来自
import { FeatureService } from '@app/shared-feature';
因此与核心类似,也使用@app别名访问共享特征。3. 使用Sass 和第三方UI组件
Sass是一个样式预处理器,它支持像变量这样的强大的东西(即使css也会很快得到变量),函数,mixins 等,你把它命名为...
Sass还需要有效地使用官方Angular Material Components库以及其广泛的主题功能。假设使用Sass是大多数项目的默认选择是安全的。
要使用Sass,我们必须用--style scss标志来使用Angular CLI生成我们的项目,或者在defaults和styleExt来设置。默认情况下,没有添加的是stylePreprocessorOptions和includePaths,我们可以使用强制性的根“./”和可选的“./themes”值来设置。
angular-cli.json
常用的UI组件:
4. 如何建立良好的生产构建
Angular CLI生成的项目只带有一个非常简单的ng build脚本。要生成生产级的工件,我们必须自己做一些定制。
我们在package.json脚本中添加
“build:prod”:“ng build --target production --build-optimizer --vendor-chunk”
。发布生产
这是一个设置开关,它使代码缩小和默认情况下很多有用的构建标志。这相当于使用以下...
--environment prod
使用environment.prod.ts
文件的环境变量--aot
启用前期编译。这是目前版本的Angular CLI的默认设置。如果你使用低版本,必须手动启用它--extract-css true
将所有的CSS提取到独立的样式表文件中--sourcemaps false
禁用压缩文件对应map的生成--named-chunks false
禁用使用人类可读名称的块和使用数字其他有用的设置
--build-optimizer
新功能,导致更小的捆绑,但更长的构建时间,所以谨慎使用!(也应该在未来默认启用)--vendor-chunk
将所有第三方依赖(库)代码提取到单独的块中另外检查其他可用的配置标志官方文档,这可能在您的个人项目中有用。
5. 使用Headless Chrome代替Phantom JS
PhantomJS是一个非常知名的headless browser(ps: 无头浏览器 很恐怖),它实际上是用于在CI服务器和许多开发机器上运行前端测试的解决方案。
虽然还算不错,但对现代ECMAScript功能的支持还是比较滞后的。更为严重的是,这些非标准的行为在本地没有问题地通过测试的时候就曾多次引起头痛,但是仍然打破了CI的环境。
幸运的是,我们不必再处理它了!
正如官方文件所说...
那么我们如何在Angular CLI项目中使用它?
我们在项目的
package.json
添加如下代码...package.json
6. 使用标准的提交消息
可以看这里我的这篇文章GET新技能之Git commit message。
快速总结一下我们感兴趣的项目的新功能和缺陷修复是非常好的。
让我们为用户提供相同的便利!
手动编写更改
CHANGELOG.md
将是极其繁琐的容易出错的任务,因此最好是自动执行该过程。有很多可用的工具Conventional Commits specification可以完成这项工作,但我们只关注标准版本。
常规提交定义了强制类型,可选(范围):后跟提交消息。也可以添加可选的正文和页脚,两者都用空行分隔。通过查看angular-cli的完整提交消息的示例,我们来看看在实践中该如何实现。
由于BREAKING CHANGE关键字在提交主体中的存在,标准版本将正确地冲击项目的MAJOR版本。
生成的CHANGELOG.md将会看起来像这样...
看起来是不是很酷呀!那么我们怎样才能在我们的项目中使用这个?
我们首先安装
npm install -D standard-version
将其保存在我们的devDependencies中,并将“release”:“standard-version”
添加到我们的package.json
scripts中。package.json
我们还可以添加
git push
和npm publish
来自动完成整个过程。在这种情况下,我们需要改进脚本为下面例子
package.json
7. 如何通过CLI配置代理API请求
目前开发都是前后分离式的开发,前端使用CLI启动服务端口一般都是4200,后台也有API端的,nodejs一般常用都是3000,如果直接去请求3000端口的数据就好出现跨域请求。
跨域请求(同源策略)
简单理解跨域:不同的协议(http|https),不同的IP,不同的端口
本地开发ip都一样,不一样的是端口号,这样跨域浏览器会有
这样的报错信息,那么我们需要用代理,代理方式有很多。这里不介绍其他就说CLI里面如何配置的。
CLI如何配置
proxy.conf.json
,这个文件名字不需要固定(我为了适应不同场景,还是做不同代理配置,proxy-dev.conf.json,proxy-test.conf.json,,因为后台很多,有时候需要直接去联调他们电脑服务)假设:跨域请求地址是
http://localhost:8000/api/user/123
Angular里面使用 (默认服务是http://localhost:4200)
package.json
文件里的scripts
也需要配置npm start
或者npm run serve
就可以运行代理了附上nodejs转发API源码:
新建一个dev.js
解释:
CLI默认带
express
相关的包,自己去下载一个superagent
请求包,还有一个并行处理npm命令的包concurrently
这里可以修改一下脚本命令:
就可以一个命令来控制。
其他相关技巧(待续,不断完善中...)
推荐vscode插件
git commit message书写规范提示模板
ng4/5非常不错简写提示插件
关于模拟API请求数据
如果只想做简单演示,模拟API请求,熟悉HTTP请求,又不想起一个本地后台服务器或者模拟mack服务器,那怎么办?
.angular-cli.json
src
文件夹下创建一个api
文件夹,你需要本地数据都可以丢里面。在api文件里创建了一个
test.json
,写点假数据吧,那我们怎么去请求了?注意:/api就是前面创建的
src/api
文件夹,因为src
是根目录,所以我们只需要/api
即可The text was updated successfully, but these errors were encountered: