Angular 2 Бета: Visual Studio ASP.NET MVC

Я построил приложение для Angular 2 alpha 45, и он отлично работал, но мне пришлось много "обманывать", чтобы заставить его работать. Я понимаю Angular 2, но я не понимаю, как заставить его работать, фактически используя Angular 2.

Я пытаюсь выполнить чистую сборку 'Angular 2: 5 мин Quickstart'. Есть ряд проблем, и я буду как можно более конкретным. Я хочу узнать, почему эти проблемы происходят и, надеюсь, как их исправить. Обновление Visual Studio 2015 1, Typescript 1.7.

Typescript Конфигурация: quickstart включает файл tsconfig.json.

{  
    "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
 },
 "exclude": [
    "node_modules"
 ]
}

Я не уверен, что это все-таки, поскольку мне пришлось отредактировать файл ProjectName.csproj и добавить строку: <TypeScriptExperimentalDecorators>True</TypeScriptExperimentalDecorators> чтобы избавиться от ошибки экспериментальных декораторов. https://github.com/Microsoft/TypeScript/issues/3124 кажется, что файл tsconfig должен быть в /Scripts для работы, но это тоже не работает для меня.

Я хотел бы знать, как заставить этот файл tsconfig работать, или отредактировать файл .csproj, чтобы получить одинаковые параметры компилятора. Если вы посмотрите в Project Properties > Typescript Build. Это что? Должна ли система модуля быть: System?

Моя файловая структура такая же, как и Quickstart.

app/
    app.component.ts
    boot.ts
node_modules/
    blah
index.html
tsconfig.json
package.json

Я использовал powershell для запуска npm install, чтобы получить все в каталоге node_modules.

import {Component} from 'angular2/core'; отображает ошибку. ../node_modules/angular2/core'; не отображает ошибку, но затем, когда вы строите проект, вы получаете много ошибок сборки в файлах в node_moduels/angular2/src/*. Теперь, возможно, я смогу войти и вручную исправить эти проблемы, но я чувствую, что конфигурация неверна, если появляются эти ошибки. Кажется, что tsconfig хочет исключить node_modules. Почему я не могу использовать 'angular2/core' и вместо этого должен использовать относительный путь к нему? Если я включаю node_modules в проект Visual Studio, в node_modules есть безумное количество ошибок сборки. В отдельности: Я делаю эту чистую сборку, потому что я не мог решить, как обновить проект от альфа-45 до бета-версии 0. Исправление ошибок в моем проекте из Angular 2 изменений будет легко, но получение приложения для загрузки всех модулей в момент невозможен.

Следующая часть предполагает, что я пройду ошибки сборки: В index.html есть:

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

