在 Angular2 (TS) 中导入模块的选项

Posted

技术标签:

【中文标题】在 Angular2 (TS) 中导入模块的选项【英文标题】:Options for importing modules in Angular2 (TS) 【发布时间】:2016-04-26 00:33:10 【问题描述】:

我知道有一些进展或至少计划(#5093、#5728)来改进 typescript 的模块路径映射,但我想知道目前我们有哪些选择(Angular2 beta.1、TypeScript 1.7、VS Code 0.10.5,nodejs 5.4,systemjs 0.19)。

为了让每个人开心(编译器、编辑器和浏览器),我使用以下语法来导入模块:

// C:/~somepath~/project_name/src/scripts/app/components/search/search.component.ts
import Component from 'angular2/core';
import EmitterService from '../../../core/services/emitter/emitter.service';
import SearchService from '../../../app/services/search/search.service';

编译成

System.register(['angular2/core', '../../../core/services/emitter/emitter.service'], function(exports_1) 

当我使用以下选项时

// tsconfig.json

  "compilerOptions": 
    "target": "ES5",
    "module": "system",
    "moduleResolution": "node"
    ...
    

我想使用不带这些点的导入:

import EmitterService from 'core/services/emitter/emitter.service';

因为它变得非常丑陋,追踪起来很疯狂,并且移动模块是一场噩梦。由于systemjs 配置,它可以在浏览器中运行:

// system.conf.js
System.config(
  map: 
    app: "/scripts/app",
    core: "/scripts/core",
  

我可以通过将"isolatedModules": true 添加到 tsconfig.json 来“欺骗”编译器(没有这个会引发错误),但是在Visual Studio Code 中,Cannot find module 错误仍然存​​在,并且我失去了代码提示。我听说node_modules 文件夹中有一些解决方案,但找不到任何工作示例。

任何人都知道如何配置所有这些以优雅地协同工作?

谢谢。

【问题讨论】:

angular2 如何知道从哪里导入 angular2/core ?谁能给我解释一下。 @PardeepJain 如果您查看angular bundle 的源代码,您会看到System.register("angular2/core", .... 并告诉systemjs 该做什么。你可以find more here 也许你可以把常用的服务放到不同的应用程序中,你可以参考node_modules。另外,也许您不需要一个应用程序中的关卡……(如果您删除了核心关卡,您可能已经保存了一个)。此外,如果您将结构更实用,那么您将不需要 services 文件夹... 就像@eesdil 所说,您应该将服务移动到一个单独的包中,并将其作为依赖项添加到该项目中。或者在 node_modules/custom_p 下创建一个文件夹,并添加 combine.ts 文件,通过在其中引用它们来导出所有服务模块。例如:export * from '../../app/services/search/search.service' export * from '../../core/services/emitter/emitter.service' 在我们的组件中,导入 EmitterService, SearchService 来自“custom_P/combined”。完全不推荐,因为我们必须在 node_modules 中单独维护这个文件夹。 【参考方案1】:

只是为了跟进未来的访问者,这应该在 TypeScript 2.0 中修复。您正在寻找的配置是在您的tsconfig.json 中设置baseUrlpaths 属性。如果您无条件地希望将所有内容与scripts 中的某个路径匹配,请使用类似:


    "baseUrl": "./src/scripts"

如果只有coreapp要专门使用,请使用


    "baseUrl": "./src/scripts",
    "paths": 
        "app/*": ["app/*"],
        "core/*": ["core/*"]
    

【讨论】:

以上是关于在 Angular2 (TS) 中导入模块的选项的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 2 应用程序中导入节点 js 模块

如何在使用`declare namespace`的`d.ts`文件中导入`ts`模块?

无法在 ionic 3 项目的模块中导入 google plus 插件

使用 System.js 在 Angular 2 应用程序中导入 visionmedia 调试以及如何记录消息?

在 webpack 中导入 html 文件时找不到模块错误

在 Angular nx 项目中导入 JavaScript 模块