2016-01-19 4 views
8

Я пытаюсь импортировать пользовательский компонент в свой app.ts, но получаю ошибку «TS2307: Не удается найти модуль« MyComponent »« Я просмотрел его, не мог найти ничего, что могло бы помочь мне.Невозможно импортировать пользовательский компонент - Angular2 и TypeScript

Некоторые люди писали: использование «moduleResolution»: «классический», но если я это сделаю, то я получаю ошибку TS2307 для всего остального (все angular2/...), кроме MyComponent.

Другие записи «run tsc --declaration MyComponent.ts» - который генерирует файл MyComponent.d.ts (при выдаче ошибок в консоли, например «Невозможно скомпилировать, если не указан флаг -module»), который IS предоставляется в tsconfig в качестве опции - или «Невозможно найти модуль« угловое2/общее »для того, что я импортирую в MyComponent.ts, но он создает файл .d.ts), но при попытке скомпилировать app.ts по-прежнему дает ту же ошибку TS2307. Нейтинг, который я нашел, работал.

Это моя структура проекта:

| /app 
|  /resources 
|   /dev 
|    /ts 
|     app.ts 
|     MyComponent.ts 
|   /dist 
|    /js 
|     app.js   // transcompiled app.ts 
|     MyComponent.js // transcompiled MyComponent.ts 
|    /modules   // files copied from the /node_modules/**/ folders (because node_modules is outside versioning and also outside public root (public root is the /app folder) 
|     es6-shim.js 
|     angular2-polyfills.js 
|     system.src.js 
|     Rx.js 
|     http.dev.js 
|     angular2.dev.js 
|  index.html 
| 
| /node_modules 
|  /angular2   // 2.0.0-beta.1 
|  /es6-promise   // 3.0.2 
|  /es6-shim   // 0.33.3 
|  /rxjs    // 5.0.0-beta.0 
|  /reflect-metadata // 0.1.2 
|  /systemjs   // 0.19.6 
|  /zone.js    // 0.5.10 
| 

Это мой tsconfig.json:

{ 
    "compilerOptions": { 
     "target": "ES5", 
     "module": "system", 
     "moduleResolution": "node", 
     "sourceMap": true, 
     "emitDecoratorMetadata": true, 
     "experimentalDecorators": true, 
     "removeComments": true, 
     "noImplicitAny": false, 
     "outDir": "app/resources/dist/js" 
    }, 
    "files": [ 
     "app/resources/dev/ts/app.ts" 
    ] 
} 

Мои app.ts:

import { bootstrap } from "angular2/platform/browser"; 
import { Component, View } from "angular2/core"; 
import { HTTP_PROVIDERS, Http, Response } from "angular2/http"; 

//My Custom Components: 
import { MyComponent } from 'MyComponent'; 

/** 
* APP 
*/ 
@Component({ 
    selector: 'my-app' 
}) 
@View({ 
    directives: [MyComponent], 
    template: ` 
     <my-component></my-component> 
     plus other html 
    ` 
}) 
class MyApp { 
    public whatever; 

    constructor(public http: Http) { 
     // initialize this.whatever 
    } 

    makeRequest(): void { 
     this.http.request('/_http/response.json') 
      .subscribe((res:Response) => { 
       this.whatever = res.json(); 
      }); 
    } 
} 

bootstrap(MyApp, [ HTTP_PROVIDERS ]); 

И вот мой Мой Component.ts:

import { Component } from 'angular2/core'; 
import { NgFor, NgIf } from 'angular2/common'; 

@Component({ 
    selector: 'my-component', 
    template: ` 
     <div>MY IMPORTED COMPONENT</div> 
    ` 
}) 
export class MyComponent { 

    constructor() {} 

    doSomething(): void { 
     console.log('Doing something'); 
    } 
} 

Мои app.ts и MyComponent.ts оба находятся в одной и той же папке. В любом случае, я также пробовал путь следующим образом: import {MyComponent} из «/ app/resources/dev/ts/MyComponent». Кроме того, я попытался добавить его в массив файлов в tsconfig (некоторые люди писали, что я должен это делать) ... Тем не менее ... Ничего не работало! Я также проверил вывод js, потому что некоторые люди писали, что даже если он выдает ошибку, он все равно может быть скомпилирован ... Не повезло!

