Разделяйте Angular2 TypeScript файлы и файлы JavaScript в разные папки, возможно, 'dist'

Я использую 5 мин быстрый старт на веб-сайте angular.io, который содержит файловую структуру следующим образом:

angular2-quickstart
 app
   app.component.ts
   boot.ts
 index.html
 license.md
 package.json
 tsconfig.json

tsconfig.json является кодовым блоком, подобным этому:

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

Также package.json:

{
  "name": "angular2-quickstart",
  "version": "1.0.0",
  "scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
  },
  "license": "ISC",
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "concurrently": "^1.0.0",
    "lite-server": "^1.3.1",
    "typescript": "^1.7.3"
  }
}

Я изменяю sourceMap с true на false, поэтому в редакторе кода файл карты не генерируется снова, но файл js по-прежнему генерируется.

Я хочу работать только с ts файлом и не хочу получать бранч js и js.map файла, что мне делать, чтобы поместить все мои ts файлы в мой обычный floder, например, в папку приложения и все js и js.map в папку с именем dist?

Хорошим примером этого может быть angular2 -webpack-quickstart. Но я не понял, как они это делают?

Любой совет, как это сделать, конечно, не вручную.

Спасибо,

Ответ 1

Возможно, поздно, но вот двухэтапное решение.

Шаг 1

Измените system.config.js, обновив 'app' до 'dist/app':

var  map = {
    'app':                        'app', // 'dist/app',
    .
    .
    .
};

Теперь это будет выглядеть так:

var  map = {
    'app':                        'dist/app', // 'dist/app',
    .
    .
    .
};

Шаг 2

Создайте папку dist.

Измените tsconfig.json и добавьте:

"outDir": "dist"

Полученный tsconfig.json:

{
  "compilerOptions": {
    .
    .
    .
    .

    "outDir": "dist" // Pay attention here
  },
  "exclude": [
    .
    .
    .
  ]
}

Запустите npm start, и вы должны увидеть все скомпилированные файлы .js и .map.js в папке dist.

Примечание. Пройдите другие ответы. Они также очень полезны и информативны.

Ответ 2

Мое решение немного отличается от приведенного выше. Я начинал с семени Angular2 Quickstart, определенного здесь: https://github.com/angular/quickstart#create-a-new-project-based-on-the-quickstart

А потом изменилось только следующее:

  • Добавлен "outDir": "../dist" в tsconfig.json
  • Изменен атрибут baseDir внутри bs-config.json до "baseDir": ["dist", "src"]

Затем npm run start работает как раньше (даже html/css и другие файлы без копирования), но скомпилированные файлы .js и .map встроены в dist/app и не будут загрязнять ваш каталог src/app.

Обратите внимание, что я еще не тестировал, как это влияет на тестирование.

Ответ 3

Возможно, я опаздываю, но я это сделал.

Сначала сделайте что сказал рашел шань.

Затем создайте папку dist.

После создания папки перейдите в файл tsconfig.json и добавьте следующее:

"outDir": "dist"

Полученный tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "outDir": "dist"
  },
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ]
}

Если вы запустите npm start и сохраните файл, вы должны увидеть все скомпилированные .js и .map.js в папке dist.

Ответ 4

Thanx raheel shan, ваш ответ дал начало,

Как @Adavo справедливо спросил выше в комментариях

К сожалению, мои файлы html/css не присутствует в папке dist. Как сделать, чтобы скопировать все html/css в dist folder?

Ответ на этот вопрос * предоставить полный путь к файлу HTML/CSS с помощью '/' (из корневого каталога) во всех файлах .ts и, главным образом, в свойстве "templateURL" @Component

после большого количества времени - я понял, что понял - без использования Gulp:) Yipppeee

Ответ 5

Итак, чтобы решить эту проблему:

К сожалению, мои файлы html/css отсутствуют в папке dist. Как сделать, чтобы скопировать все html/css в папку dist?

Сделайте шаги в ответах @raheel shan и @Lirianer.... тогда вы можете закончить с этим.