Я никогда не работал над System.import('app/boot'), не указав расширение файла. Является ли это проблемой визуальной студии или это проблема .NET MVC? Если я укажу расширение файла в index.html, тогда я получаю 404 с помощью System.js, пытаясь найти файлы компонентов без расширения файла (хотя config имеет defaultExtension: 'js'. Это потому, что мне нужно включить файлы js в мой проект? Тогда, если я пройду эту проблему, мне придется иметь дело с

system.src.js:1049 GET http://localhost:63819/angular2/http 404 (Not Found)

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

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

Ответы

Ответ 1

У меня были некоторые проблемы и в начале, но их в основном легко исправить.

эквивалент TsConfig

Во-первых, настройка проекта:

<TypeScriptToolsVersion>1.7.6</TypeScriptToolsVersion>
<TypeScriptModuleKind>system</TypeScriptModuleKind>
<TypeScriptExperimentalDecorators>true</TypeScriptExperimentalDecorators>
<TypeScriptEmitDecoratorMetadata>true</TypeScriptEmitDecoratorMetadata>
<TypeScriptAdditionalFlags> $(TypeScriptAdditionalFlags) --experimentalDecorators </TypeScriptAdditionalFlags>
<TypeScriptAdditionalFlags> $(TypeScriptAdditionalFlags) --emitDecoratorMetadata </TypeScriptAdditionalFlags>

Системный модуль прав, но убедитесь, что он правильно включен в ваш html файл. Вы также можете выбрать его в окне параметров проекта.

В зависимости от вашей версии VS вам необходимо указать флаги в дополнительных флагах (более старые версии) или в выделенных тегах. Вам по-прежнему необходимо проверить исходные коды и целевую версию es в ваших вариантах проекта (например, es5 - EcmaScript 5 в версии EcmaScript).

Не забудьте установить последнюю версию TypeScript, иначе RxJs не будет работать.

Angular2 файлы

При загрузке angular2 через npm имеет смысл, я бы не включил node_modules непосредственно в вашу папку TypeScript. Включение всей папки означает использование любого другого модуля node, например, gulp. Вместо этого вы можете просто скопировать всю папку angular2 в каталог TypeScript в папке "Содержимое" (вы можете сделать это автоматически с помощью gulp или простого файла bat, если хотите).

О ошибках TypeScript, проблема в том, что Visual Studio попытается проанализировать все файлы в папках angular2, а некоторые из этих файлов дублируются. Вам нужно удалить источники и сохранить только скомпилированные js файлы и определения типов. Это означает:

  • remove/es6 (это файлы, используемые для разработки в es6 вместо typescript)
  • remove/ts (исходные файлы)
  • удалить пучки/пиктограммы (дополнительные файлы дефиниции для es6-shim и жасмина)

Вам нужна папка rxjs на том же уровне папки, что и angular2, иначе включенные не будут работать, например:

Content  
    typings  
        angular2  
        rxjs  
        mymodule
           whatever.ts
        boot.ts

В ваших html файлах вы можете связать файлы js в папках сложения как angular2, так и rxjs.

<script src="https://code.angularjs.org/tools/system.js"></script>
<script src="/content/typings/angular2/bundles/angular2-polyfills.js"></script>
<script src="/content/typings/rxjs/bundles/Rx.min.js"></script>
<script src="/content/typings/angular2/bundles/angular2.dev.js"></script>
<script src="/content/typings/angular2/bundles/router.dev.js"></script>

Затем ваш импорт будет выглядеть следующим образом:

import { Component } from 'angular2/core';

Конфигурация системы

Чтобы заставить импорт работать, вам необходимо настроить систему. Конфигурация довольно проста:

        System.paths = {
            'boot': '/content/typings/boot.js',
            'mymodule/*': '/content/typings/myModule/*.js'
        };
        System.config({
            meta: {
                'traceur': {
                    format: 'global'
                },
                'rx': {
                    format: 'cjs'
                }
            }
        });
        System.import('boot');

Включите этот код после тегов script для angular и всех других librairies.

Так как angular2 включен глобально (с помощью тегов script), вам не нужно добавлять его в конфигурацию системы. Затем в ваших файлах вы можете импортировать свои модули следующим образом:

import { MyThing } from "mymodule/whatever";

Ответ 2

Если вы запускаете и запускаете с установкой npm для установки ваших зависимостей в node_modules, здесь, как использовать их там на месте без необходимости переместить их в каталог /lib или/scripts или изменить способ написания ваши файлы typescript по пути, указанному в Quickstart:

Свойства проекта → typescript Сборка

В "Модульной системе" выберите "Система":

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

Установить typescript параметры компилятора

Если вы используете ASP.NET Core, задайте параметры в tsconfig.json:

{  
    "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
 },
 "exclude": [
    "node_modules"
 ]
}