====================

EDIT:

Ok, так как inoabrian предлагает в первый комментарий ... Я думал, что я пытался все, но, похоже, я не пробовал «./MyComponent» для части импорта.

import { MyComponent } from './MyComponent'; 

Теперь транцемпилер делает свою работу. Спасибо, Иноабриан, но теперь у меня другая проблема. При попытке запуска в браузере, я просматриваю консоль и оба systemjs и angular2-pollyfills закричать:

http://my-app/resources/dist/js/MyComponent 404 (Not Found) 

соответственно:

XHR error (404 Not Found) loading http://my-app/resources/dist/js/MyComponent(…) 

Не быть отброшен путем (при сравнении с моя структура папок проекта), у меня есть локальный сервер, указывающий на/приложение, когда я обращаюсь к http://my-app

Это мой индекс .HTML с системой конфигурации и все включено JS файлы:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <!-- ... Meta tags & CSS assets --> 

    <script src="resources/dist/modules/es6-shim.js"></script> 
    <script src="resources/dist/modules/angular2-polyfills.js"></script> 
    <script src="resources/dist/modules/system.src.js"></script> 
    <script src="resources/dist/modules/Rx.js"></script> 
    <script src="resources/dist/modules/http.dev.js"></script> 
    <script src="resources/dist/modules/angular2.dev.js"></script> 
</head> 
<body> 
<script> 
    System.config({ 
     packages: { 
      app: { 
       format: 'register', 
       defaultExtension: 'js' 
      } 
     } 
    }); 
    System.import('resources/dist/js/app.js') 
      .then(null, console.error.bind(console)); 
</script> 

<my-app></my-app> 

</body> 
</html> 

У меня есть ощущение, что я должен сделать еще одну вещь с transcompiled файла «MyComponent.js», но не знаю, что (я пробовал чтобы добавить его в System.import, надеясь, что он примет массив ... но, похоже, это не так). Что я должен делать дальше?