Я решил это для своих целей, используя npm-скрипты. Раздел сценариев в моем файле package.json приведен ниже. Решением является запуск onchnage (пакет npm - npm install --save onchange) одновременно с tsc и сервером. Затем используйте rsync для копирования активов, которые вы хотите переместить:

"scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" \"npm run watchassets\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings",
    "movesssets": "rsync -a --include='*.css' --include='*.html' --include='*/' --exclude='*' ./app/ ./build/",
    "watchassets": "onchange 'app/**/*.css' 'app/**/*.html' -e 'build/*' -v -- rsync -a --include='*.css' --include='*.html' --include='*/' --exclude='*' ./app/ ./build/"
}

Для тех из вас, кто находится в Windows, вы можете получить rsync через Cygwin или с помощью упакованных решений, таких как cwRsync.

Ответ 6

К сожалению, мои файлы html/css отсутствуют в папке dist. Как сделать, чтобы скопировать все html/css в папку dist?

Относительные пути в Angular 2 не так просты, потому что структура хочет быть гибкой с тем, как вы загружаете свои файлы (CommonJs, SystemJs и т.д.), в соответствии с Компонентно-относительные пути в Angular 2.

В статье объясняется module.id при использовании с CommonJs (проверьте ваш tsconfig.json), содержащий абсолютный корень модуля, и его можно использовать для построения относительного пути.

Таким образом, лучшей альтернативой может стать оставить файлы css/html с ts файлами и сконфигурировать ваш компонент, как показано ниже, при условии, что у вас есть только файлы сборки в отдельной папке с именем dist. ваши файлы css и html будут загружены без проблем с использованием относительных путей путем преобразования производного пути в исходный, который содержит их, - по существу удаление /dist/ или переименование его на /src/;)

@Component({
   moduleId: module.id.replace("/dist/", "/"),
   templateUrl: 'relative-path-to-template/component.html',
...
});

Если у вас есть отдельные папки для источника и сборки, вы можете это сделать:

@Component({
   moduleId: module.id.replace("/dist/", "/src/"),
   templateUrl: 'relative-path-to-template/component.html',
...
});

Ответ 7

Я попробовал @WillyC предложение и работал как шарм, просто отметьте, что вам нужно добавить зависимость onchange к вашему файлу package.json. Я добавил немного немного дополнительных скриптов, чтобы иметь чистую настройку при первом запуске, а также для удаления оставшихся html/css файлов (было бы неплохо, если бы это было так же возможно для TSC)

В любом случае, вот раздел моего package.json файла

{
  ...
  "scripts": {
    "start": "npm run cleandist && npm run moveassets && tsc && concurrently \"tsc -w\" \"lite-server\" \"npm run watchassets\" ",
    ...
    "cleandist": "rm -rf dist/*",
    "moveassets": "rsync -a --include='*.css' --include='*.html' --include='*/' --exclude='*' ./app/ ./dist/",
    "watchassets": "onchange 'app/**/*.css' 'app/**/*.html' -e 'dist/*' -v -- rsync -a --include='*.css' --include='*.html' --include='*/' --exclude='*' --delete ./app/ ./dist/"
  },
  ...
  "devDependencies": {
    ...
    "onchange":"^3.0.2"
  }
}

Для удаления rsync обратите внимание на флаг --delete в команде rsync watchassets script

Ответ 8

Angular2 TypeScript файлы и файлы JavaScript в другую папку

Вот моя конфигурация для Angular 2 последней версии V2.1.1, и она работает очень хорошо!

tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "sourceMap": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "removeComments": false,
        "noImplicitAny": false,
        "outDir": "./app/dist"
    }
}

Ответ 9

Вдохновленный @Nagyl, я разработал свой собственный путь, и я считаю, что стоит поделиться:

1) Установите cpx

npm install cpx

2) Обновите bs-config.json и измените baseDir с "src" на "dist"

"baseDir":"dist"

3) Обновите tsconfig.json и добавьте outDir в конец компилятораОпции:

