Angularjs 2 и проблема с импортом Typescript (systemjs?)

Мое приложение имеет такую ​​структуру:

app
- assets
- src
-- autogenerated
-- components
---- app
---- tabs

Папка «autogenerated» содержит скомпилированные файлы javascript, сгенерированные из машинописного текста с использованием той же структуры каталогов, что и в папке компонентов. Я использую gulp-tsc для его создания. (со временем я переименую это в «сборка»)

приложение, а вкладки - это компоненты... приложение является компонентом верхнего уровня.

В app.ts (в app/components/app) есть:

import {Component, bootstrap} from 'angular2/angular2';
import {Tabs} from '../Tabs/tabs';
@Component({
    selector: 'my-app',
    templateUrl: 'src/components/app/app.html',
    directives: [Tabs]
})
class AppComponent { }
bootstrap(AppComponent);

Когда это компилируется, сгенерированный файл js имеет следующее:

var tabs_1 = require('../Tabs/tabs');

который не разрешается и приводит к ошибке 404, поскольку он не имеет расширения .js при загрузке браузером.

Редактировать... только что понял, что "требуется" от nodejs, а не от systemjs... все еще не уверен, что делать дальше.

** Редактировать 2 ** Задача глотка:

gulp.task('compile', function() {
  // compile sass to css
  gulp.src('./app/assets/sass/*.scss')
    .pipe(sass.sync({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(gulp.dest('./app/assets/css'));

  // compile typescript
  // this ignores tsconfig.json, but ideally configuration in both places should match
  gulp.src(['./app/src/**/*.ts'])
    .pipe(typescript({  target: "ES5",
                        experimentalDecorators: true,
                        sourceMap: true,
                        emitDecoratorMetadata: true }))
    .pipe(gulp.dest('./app/src/autogenerated/'));
});

введите здесь описание изображения

Задача gulp не должна использовать tsconfig.json... Я добавил ее, чтобы удалить ошибку в коде Visual Studio.... но вот что в tsconfig.json

{
  "compilerOptions": {
    "target": "ES5",
    "module": "commonjs",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  }
}

index.html код:

<html>
  <head>
    <title>Angular 2 QuickStart</title>
    <script src="../../node_modules/systemjs/dist/system.src.js"></script>
    <script src="../../node_modules/angular2/bundles/angular2.dev.js"></script>
<script>
  System.config({
    packages: {'app': {
        defaultExtension: 'js'}
      }
  });
  System.import('../src/components/app/app.js');
</script>
  </head>
  <body>
    <my-app>Loading... please wait</my-app>
  </body>
</html>

person Chris Klepeis    schedule 10.11.2015    source источник
comment
Можете ли вы показать больше конфигурации? Gulp файл, например?   -  person Jérémy Dutheil    schedule 10.11.2015
comment
Я добавил задачу gulp. Он использует пакет gulp-tsc.   -  person Chris Klepeis    schedule 10.11.2015


Ответы (2)


  1. Используйте tsconfig.json, это лучший способ настроить компилятор TypeScript, и он поддерживается командой TypeScript. Нет необходимости в некоторых задачах gulp, чтобы понять, что такое typescript. Просто запустите «tsc» в командной строке (пусть gulp запустит «exec»).

  2. Если вы скомпилируете свои модули в commonjs (это абсолютно правильно), у вас должен быть какой-то способ загрузить модули commonjs в браузере. И SystemJS (такой же, как использует angular2) в настоящее время является лучшим загрузчиком модулей на сегодняшний день. Итак, просто создайте файл конфигурации SystemJs для своего приложения и импортируйте приложение.

person gilamran    schedule 10.11.2015
comment
Я думаю, что мой мозг становится жареным со всеми различными загрузчиками модулей и т. д. (jspm, commonjs, systemjs...). Я пойду с рекомендацией просто использовать компилятор машинописного текста вместо какого-нибудь пакета gulp. Просто для ясности... Я не думаю, что создал какие-либо модули. Я просто использовал npm для установки модулей узлов. Typescript компилирует операторы импорта, чтобы требовать операторов, которые я не могу загрузить в браузер. Пример был бы отличным... Я не могу найти ничего хорошего в Интернете. Я добавил свой код systemjs из index.html в свой вопрос - person Chris Klepeis; 11.11.2015
comment
Теперь я вижу, что у вас есть systemjs в качестве загрузчика модулей. в чем проблема сейчас? (Насколько я вижу, должно работать) - person gilamran; 11.11.2015
comment
При просмотре приложения angular2 в Electron оно пытается загрузить /Tabs/tabs вместо /Tabs/tabs.js. Без расширения js это не разрешается. - person Chris Klepeis; 11.11.2015

Visual Studio с установленным TypeScript игнорирует ваш файл tsconfig.

В свойствах вашего проекта в TypeScript Build установите для вашей модульной системы значение «Система».

Вам придется вручную изменить файл проекта, добавив эти строки в PropertyGroup:

<TypeScriptExperimentalDecorators>true</TypeScriptExperimentalDecorators>
<TypeScriptModuleResolution>node</TypeScriptModuleResolution>
person Rob    schedule 19.11.2015