здесь лежит поле из граблей

Не так давно меня заинтересовала проблема миграции приложений, написанных с первым Angular.js на второй. Кстати, эта статья должна была быть именно об этом. Но вмешался случай. До этого я поднимал Angular2 только на Node.js. А тут, поскольку я в основном работаю из-под Visual Studio, я решил запустить его из-под нее. Когда я пришел в себе после всех ударов граблей, по которым мне пришлось пройти, я решил выделить развертывание Angular2 под Visual Studio 2015 в отдельную статью. И что-то мне подсказывает, что лишней она не будет.

Шаг первый. Реквизит.


Для начала нам нужно подготовить Visual Studio для работы с Node.js и NPM, так как почти все пакеты, от которых зависит Angular2, лежат в NPM.

Ставим NPM Task Runner и Package Installer. Они пригодятся нам для взаимодействия студии и npm.

Кстати о npm и о windows.
Как оказалось, windows ось весьма оригинальная. Установив Node.js, вы автоматически установили и npm. Но, если после этого вы установите npm глобально (используя -g флаг), то почти наверняка она будет установлена в другое место.

И (а вот тут волшебник достает кролика) использоваться не будет.
Проблема заключается в том, что во время установки Node.js, в переменную среды PATH установщик Node, записывает путь к тому npm, который идет с ним. Поэтому, вызывая npm из-под консоли, вы будете обращаться именно к нему, а не к глобальному npm.

Для того чтобы исправить такое странное поведение, нужно

Найти место, куда был установлен глобальный (можно выполнить команду npm root -g)
Заменить путь, указанный в PATH с npm ноды, на npm глобальный. Не забудьте сделать это и для системы и для пользователя, а также перезагрузить машину.

После установки расширений, запускаем студию и создаем пустой веб проект. Теперь нам нужно обновить те node.js и npm, которые используются нашей Visual Studio. Студия использует не глобальный npm и node.js, а локальный. Она ничего не знает о том, что установлено у вас в системе и полагается на ту node.js которая лежит в External Web Tools. Если этого не знать, то студия будет использовать устаревшие компоненты и поднять приложение не получиться. Итак, кликнем на проекте и выберем quick install package. В появившемся окошке набираем gulp и ставим его. Конечно, делать это абсолютно не обязательно, но, честно говоря, мне лень создавать package.json вручную.
После установки gulp мы получаем package.json, с которым можно работать дальше.

И первое, что нам нужно сделать, это проверить версию node.js и npm, с которыми будет работать наша студия.

Добавим секцию scripts в package.json с командами «npm -v» и «node -v» и выполним их из-под task runner-a.

package.json
{
  "name": "myproject",
  "version": "1.0.0",
  "devDependencies": {
    "gulp": "^3.9.1"
  },
  "scripts": {
    "getNpmVersion": "npm -v",
    "getNodeVersion": "node -v"
  }
}


Лично у меня результаты были впечатляющие: node v0.10.31 и npm 1.4.9. Еще раз обращаю внимание на то, что это версии, которые будут использоваться Visual Studio и ни установленный node, ни глобальный npm никакого отношения сейчас к ним не имеют.

Теперь, все это барахло нужно привести в порядок. Добавим новую команду в наш package.json: «updateNpm»: «npm install npm@latest» и запустим ее. Подождав немного, запустим getNpmVersion. Npm обновился и теперь он версии 3.10.5.

Однако с node.js этот подход не сработает. Если честно я не нашел способа обновить node.js, однако, нашел способ заставить студию использовать нужный мне экземпляр.

Итак, для начала найдите, где у вас установлен node.js и скопируйте туда путь. Теперь идем в Tools -> Options -> Projects and Solutions -> External web tools и добавляем новый путь, указывающий на нормальную версию ноды (если ее нет, просто скачайте и поставьте). Не забудьте поднять новый путь на самый верх. Перезагружаем студию (windows перезагружать не надо) и выполняем команду getNodeVersion. Вуаля, версия обновлена.

После всех этих танцев с бубнами предлагаю пойти попить кофе. Дальше тоже будет не просто.

Шаг второй. Установка зависимостей.