"outDir": "../dist"

4) Обновить пакет .json: 4.1) добавьте новую команду в конец скриптов:

"cpx": "cpx \"src/**/*.{html,css,js,png,jpg}\" dist --watch"

4.2) измените строку "start", чтобы включить команду "cpx":

"start": "concurrently \"npm run build:watch\" \"npm run cpx\" \"npm run serve\"",

Шаг 2 модификация

Шаг 3 модификация

Шаг 4 модификация

Ответ 10

Вы можете передать файлы .ts в браузере, как plunker делает в своем шаблоне angular 2 ts.

Просто запустите редактор, выберите новый, затем параметр AngularJS и 2.0.x(TS) (в самом низу). Но весь смысл использования webpack (или любого другого инструмента для связывания) заключается в локальном перераспределении файлов.

Ответ 11

Я попробовал несколько из вышеупомянутых вариантов, и, наконец, это то, на чем я остановился: Peep - расширение для Visual Studio Code.

Как установить:

  • Просмотр → Расширения
  • Peep
  • Установить
  • Reload
  • Вид → Командный поддон
  • Peep None
  • изменить .vscode/settings.json по мере необходимости (мой показан ниже)

-

{
  "typescript.check.workspaceVersion": false,
  "files.exclude": {
    "**/*.js": true,
    "**/*.js.map": true,
    "node_modules/": true,
    "dist/": true,
    "lib/": true
  }
}

01/25/2017 - обновления: angular -cli из коробки, позаботится об этом. и монтажные работы, и теперь.

Ответ 12

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

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

Я просто настраиваю параметры рабочего пространства, чтобы файлы js в /app не отображались. Они все еще там. Они просто скрыты от моего рабочего пространства. Для меня это достаточно.

Я использую Sublime Text, поэтому вот что у меня есть для моих настроек проекта:

"file_exclude_patterns": ["app/*.js"]

Я уверен, что многие другие редакторы имеют схожие функции.

UPDATE:

Просто используйте Angular CLI. Все заботится автоматически.

Ответ 13

Для Angular 4 с файлами из quickstart все, что мне нужно было сделать, это следующее (сочетание ранее заявленных ответов, но несколько разных значений):

  • В tsconfig.json(add): "outDir": "../dist"
  • В bs-config.json(изменение): "baseDir": ["dist", "src"],
  • В bs-config.e2e.json(change): "baseDir": ["dist", "src"],

Нет изменений в systemjs.config.js.

Ответ 14

Я попробовал предложение @raheel, и это сработало для меня. Я изменил структуру в соответствии с моими потребностями.

Я использую следующую структуру

Я использую следующую структуру

Чтобы получить это, я изменил только два файла: 1. systemjs.config.js и 2.tsconfig.json

В systemjs.config.js я изменился на

map: { // previously it was app: 'app', app: 'app/js', ...

systemjs.config.js

и в tsconfig.json мне нужно добавить "outDir": "app/js"

tsconfig.json

Ответ 15

Я работаю с Angular 2.4. Мне нужен был дополнительный шаг, чтобы заставить его работать. Это была ссылка на systemJs для файла main.js в index.html это, от:

System.import('main.js'). catch (function (err) {console.error(err); });

в

System.import( 'расстояние/main.js'). Улов (функция (ERR) { console.error(ERR); });

Ответ 16

Добавление сверху того, что сказал рашел-чан. Я должен был внести дополнительные изменения в index.html, чтобы теперь отразить корректный файл javascript.

Вот резюме с моей стороны.

tsconfig.json

Перед

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [ "es2015", "dom" ],
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true
  }
}

После:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": [ "es2015", "dom" ],
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true,
    "outDir": "dist"
  },
  "exclude": [ 
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ]
}

systemjs.config.js

До:

'app': 'app',

После:

'app': 'dist/app', //'app

index.html

До:

System.import('main.js').catch(function(err){ console.error(err); });

После:

System.import('dist/main.js').catch(function(err){ console.error(err); });