P.S. Это, тем не менее, разочаровывает, я надеялся, что импорт MyComponent в app.ts будет всем, и что я найду класс MyComponent + все из MyComponent.ts + моего транскопируемого файла app.ts ALL IN ONE app.js, не имея еще один JS файл :(

+0

Вы изменили расположение импорта на «./MyComponent»? – inoabrian

+0

Я думал, что пробовал все, но, похоже, я этого не делал. Он работал с «./MyComponent» ... но теперь все поднимает еще одну проблему, я отредактировал свой вопрос и добавил проблему в конце, после «EDIT:» – MrCroft

+0

Теперь эта часть кажется проблемой каталогов на вашем сервере , Это может произойти, если у вас есть вложенные каталоги для разработки и dist. Значит, вы могли бы опубликовать, как выглядит ваш код на стороне сервера ..? Я бег прочь облегченного-сервер и я установил мои каталоги обслуживаться через массив [ ] – inoabrian

ответ

8

Я знаю, что это давно назрело, но, возможно, другие могут воспользоваться ответом. Я действительно понял, какова была последняя проблема (кроме того, что я уже редактировал в исходном вопросе). Вот оно: Я упомянул, что у меня была специальная структура папок и я не хотел ее менять. Если бы у меня было, это сработало бы просто после углового 2 быстрого запуска. Но это не помогло бы мне понять проблему в моем конкретном случае, и я бы не понял, как работает System.js.

Проблема была в моем System.config() - в разделе пакетов. Это плохой код:

System.config({ 
    packages: { 
     app: { 
      format: 'register', 
      defaultExtension: 'js' 
     } 
    } 
}); 
System.import('my/path/to/app_main_file'); 

Моя ошибка была думать о том, что ключ «приложение» просто общий ключ, пришедшее от слова «приложение». Оказывается, что в объекте пакетов каждый ключ фактически представляет собой путь (где этот пакет - это файлы - находится в вашем приложении).Таким образом, если предположить, папку, где мои transpiled файлы являются бы «мой/приложение/общественность» и «app_main_file» является основным JS файл моего приложения, то я должен был на самом деле было что-то вроде этого:

System.config({ 
    packages: { 
     'my/app/public': { 
      format: 'register', 
      defaultExtension: 'js' 
     } 
    } 
}); 
System.import('my/app/public/app_main_file') 
    .then(null, console.error.bind(console)); 

Или, вы можете написать в разделе конфигурации даже лучше, как это:

System.config({ 
    packages: { 
     'my-app': { 
      format: 'register', 
      defaultExtension: 'js' 
     } 
    }, 
    map: { 
     'my-app': 'my/app/public' 
    } 
}); 

Я думаю, что это довольно очевидно, что «карта» делает и как его использовать.

P.S. Я знаю, что в своем ответе я не следовал той же структуре папок, что и в исходном вопросе, но я думаю, что имеет смысл объяснить это так. Если это имеет значение, просто замените «my/app/public» выше тем, что я изначально имел в вопросе: «resources/dist/js /», и это то же самое.

+1

Удивительный! Это сработало, даже я считал приложение ключевым словом. – sudhir

0

что немного странно, что вы не имеете MyComponent.js в той же папке, чем app.js. в моем случае, когда я добавляю outDir в файле tsconfig.json, все мои машинопись файлы . компилируется в JavaScript в этой папке

Вот моя конфигурация в моем tsconfig.json файле:

{ 
    "compilerOptions": { 
    "target": "ES5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false, 
    "outDir": "app/resources/dist/js" 
}, 
    "exclude": [ 
    "node_modules" 
    ] 
} 

Я запустил фазу компиляции с помощью команды: tsc -w.

Надеется, что это помогает вам, Тьерри

+0

Кажется, я на самом деле не пробовал все. Я попытался использовать «./MyComponent» для части импорта в app.ts, и это сработало, transcompiler выполнил эту работу - это не проблема с транскопиллером, а проблема с пути (не знаю, как я не пробовал », ./ «уже» и «ДА», теперь у меня есть файл MyComponent.js ... но теперь у меня есть еще одна проблема, я отредактировал свой вопрос и добавил проблему в конце, после «EDIT:» – MrCroft

+0

В вашем проекте скриншот у вас есть 'MyComponent.ts', но не' MyComponent.js', который ищет браузер, вы его уже скомпилировали? – Langley

+0

Файл MyComponent.js есть, я просто не обновлял структуру файла/файл проекта в моем вопросе. Я сделал это сейчас. – MrCroft

1

Я считаю, что вам не хватает надлежащий параметр в конфигурации системы. добавить это следующим образом:

System.config({ 
    defaultJSExtensions: true 
}) 
+0

Хорошо, добавив, что это больше не добавляет 404 на MyComponent (потому что теперь он действительно ищет MyComponent.js). Я должен был это заметить. НО, но все ломает. Теперь я получаю 404s, потому что он ищет неправильные места для /angular2/platform/browser.js соответственно http.js и core.js (которые, конечно же, не находятся в/angleular2), они фактически находятся за пределами открытого корня (/ app is мой общий корень) - но у них не было 404s, потому что он даже не запрашивал их перед добавлением defaultJSExtensions: true, и все работало нормально). Почему так происходит: | ? – MrCroft

+0

Я предлагаю пройти быстрый старт или учебник: https://angular.io/docs/ts/latest/quickstart.html, а также вы должны создать plunkr, потому что это, кажется, бесконечная история ... :) ваши другие файлы недоступны, вероятно, потому, что вы не загружаете их в index.html. Я считаю, что если вы проверите учебник, он должен начать работать. Еще одно замечание, что есть некоторые проблемы с бета-1, поэтому я бы предложил использовать beta0 на данный момент. – eesdil

+0

Кроме того, если у вас есть настраиваемая структура папок, сначала сложно ее захватить, поэтому я предлагаю следовать рекомендации на угловой странице. – eesdil

-4

Добавить .js расширение для вашего импорта модуля. Это, скорее всего, вызовет ошибку IDE. Но когда вы обновляете, это работает. Это проблема, с которой я столкнулся. Он работал вчера на работе, и сегодня я попробовал еще один пример дома, он дал бы 404 ошибки.

import {MyComponent} from 'MyComponent.js' 

Другой фикс, который работал для меня: у меня было все .ts файлы в корневой папке. Я создал другое приложение подпапки и переместил их туда. Оттуда я смог ссылаться на них без расширения. Не знаю, почему это не работает в корневой папке. Но перемещение их в другую папку делало трюк. Надеюсь, это поможет.

Смежные вопросы