Продолжим мучить наш project.json. Теперь зальем в него все зависимости нашего приложения. Зависимости взяты из 5 MIN QUICKSTART, подредактированы с учетом windows, и одним маленьким но очень гордым нюансом.

Нюанс который смог.
Angular2 построен на typescript. (Хотя буквально на днях вышел quick start на чистом javascript). Поэтому одна из зависимостей нашего hello world приложения — это зависимость от typescript которая выглядит так «typescript»: "^1.8.10". Это означает, что при загрузке модулей, будет загружена последняя версия typescript, но не меньше чем 1.8.10. Внезапно, сборка, которую нам предоставляет quick start не поддерживает последнюю версию typescript из-за появления ключевого слово default при экспорте. По крайней мере это моя версия. Важно то, что с последней версией наш angular2 не «взлетит», а вот если ее зафиксировать и указать просто 1.8.10 то все должно быть хорошо.
Баг уже отправлен, результаты ожидаются.

package.json
{
  "name": "myproject",
  "version": "1.0.0",
  "devDependencies": {
    "gulp": "^3.9.1",
    "typescript": "1.8.10",
    "typings": "^1.0.4"
  },

  "dependencies": {
    "@angular/common": "2.0.0-rc.4",
    "@angular/compiler": "2.0.0-rc.4",
    "@angular/core": "2.0.0-rc.4",
    "@angular/forms": "0.2.0",
    "@angular/http": "2.0.0-rc.4",
    "@angular/platform-browser": "2.0.0-rc.4",
    "@angular/platform-browser-dynamic": "2.0.0-rc.4",
    "@angular/router": "3.0.0-beta.1",
    "@angular/router-deprecated": "2.0.0-rc.2",
    "@angular/upgrade": "2.0.0-rc.4",

    "systemjs": "0.19.27",
    "core-js": "^2.4.0",
    "reflect-metadata": "^0.1.3",
    "rxjs": "5.0.0-beta.6",
    "zone.js": "^0.6.12",

    "angular2-in-memory-web-api": "0.0.14"

  },
  "scripts": {
    "postinstall": "typings install",
    "typings": "typings",
    "cmd": "npm typescript",
    "getNpmVersion": "npm -v",
    "getNodeVersion": "node -v"
  }
}


Теперь, из-под таск раннера запустим команду install и подождем, пока все пакеты установятся. Если все прошло хорошо, в папке node_modules у нас должно было появиться несколько других папок, среди которых должна быть папка "@angular". Если вы ее видите, значит пока что все идет хорошо и зависимости установлены. А если нет? Иногда могут возникать проблемы с cachem npm. Если пакеты не устанавливаются и вся консоль таск раннера красная от ошибок, попробуйте добавить еще одну команду в package.json — «npm cache clean» и выполнить ее. Возможно это поможет.

Шаг третий. Конфигурируем typescript для Visual Studio.


Настала очередь сделать еще несколько па в нашем бубновом танце.
Давайте добавим наш первый .ts файл. Создаем в корне папку app и добавляем туда пустой app.component.ts файл. Не стоит проявлять фантазию и придумывать свои имена. Все может сломаться даже от чиха. Теперь закрываем студию.

Visual Studio и TypeScript! TypeScript и Visual studio
Во всех приличных домах настройки typescript задаются в специальном файле — tsconfig.json. Но Visual Studio дама капризная. Если мы будем работать с typescript в режиме CommonJS (а вот именно в нем мы и будем работать), то tsconfig.json студия будет игнорировать. А, между тем, там есть две очень важные для нас опции — «emitDecoratorMetadata»: true,
«experimentalDecorators»: true. Так вот, эти флаги устанавливаются в .csproj файле ручками… Подробнее можно почитать тут

Более полный набор опций
<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <TypeScriptRemoveComments>false</TypeScriptRemoveComments>
  <TypeScriptSourceMap>true</TypeScriptSourceMap>
  <TypeScriptTarget>ES5</TypeScriptTarget>
  <TypeScriptJSXEmit>None</TypeScriptJSXEmit>
  <TypeScriptCompileOnSaveEnabled>True</TypeScriptCompileOnSaveEnabled>
  <TypeScriptNoImplicitAny>False</TypeScriptNoImplicitAny>
  <TypeScriptModuleKind>System</TypeScriptModuleKind>
  <TypeScriptOutFile />
  <TypeScriptOutDir />
  <TypeScriptGeneratesDeclarations>False</TypeScriptGeneratesDeclarations>
  <TypeScriptNoEmitOnError>True</TypeScriptNoEmitOnError>
  <TypeScriptMapRoot />
  <TypeScriptSourceRoot />
  <TypeScriptExperimentalDecorators>True</TypeScriptExperimentalDecorators>
  <TypeScriptEmitDecoratorMetadata>True</TypeScriptEmitDecoratorMetadata>
