2016-12-19 6 views
0

Я работаю над проектом Angular 2 with Bookscript, используя SystemJS. Сейчас я часто нахожу, что мне нужно делать такие вещи, как «../../../» для загрузки компонентов из других модулей в зависимости от того, насколько глубоко мы вложены в данный компонент. Похоже, что использование параметра карты SystemJS позволит мне иметь доступные для всей области модули для импорта без этого ужасного подхода относительной обработки, но я не могу определить окончательно, если смогу это сделать. Я также открыт для других способов решения этой проблемы.Использование SystemJS для импорта прикладных модулей в Angular 2

В основном то, что я хотел бы сделать что-то вроде этого:

import {Component} from '@angular/core'; 
import {SecureHttpClient} from 'mySecurityModule'; //No ../../../ 

@Component({ 
    moduleId: module.id, 
    selector: 'my-selector', 
    templateUrl: 'my.component.html' 
}) 
export class MyComponent { 

    constructor(private client: SecureHttpClient) { 

    } 
} 

Я попытался конфигурацию ниже, но он не работает (TS компиляция терпит неудачу).

(function (global) { 
    System.config({ 
    paths: { 
     // paths serve as alias 
     'npm:': 'node_modules/' 
    }, 
    // map tells the System loader where to look for things 
    map: { 
     // our app is within the app folder 
     app: 'app', 

     // angular bundles 
     '@angular/core': 'npm:@angular/core/bundles/core.umd.js', 
     '@angular/common': 'npm:@angular/common/bundles/common.umd.js', 
     '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', 
     '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', 
     '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', 
     '@angular/http': 'npm:@angular/http/bundles/http.umd.js', 
     '@angular/router': 'npm:@angular/router/bundles/router.umd.js', 
     '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', 
     '@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js', 


     // other libraries 
     'rxjs':      'npm:rxjs', 
     'angular-in-memory-web-api': 'npm:angular-in-memory-web-api', 
     '@ng-bootstrap/ng-bootstrap': 'npm:@ng-bootstrap/ng-bootstrap/bundles/ng-bootstrap.js', 

     // Internal Modules 
     'mySecurityModule': 'app/secure/secure.module' 

    }, 
    // packages tells the System loader how to load when no filename and/or no extension 
    packages: { 
     app: { 
     main: './main.js', 
     defaultExtension: 'js' 
     }, 
     rxjs: { 
     defaultExtension: 'js' 
     }, 
     'angular-in-memory-web-api': { 
     main: './index.js', 
     defaultExtension: 'js' 
     } 
    } 
    }); 
})(this); 

Я знаю, что, вероятно, и другие способы сделать это, но опять-таки не может найти что-нибудь окончательное, и это проблема, которую я действительно хотел бы решить. Еще раз спасибо!

+0

Отклоняйтесь от темы, но я бы порекомендовал использовать jspm для управления конфигурацией systemjs для внешних библиотек. – cYrixmorten

ответ

0

Вы можете настроить машинописный машинописный код для использования базового URL-адреса и импорта из него. В tsconfig.json добавить:

"compilerOptions": { 
    "baseUrl": "./", 
    ... 
    } 

, то вы можете использовать корень приложения как абсолютный путь. Что-то вроде

import {SecureHttpClient} from 'app/mySecurityModule'; 

вместо:

import {SecureHttpClient} from '../../../mySecurityModule'; 

Фактические пути могут отличаться для вас.

Однако я бы рекомендовал использовать какое-то расширение импорта для вашего редактора (например, AutoImport для VSCode), поскольку некоторые инструменты (AoT, CLI) могут иметь проблему с этим. Надеемся, что все будет улучшаться по мере того, как инструменты станут более зрелыми (

+0

Спасибо за ответ. Я попытался использовать baseUrl и пока он работает для tsc-компиляции (transpilation) не удается при загрузке приложения в браузере с ошибкой 404. Только когда я делаю «../../../», он правильно загружает импортированный компонент в браузере. Я использую 'tsc -w' и 'lite-server' (расширение John Browser Browser Sync) для размещения приложения. –