zoukankan      html  css  js  c++  java
  • Angular 学习笔记 (version 6 小笔记)

    1. lazyload 的 path 变成相对路径了, 不过如果你用 ng update 的话, 依然可以不需要修改, cli config 好像能调支持绝对路径的写法. 

    const routes: Routes = [
      { path: '', loadChildren: './home/home.module#HomeModule' },
    ];

    2. 新的 providers 依赖注入机制 tree shakeable (可树摇)

    从前我们通过在 module.providers 或 component.providers 提供我们的服务生产方式. 

    即使最后没有任何组建 inject 这些服务,但是最终的 bundle js 里依然会有这些代码.这不好. 

    所以提供了一种新的写法 ProvideIn 

    import { Injectable, InjectionToken, inject, LOCALE_ID, Inject } from '@angular/core';
    
    export let AbcServiceConfig = new InjectionToken<string>('AbcServiceConfig', {
      providedIn: 'root',
      factory: AbcServiceConfigFactory
    });
    export function AbcServiceConfigFactory(): string {
      return inject(LOCALE_ID);
    }
    
    @Injectable({
      providedIn: 'root',
      // useFactory : () => new AbcService('tata')
    })
    export class AbcService {
      name = 'keatkeat'
      constructor(
        @Inject(AbcServiceConfig) private dada: string
      ) {
        this.name = dada;
      }
    }

    写了 ProvideIn 就不需要去写 module.providers 了 (当然你要写还是可以的, 以前的机制依然可以使用,并没有冲突)

    新的机制下,只要没有 inject 服务,那么 tree shake 可以完全把这个服务代码移除. 不会在最终的 bundle.js 里面. 

    我个人觉得这个新机制并不太容易理解. 我做了一些测试,得出了一些结论. 

    1. provideIn : 'root' 全局服务 

    -这个可以对应从前的 module.providers. 但有一点要注意. 

     module.providers 会因为 lazyload 而产生特别的结果 (本来 module.providers 应该是全局单列, 但是lazyload会把它变成不是全局)

     而 providerIn : 'root' 一定是全局单列,即使你在 lazyload 的 module.component 才注入服务. 

    -angular bundle 很厉害, 虽然你表示 'root' 全局,但是如果在 firstload 的时候没有人注入服务,而是等到 lazyload 后才注入服务, angular bundle 会分开打包. 只有 lazyload 的 bundle.js 才有这个服务的代码. 

    -如果服务依赖其它服务, 那么必须确保其它服务也能在 root injector 里被找到. 比如上面代码 factory 里使用了 angular/core inject() 这个是有作用域概念的, 'root' = root injector. 

    -绝大部分的时候我们都应该使用 'root'.

    2.provideIn : ServiceModule

    简单说是这样, 用一个 module 把 service 包起来, 任何要使用这个 service 的人必须通过自己的 module 去 import或间接 import 这个 ServiceModule 

    它做的事情是把 ServiceModule 包好的服务放入 ComponentModule.providers 里 ComponentModule import ServiceModule  = ComponentModule.providers : [...ServiceModule.Serivces] 

    这个主要的目的就是替代之前的写法. 因为 providers 不可以树摇和 lazyload 分 bundle 打包, 而替换成这个写法后就变得可以了. 

    3. 从前需要通过注入 pipe 才能完成, 现在很方便了. 

    import { formatDate, formatNumber, FormatWidth } from '@angular/common';
  • 相关阅读:
    Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
    【提供笔试面试题参考】阿里巴巴,淘宝技术部,针对21届应届生的内推机会
    谈谈我眼中的CSDN吧
    我的2014碎碎念—学习篇、实习篇、工作篇、生活篇
    推荐几款我一直在用的chrome插件(下)
    推荐几款我一直在用的chrome插件(上)
    逛自己的微博,回顾曾经的那个“我”
    Java五道输出易错题解析(避免小错误)
    程序员和产品经理是怎么互相看的?贬低还是赞扬?
    现实中如何评判路遥《人生》中的高加林?
  • 原文地址:https://www.cnblogs.com/keatkeat/p/8992976.html
Copyright © 2011-2022 走看看