</PropertyGroup>



Закрыв студию, находим наш *.csproj файл и добавляем в узел PropertyGroup две новые строки:

<TypeScriptExperimentalDecorators>true</TypeScriptExperimentalDecorators>
<TypeScriptEmitDecoratorMetadata>True</TypeScriptEmitDecoratorMetadata>

Теперь открываем проект, заходим в свойства и видим новую вкладку – TypeScript Build.
Выставляем там EcmaScript 6 и Module System — Common Js. Сохраняем.

Шаг четвертый. Код.


Вот теперь можно добавить первые строки кода в наш app.component.ts
Копируем туда вот это и билдим проект.

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


Если все пошло как надо, билд пройдет без ошибок. Это наш основной компонент или, другими словами, это и есть наше приложение.

Теперь давайте настроим его запуск (bootstrap). Для этого в папку app добавляем файл

main.ts
import { bootstrap }    from '@angular/platform-browser-dynamic';
import { AppComponent } from './app.component';
bootstrap(AppComponent);


И опять билдим проект. Опять ошибок быть не должно. Можно, конечно, и не билдить, но мне как-то спокойнее.

Теперь в корень проекта добавляем

index.html
<html>
<head>
    <title>Angular 2 QuickStart</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="styles.css">
    <!-- 1. Load libraries -->
    <!-- Polyfill(s) for older browsers -->
    <script src="node_modules/core-js/client/shim.min.js"></script>
    <script src="node_modules/zone.js/dist/zone.js"></script>
    <script src="node_modules/reflect-metadata/Reflect.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <!-- 2. Configure SystemJS -->
    <script src="systemjs.config.js"></script>
    <script>
      System.import('app').catch(function(err){ console.error(err); });
    </script>
</head>
<!-- 3. Display the application -->
<body>
    <my-app>Loading...</my-app>
</body>
</html>


и, тоже в корень,