Если вы используете ASP.NET(Non-Core), задайте параметры компилятора в файле csproj. (Документы для настройки параметров компилятора: https://github.com/Microsoft/TypeScript/wiki/Setting-Compiler-Options-in-MSBuild-projects). В текстовом редакторе найдите PropertyGroup с другими параметрами typescript и добавьте:

<TypeScriptExperimentalDecorators>True</TypeScriptExperimentalDecorators>
<TypeScriptEmitDecoratorMetadata>True</TypeScriptEmitDecoratorMetadata>
<TypeScriptModuleResolution>node</TypeScriptModuleResolution>

Загрузите исходные файлы в правильном порядке

В вашем index.html настройте свои сценарии в этом конкретном порядке, чтобы убедиться, что модули загружены из папки node_modules (вам нужно загрузить пакеты rxjs и angular2 после выполнения System.config, иначе системный загрузчик будет загрузите исходные файлы angular/rxjs снова, так как он не зарегистрировал их с правильным путем)

<!-- load system libraries -->
<script src="~/node_modules/es6-shim/es6-shim.min.js"></script>
<script src="~/node_modules/systemjs/dist/system-polyfills.js"></script>
<script src="~/node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="~/node_modules/systemjs/dist/system.js"></script>

<!-- configure system loader first -->
<script>
    System.config({
        defaultJSExtensions: true,
        paths: {
            'angular2/*': 'node_modules/angular2/*',
            'rxjs/*': 'node_modules/rxjs/*'
        }
    });
</script>

<!-- load app bundles *after* configuring system so they are registered properly -->
<script src="~/node_modules/rxjs/bundles/Rx.js"></script>
<script src="~/node_modules/angular2/bundles/angular2.js"></script>

<!-- boot up the main app -->
<script>
    System.import("app/main").then(null, console.error.bind(console));
</script>

Приложение typescript может использовать стандартный синтаксис импорта, здесь app/main.ts:

import {bootstrap}    from 'angular2/platform/browser'
import {AppComponent} from './app.component'
bootstrap(AppComponent);

Обратите внимание, что для angular2 "import" необязательно иметь "../node_modules/", поскольку разрешение модуля компилятора typescript использует режим "node". (docs на node логике разрешения модуля: https://github.com/Microsoft/TypeScript/issues/2338) Надеюсь, что это сработает для вас!

Ответ 3

Я вообще доволен новыми вещами с asp.net 5 vnext и Angular 2. Но оснастка Angular 2 в Visual Studio была проблемой. Я последовал за angular.io quickstart guide религиозно и не повезло получить приложение Hello Angular 2, пока я не использовал следующий код:

<script src="~/lib/anguar2/angular2-polyfills.js"></script>
<script src="~/lib/es6-shim/es6-shim.js"></script>
<script src="~/lib/systemjs/system.js"></script>
<script>

    System.config({
        defaultJSExtensions: true
      
    });

</script>
<script src="~/lib/rxjs/rx.js"></script>
<script src="~/lib/anguar2/angular2.min.js"></script>
<script>
    System.import('js/boot');
</script>

Ответ 4

У меня точно такие же проблемы (рабочий проект alpha 48, те же ошибки с бета-версией 0 и т.д.). Мои рабочие файлы (проект MVC):

App/boot.ts

/// <reference path="../node_modules/angular2/manual_typings/globals-es6.d.ts" />
/// <reference path="../node_modules/angular2/typings/es6-shim/es6-shim.d.ts" />
import {bootstrap}    from '../node_modules/angular2/platform/browser'
import {AppComponent} from './app.component'
bootstrap(AppComponent);

App/app.component.ts

import {Component} from '../node_modules/angular2/core'
@Component({
    selector: 'my-app',
    template: '<h1>My First Angular 2 App</h1>'
})
export class AppComponent {}

Views/Shared/_Layout.cshtml

<head>
...
<script src="~/node_modules/es6-shim/es6-shim.min.js"></script>
<script src="~/node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="~/node_modules/systemjs/dist/system.src.js"></script>
<script>
 System.config({
   defaultJSExtensions: true,
   packages: {
     'app': { format: 'register', defaultExtension: 'js'}
   },
   paths: {
     'angular2/*': 'node_modules/angular2/*',
     'rxjs': 'node_modules/rxjs/bundles/Rx.js'
   }
 });
</script>
<script src="~/node_modules/rxjs/bundles/Rx.js"></script>
<script src="~/node_modules/angular2/bundles/angular2.dev.js"></script>
<base href="/">
@Scripts.Render("~/bundles/modernizr")
...
</head>

Views/Home/Index.cshtml

<my-app>Loading...</my-app>
<script>
  System.import('App/boot')
   .then(null, console.error.bind(console));
</script>

Он работал у меня после добавления "путей" в System.config.

Ответ 5

Убедитесь, что вы находитесь в Visual Studio 2015 Update 1, Typescript 1.7. * А также вы можете запустить 'Angular 2: 5 min Quickstart'.

Проблема, которую вы используете как "внешние веб-инструменты VS2015", имеет слишком старую версию

После того, как VS 2015 создало веб-приложение asp.net5, нажмите Показать весь файл, затем удалите папку package.json и node_modules и снова добавьте package.json.

Если выше не работает, см. это: http://jameschambers.com/2015/09/upgrading-npm-in-visual-studio-2015/