anchor.diff:      Calling it in any other module, particularly in a lazy loaded module,
       is contrary to the intent and is likely to produce a runtime error.
   
  +    只在应用的根模块`AppModule`中调用`forRoot`。
  +    如果在其它模块（特别是延迟加载模块）中调用它则违反了设计意图，并会导致运行时错误。
  +
       Remember to _import_ the result; don't add it to any other `@NgModule` list.
  +
  +    别忘了*导入*其返回结果，而且不要把它添加到`@NgModule`的其它任何列表中。
   
   .l-hr
   
  
positive.code:     We don't import them elsewhere so they're not _shared_ in that sense. 
      Yet they're too big and messy to leave loose in the root folder.
  
      Apps often have many singleton services like this sample's `UserService`.
      Each must be registered _exactly once_, in the app root injector, when the application starts.
  
      While many Components inject such services in their constructors &mdash;
      and therefore require JavaScript `import` statements to import their symbols &mdash;
      no other component or module should define or re-create the services themselves.
      Their _providers_ are not shared.
  
      We recommend collecting such single-use classes and hiding their gory details inside a `CoreModule`.
      A simplified root `AppModule` imports `CoreModule` in its capacity as orchestrator of the application as a whole.
  
  .l-main-section
  :marked
    ## Cleanup
    Having refactored to a `CoreModule` and a `SharedModule`, it's time to cleanup the other modules. 
  
    ### A trimmer _AppModule_
    
    Here is the updated `AppModule` paired with version 3 for comparison:
  +makeTabs(
    `ngmodule/ts/app/app.module.ts,
     ngmodule/ts/app/app.module.3.ts`,
  
negative.code:   It's defined in the _Contact_ feature's _own_ routing file, `contact.routing.ts`.
    It's standard practice for feature modules with routing components to define their own routes.
    We'll get to that file in a moment.
    
    `contact`路由并不是在这里定义的，而是定义在*联系人*特性区自己的路由文件`contact.routing.ts`中。
    对于带有路由组件的特性模块，其标准做法就是让它们定义自己的路由。
    稍后我们就会看到这些。
  
    The remaining two routes use lazy loading syntax to tell the router where to find the modules:
    
    另外两个路由使用延迟加载语法来告诉路由器要到哪里去找这些模块。
    
  +makeExample('ngmodule/ts/app/app.routing.ts', 'lazy-routes')(format='.')
  
  .l-sub-section
    :marked
      A lazy loaded module location is a _string_, not a _type_. 
      In this app, the string identifies both the module _file_ and the module _class_,
      the latter separated from the former by a `#`.
      
      延迟加载模块的位置是一个*字符串*而不是*类型*。
      在本应用中，该字符串同时标记出了模块*文件*和模块*类*，两者用`#`分隔开。
  
  :marked
    ### RouterModule.forRoot
  
    The last line calls the `forRoot` static class method of the `RouterModule`, passing in the configuration.
    
    最后一行调用了`RouterModule`类的静态方法`forRoot`，并把此配置信息传给它。
    
  +makeExample('ngmodule/ts/app/app.routing.ts', 'forRoot')(format='.')
  
  :marked
    The returned `routing` object is a `ModuleWithProviders` containing both the `RouterModule` directives
    and the Dependency Injection providers that produce a configured `Router`. 
    
    该方法返回的`routing`是一个`ModuleWithProviders`对象，它包含了一些`RouterModule`的指令和一些服务提供商，它们用于生成配置好的`Router`实例。
  
    This `routing` object is intended for the app _root_ module _only_.
    
    这个`routing`对象*仅仅*是给应用程序的*根*模块使用的。
  
  .alert.is-critical
    :marked
      Never call `RouterModule.forRoot` in a feature module.
      
      永远不要在特性模块中调用`RouterModule.forRoot`！
  :marked
    Back in the root `AppModule`, we add this `routing` object to its `imports` list, 
    and the app is ready to navigate.
    
    回到根模块`AppModule`，把这个`routing`对象添加到根模块的`imports`列表中，该应用就可以正常导航了。
  
  +makeExample('ngmodule/ts/app/app.module.3.ts', 'imports', 'app/app.module.ts (imports)')(format='.')
  
  :marked
    ### Routing to a feature module
    ### 路由到特性模块
    
    The `app/contact` folder holds a new file, `contact.routing.ts`.
    It defines the `contact` route we mentioned a bit earlier and also creates a `routing` object like so:
    
    `app/contact`目录中也有一个新文件`Contact.routing.ts`。
    它定义了我们前面提到过的`contact`路由，并创建了一个`routing`对象，就像这样：
    
  +makeExample('ngmodule/ts/app/contact/contact.routing.ts', 'routing', 'app/contact/contact.routing.ts (routing)')(format='.')
  
  :marked
    This time we pass the route list to the `forChild` method of the `RouterModule`.
    It produces a different kind of object intended for feature modules.
  
    这次我们要把路由列表传给`RouterModule`的`forChild`方法。
    该方法会为特性模块生成另一种对象。
  
  .alert.is-important
    :marked
      Always call `RouterModule.forChild` in a feature module.
      
      总是在特性模块中调用`RouterModule.forChild`。
  
  .alert.is-helpful
    :marked
      **_forRoot_** and **_forChild_** are conventional names for methods that
      deliver different `import` values to root and feature modules.
      Angular doesn't recognize them but Angular developers do.
      
      当需要为根模块和特性模块分别提供不同的`import`值时，***forRoot***和***forChild***也可以作为约定俗成的方法名。
      虽然Angular无法识别它们，但是Angular开发人员可以。
  
      [Follow this convention](../cookbook/ngmodule-faq.html#q-for-root) if you write a similar module
      that has both shared [_declarables_](../cookbook/ngmodule-faq.html#q-declarable) and services.
  
      当你要写类似的模块，来为根模块和特性模块分别导出一些[_声明_](../cookbook/ngmodule-faq.html#q-declarable)和服务时，请[遵循这个约定](../cookbook/ngmodule-faq.html#q-for-root)。
  
  :marked
    `ContactModule` has changed in two small but important details
  
    `ContactModule`已经做了两个微小但重要的细节改动：
  
  +makeTabs(
    `ngmodule/ts/app/contact/contact.module.3.ts,
     ngmodule/ts/app/contact/contact.module.2.ts`,
  