systemjs.config.js
/**
 * System configuration for Angular 2 samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
    // map tells the System loader where to look for things
    var map = {
        'app': 'app', // 'dist',
        '@angular': 'node_modules/@angular',
        'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
        'rxjs': 'node_modules/rxjs'
    };
    // packages tells the System loader how to load when no filename and/or no extension
    var packages = {
        'app': { main: 'main.js', defaultExtension: 'js' },
        'rxjs': { defaultExtension: 'js' },
        'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
    };
    var ngPackageNames = [
      'common',
      'compiler',
      'core',
      'forms',
      'http',
      'platform-browser',
      'platform-browser-dynamic',
      'router',
      'router-deprecated',
      'upgrade',
    ];
    // Individual files (~300 requests):
    function packIndex(pkgName) {
        packages['@angular/' + pkgName] = { main: 'index.js', defaultExtension: 'js' };
    }
    // Bundled (~40 requests):
    function packUmd(pkgName) {
        packages['@angular/' + pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
    }
    // Most environments should use UMD; some (Karma) need the individual index files
    var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
    // Add package entries for angular packages
    ngPackageNames.forEach(setPackageConfig);
    var config = {
        map: map,
        packages: packages
    };
    System.config(config);
})(this);



Шаг пятый. Попытка взлета.


А теперь запускаем космонавта! Ну, стартуем приложение.

Если все пошло хорошо, вы должны увидеть надпись My First Angular 2 App на вашем экране. Готовый код доступен на github вот тут.

Всем спасибо за внимание и безграбельного будущего.
Поделиться с друзьями
-->

Комментарии (43)


  1. RouR
    19.07.2016 11:53

    Упаковка и минификация?


    1. Drag13
      19.07.2016 12:02

      Gulp? :D
      Во-первых, а зачем? К минификации эта статья отношения особого не имеет, разве что с точки зрения академического интереса.
      А во-вторых, лично мне минифицировать просто страшно. Ошибки в консоли и так чуть более чем не информативны, а тут даже представить боюсь что будет. Мне хватило той крови которую у меня выпила последняя версия typescript.
      Впрочем, если вы считаете, что статья из-за этого не полна и у вас есть аргументы — есть два пути. Первый (быстрый) форк гитхаба. Не зря он тут. Второй, медленный. Возможно у меня руки дойдут проверить и попробовать минификацию этого счастья.


      1. impwx
        19.07.2016 13:23

        Как раз только что разбирался с тем, как минифицировать исходники самого ангуляра, чтобы можно было подключить их как единый файл и больше ничего динамически не подгружать. Определить корректную комбинацию плагинов для галпа, их настроек, порядка исходных файлов и прочего заняло практически неделю. Искренне надеюсь, что разработчики вернут SystemJS-бандлы, как это было в beta-сборках.


        1. Drag13
          19.07.2016 14:05

          В -rc используется System.js
          Или я что то не правильно понял?


          1. impwx
            19.07.2016 14:34
            +1

            В beta последовательность действий для сборки была тривиальна:

            • Взять файлы из папки bundles в формате SystemJS
            • Конкатенировать и минифицировать их классическими средствами (gulp-concat и gulp-uglify)
            • Подключить получившийся файл на страницу в теге script

            В этом скрипте все необходимые модули были заранее объявлены через System.register, поэтому SystemJS больше ничего с сервера не подгружал, и даже вызов System.config вообще не был нужен.

            В RC собранные файлы в формате SystemJS убрали. Есть только файлы в формате UMD, но их нельзя просто конкатенировать и подключить — там нет информации о том, что это вообще был за модуль. Приходится сначала написать system.config.js, собирать часть пакетов с помощью gulp-jspm-build (в котором нашелся баг), остальную часть конкатенировать в нужной последовательности. Например, код самого SystemJS должен всегда располагаться первым в файле, иначе он не может найти собственный тег script и падает.

            В общем, банальная настройка окружения оказалась на два порядка более сложной и утомительной, чем написание самой логики тестового приложения.


            1. Drag13
              19.07.2016 14:39

              О как. Спасибо за развернутый ответ.


      1. bromzh
        19.07.2016 13:39

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

        Есть же source map.


        А во-вторых, лично мне минифицировать просто страшно.

        Что, даже в проде всё в непожатом виде?


      1. RouR
        19.07.2016 13:55

        лично мне минифицировать просто страшно

        Поэтому в дебаге минифкация должна быть отключена, а при выполнении publish в VS проект должен собраться в релизе, все скрипты должны упаковаться и всё это выкатится на препрод сервер.
        Это не академический интерес, это реальный процесс разработки и он должен быть автоматизирован, а не в консоли набирать команды каждый раз.


        1. Drag13
          19.07.2016 13:58

          RС на проде? + часть зависимостей уровня 0.Х
          Я бы не рискнул.


          1. RouR
            19.07.2016 13:59

            Это сейчас он RС. Или потом эта инструкция будет дополняться?


            1. Drag13
              19.07.2016 14:03

              Я очень надеюсь, что потом в эту статью будут тыкать пальцами со словами «вот же динозавры мучились… ».
              Т.е. я надеюсь что эти мучения в будущем повторять не придется.

              А если все будет плохо, то или эта инструкция обновиться, или появится другая.


          1. bromzh
            19.07.2016 14:24

            А вы проводите аудит кода всех зависимостей и зависимостей зависимостей? Цифра в версии ничего не значит. А многие беты и RC порой качественнее обычных версий.


            1. Drag13
              19.07.2016 14:29

              1. Да.
              2. «Цифра в версии ничего не значит». Это очень смелое допущение которое на проде может вылезти боком.
              3. Да, есть беты которые качественнее релиз версий. Но чаще всего справедлива обратная ситуация. И если вы не проводите полный аудит кода сторонних зависимостей то, возможно, беты в проде это не лучший вариант.

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


              1. bromzh
                19.07.2016 14:47

                1. Это очень хорошо. Я сам стараюсь изучать исходники и исключать зависимости с плохим кодом, но не на всё хватает времени. Благо, большинство npm-зависимостей нужны для сборки, а в сборку включается не так много.
                2. Я имел ввиду вот что: никто не мешает автору взять и изменить первую цифру с нуля на 1 (или побольше). Но код при этом будет плохой. А другой автор просто нумерует свой продукт с нуля, сильных изменений АПИ у него не было и изменять первую цифру с 0 на 1 не было смысла. Однако код при этом написан хорошо.
                  Например, Flask (web-фреймворк для python) сейчас в версии 0.11, однако продукт очень хороший. А вот какой-нибудь битрикс уже версии 7 или больше, но зато сколько жалоб

                В общем, мне повезло, что есть возможность использовать новые технологии. И вам пожелаю найти такую возможность, это здорово (хотя и ответственность возрастает).


                1. Drag13
                  19.07.2016 14:52

                  1. Пришли к консенсусу.
                  2. Согласен. Но это как с конвенцией о константах. Никто не запрещает менять значения переменных названных «SUPER_VARIABLE». Но **обычно** так никто не делает. Когда автор ставит 1.Х он тем самым декларирует что продукт готов. Когда автор ставит 0.Х он тем самым предупреждает, что могут быть любые изменения и если что — «я предупредил». В остальном соглашусь.

                  Ну и по последнему абзацу — это конечно плюс и вообще приятно)


      1. Ateist602
        19.07.2016 13:58

        Используем ASP.NET Core, Angular 2 и TypeScript уже несколько месяцев в продакшене.
        Никаких проблем ни с минификацией и дебагом у браузере.
        Благо, WebPack работает на ура.


        1. Drag13
          19.07.2016 14:01

          А можно поинтересоваться из каких соображений вы взяли на прод релиз кандидат ангуляра?
          Я понимаю для себя или что то аналогичное, но идти с этим в продкашн…
          Возможно я и не прав, так что буду благодарен за иную точку зрению.


          1. bromzh
            19.07.2016 14:20

            Я тоже взял (когда он был ещё в бете). И очень доволен.
            Почему? Наверное, специфика проекта позволила: нет нужды поддерживать старые браузеры, довольно длительная тестировка перед запуском.


            1. Drag13
              19.07.2016 14:32

              Немного завидую :)


          1. Ateist602
            19.07.2016 15:19

            Потому что проект крупный и нужен фреймворк, который будет жить не один год, на который можно будет без проблем найти разработчиков. Angular2 обещает таковым быть. Даже сейчас на стадии последней (надеюсь) RC, он уже обзавелся приличной документацией и солидного размера комьюнити.

            Поэтому, отвечая на Ваш вопрос «Почему мы взяли Angular 2 RC» на прод, отвечу, что это сделано с заделом на будущее.


            1. bromzh
              19.07.2016 15:46

              Взял по той же причине. Первый ангуляр несколько устарел и будет потихоньку умирать. Второй обещает долго жить и развиваться, исправляет недостатки первого, использует современные вещи и поддерживается многими спонсорами.
              Начал делать прототип на бете и пока ни разу не пожалел. Теперь на нём 2 проекта, своя небольшая библиотека общих компонентов и в планах переписать на него 3-й проект.


          1. Odrin
            20.07.2016 10:36
            -1

            А в чем проблема? RC-4 прекрасно работает, явных багов нет. Forms и Routes, обновились с deprecated версий и глобальных изменений к релизу уже не будет.
            Брать сейчас в прод первый ангуляр не рационально — он не может конкурировать по производительности ни с кем на сегодняшний день. Так что либо Angular 2 rc, либо что-то другое. Но, имхо, у ng нет альтернативы по набору возможностей из коробки.
            P.S. TypeScript прекрасен :)


      1. Odrin
        20.07.2016 10:48

        Третий, верный, Angular CLI.
        ng build -prod. Все, проект собран в bundle и минифицирован.


    1. svekl
      19.07.2016 17:53

      Вот очень интересная статья про минификацию
      http://blog.mgechev.com/2016/06/26/tree-shaking-angular2-production-build-rollup-javascript/


  1. ZOXEXIVO
    19.07.2016 11:57

    Раньше тоже через VS пытался, а потом попользовался Atom и теперь Angular 2 редактирую только там


    1. Drag13
      19.07.2016 12:04

      Я тоже поднимал его через атом. Но работаю то в VS в основном.
      Тем более — «неужели то я в студии ангуляр 2 поднять не смогу? Да быть того не может!»


  1. visortelle
    19.07.2016 13:58
    +1

    «Если честно я не нашел способа обновить node.js..»
    Для управления версиями ноды на одной машине можно использовать nvm(node version manager). Вот версия для винды. github.com/coreybutler/nvm-windows


    1. Drag13
      19.07.2016 13:59

      Спасибо добрый человек.


  1. kemsky
    19.07.2016 14:45

    Я подключил через /// <binding BeforeBuild='build' /> в gulp файле, а компиляцию через студию отключил, с ней перманентные проблемы, редактирую в Intellij Idea.


  1. mtt
    19.07.2016 15:16
    +1

    Чтобы получить angular библиотеку нужно установить менеджер пакетов bower и менеджер задач grunt. Чтобы установить менеджер пакетов bower вам сперва нужно установить менеджер пакетов npm. Чтобы установить менеджер пакетов npm вам сперва нужно установить среду исполнения node.js. Есть ли возможность использовать angular напрямую с какого либо cdn, минуя весь этот зоопарк в коммандной строке?


    1. Drag13
      19.07.2016 15:20

      Насколько я видел — нет.


      1. supersmeh
        19.07.2016 16:24
        +1

        На самом деле можно.
        Надо правильно прописать в systemjs.config.js вот примерно таким образом:

        (function(global) {
        
          var ngVer     = '@2.0.0-rc.4'; // lock in the angular package version; do not let it float to current!
          var routerVer = '@3.0.0-beta.1'; // lock router version
          var formsVer = '@0.2.0'; // lock form version
        
          //map tells the System loader where to look for things
          var  map = {
            'app':                        'app',
        
            '@angular':                   'https://npmcdn.com/@angular', // sufficient if we didn't pin the version
            '@angular/router':            'https://npmcdn.com/@angular/router' + routerVer,
            '@angular/forms':               'https://npmcdn.com/@angular/forms' + formsVer,
            'angular2-in-memory-web-api': 'https://npmcdn.com/angular2-in-memory-web-api', // get latest
            'rxjs':                       'https://npmcdn.com/rxjs@5.0.0-beta.6',
            'ts':                         'https://npmcdn.com/plugin-typescript@4.0.10/lib/plugin.js',
            'typescript':                 'https://npmcdn.com/typescript@1.9.0-dev.20160409/lib/typescript.js',
         };
        
          //packages tells the System loader how to load when no filename and/or no extension
          var packages = {
            'app':                        { main: 'main.js',  defaultExtension: 'js' },
            'rxjs':                       { defaultExtension: 'js' },
            'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
          };
        
          var ngPackageNames = [
            'common',
            'compiler',
            'core',
            'http',
            'platform-browser',
            'platform-browser-dynamic',
            'router-deprecated',
            'upgrade',
          ];
        
          // Add map entries for each angular package
          // only because we're pinning the version with `ngVer`.
          ngPackageNames.forEach(function(pkgName) {
            map['@angular/'+pkgName] = 'https://npmcdn.com/@angular/' + pkgName + ngVer;
          });
        
          // Add package entries for angular packages
          ngPackageNames.forEach(function(pkgName) {
        
            // Bundled (~40 requests):
            packages['@angular/'+pkgName] = { main: 'bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
        
            // Individual files (~300 requests):
            //packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
          });
        
          // No umd for router yet
          packages['@angular/router'] = { main: 'index.js', defaultExtension: 'js' };
        
          var config = {
            map: map,
            packages: packages
          }
        
          System.config(config);
        
        })(this);
        


        1. mtt
          19.07.2016 16:30
          -1

          Я нашёл вот такой способ: https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.js


          1. Drag13
            19.07.2016 18:12

            Это 1.5.7., речь идет о 2.0 rc-4


            1. mtt
              20.07.2016 14:15

              Да, действительно, чего это я. Второй никуда не опубликован


        1. Drag13
          19.07.2016 16:38

          Круто, спасибо!


    1. bromzh
      19.07.2016 15:55
      +1

      Для комфортной разработки достаточно только npm для зависимостей и webpack для сборки. В npm есть большинство фронтэнд библиотек, ангуляры в том числе. Вебпак лично для меня заменил и grunt и gulp (хотя это не совсем одно и то же). Задачи описываются в package.json в секции scripts. В итоге, чтобы запустить сервер разработчика (который сам отслеживает изменения, пересобирает проект и заменяет нужные js и css на странице) я набираю npm start, а чтобы собрать проект для прода (с минификацией и оптимизацией всего), я набираю npm run build. Единожды настроенная среда и скелет приложения экономят кучу времени. За основу можно взять этот проект.


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


  1. Gbdrm
    20.07.2016 10:03
    -1

    Если цель просто открыть проект с angular2 в студии то не понятно зачем все это делать вручную.
    Пример создания проекта asp.net core + angular2 и открыть его в студии за 1 минуту:

    npm install -g yo generator-aspnetcore-spa
    yo aspnetcore-spa
    


    детали:
    http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/


    1. Drag13
      20.07.2016 10:27

      Причина проста. Изначальная задача состояла в переводи существующего приложения на MVC-5 + A1 на MVC-5 + A2. Поэтому установка Сore и с нуля не подходит.
      Но за линк спасибо


  1. ZOXEXIVO
    21.07.2016 01:51
    +1

    Angular2 внешне начинает немного раздражать. На ранних beta делал небольшие проекты и даже нравилось.
    Сейчас тупо не могу запустить туториал, а точнее говоря не могу понять, зачем наподключали десятки каких-то библиотек (zone.js, core-js итп).
    gulpfile стал похож на утилиту копирования файлов из node_modules в wwwroot, systemjs.config тоже разбухает.
    Такое ощущение что команда разработчиков хочет обеспечить безбедное существование армии фронтэндщиков на долгие годы.
    Теперь еще вместо angular2 есть angular@. Прекрасно


    1. bromzh
      21.07.2016 02:43

      Вообще-то всё наоборот. В бете всё было монолитно в 1-м npm-модуле. Начиная с RC проект разбили на отдельные модули с общим npm-scope @angular. В зависимостях проекта появилась возможность указать только то, что нужно. И разработка этих модулей может вестись независимо, что тоже хорошо.
      Например, если раньше в проекте не нужен был роутер, то всё равно приходилось указывать в зависимостях пакет, где есть код этого роутера.
      Сейчас же всё стало удобно: если тебе не нужна, например, работа с http-клиентом, то просто не включаешь @angular/http в зависимости. Делаешь проект только для серверной платформы, а значит тебе не нужны фичи браузера? Убираешь platform-browser из зависимостей.


      Что касается зависимостей от других библиотек, то тут всё как раньше: angular2 зависит только от rxjs и zone.js.


      core-js используется для более удобного подключения нужных полифиллов, можно обойтись и без него.


      А заместо gulp и systemjs лучше взять webpack. Systemjs вообще станет ненужным, при добавлении библиотек ничего никуда добавлять не придётся, конфиги не будут расти. Ну и вместо монструозного gulpfile останется небольшой конфиг вебпака, который практически не придётся изменять.


      В качестве примера использования всего этого вместе можно посмотреть на этот стартер.


      1. kemsky
        21.07.2016 04:09

        Есть интресная статья на эту тему: http://blog.mgechev.com/2016/06/26/tree-shaking-angular2-production-build-rollup-javascript/


        Ситуация будет менятся, правда на сколько пока не ясно. С одной стороны webpack 2, tree-shaking, с другой скомпилированные темплейты по-любому станут тяжелее в разы. Сейчас вебпак не может оптимизировать неиспользуемые модули и результате в билд попадает почти весь ангуляр. По сравнению с ангуляром и rxjs вклад других библиотек в итоговый размер бандла очень и очень скромный.


      1. ZOXEXIVO
        21.07.2016 12:35

        Спасибо за пояснение.
        Пока очень сложно осознавать, что любой чих в npm делается через отдельный пакет.
        Обычно же делается форк библиотеки о она встраивается в экосистему и есть какой-то эффект автономности всего фреймворка.
        Понятно, что лишних ресурсов нет и поддерживать сложнее