Розділіть файли Angular2 TypeScript та файли JavaScript у різні папки, можливо, "dist"


82

Я використовую 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 у мій звичайний флодер, наприклад, у папку програми та всі js та js. зіставити файли в папку під назвою dist?

Хорошим прикладом цього може бути angular2-webpack-quickstart . Але я не зрозумів, як вони це роблять?

Будь-яка порада, як це зробити, звичайно, не вручну.

Дякую,


вам потрібно скомпілювати машинопис у js, ось як це читає браузер, подивіться на формат: 'register', defaultExtension: 'js' у вашому index.html
Сарі Йоно

angular2-webpack-starter дуже сучасний, наразі він знаходиться на бета-версії 1. Запропонуйте ознайомитись з git (зокрема, git pull).
Тім Макнамара

@TimMcNamara Я захоплюю angular2-webpack-starter і починаю розробляти, як місяць тому, але він вже встановлений для іншої віддаленої приватної URL-адреси github, так що в цьому випадку, як я повинен бути в курсі angular2-webpack-starter, який частина я повинен оновити? Дякую.
Xinrui Ma

Ви можете просто замінити ваш package.json на поточний звідси знищити посиланняnode_modules і npm installоновити все
Тім Макнамара

Зроби те, що сказала Рахіл Шань . ОКРЕМ у system.config.js це має бути 'app': 'dist / app' // замість просто 'dist'
Мартін Кремер

Відповіді:


97

Можливо, пізно, але ось двокрокове рішення.

Крок 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 .

Примітка : Перегляньте інші відповіді. Вони також досить корисні та інформативні.


17
Я спробував це, це працює. На жаль, моїх файлів html / css немає у папці dist. Як це зробити, щоб скопіювати всі html / css в папку dist? спасибі
Адаво

Я спробував це, і через деякий час каталог додатків створюється у моїй папці dist.
cccvandermeer

3
Як ви працюєте з необхідними вузлами_модулів, такими як @angular? Чи потрібно копіювати все це в каталог dist при кожній побудові?
Джеремі Моріц,

4
Для майбутніх читачів: на запитання html/css files is not present in the dist folderє відповіді нижче ...
Бен Віндінг,

Папку "dist" не потрібно фіксувати, так? Я виключив його з мого проекту Visual Studio і хочу бути впевненим, що це правильно.
Брайан

20

Моє рішення дещо відрізняється від вищезазначеного. Я починав із насіння 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каталог.

Зверніть увагу, що я ще не тестував, як це впливає на тестування.


Це найпростіше і найчистіше рішення
JeffG 12.03.17

це найкраще!
Windchill

Це працює! Але чи є у когось такі проблеми, як я, налагодження програми за допомогою Chrome DevTools? Я отримую .ts-файли порожніми.
Aquiles

фантастичні рішення. Дійсно просто та дуже чисто!
Cribber

17

Можливо, я також запізнююсь, але я це зробив.

Спочатку зробіть те, що сказала Рахіл Шань .

Потім створіть папку 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 .


8

Спасибі Рахіл Шан, ваша відповідь дала фору,

Як справедливо запитав @Adavo в коментарях

На жаль, моїх файлів html / css немає у папці dist. Як це зробити, щоб скопіювати всі html / css в папку dist?

Відповідь на це запитання - * забезпечити повний шлях до файлу HTML / CSS, використовуючи '/' (з кореневого каталогу) у всіх файлах .ts та, головним чином, у властивості "templateURL" @Component

через багато часу - я зрозумів - без використання Gulp :) Yipppeee


Чи може хтось запропонувати рішення для цього, не вимагаючи повного шляху? ... бажано просте рішення, яке не вимагає повного ремонту іншої робочої системи складання.
WillyC

Здається, це неможливо, ви можете спробувати angular-cli для кращої організації коду, але цей повний шлях до html теж потрібен
Абдеалі Чанданвала

Я придумав спосіб! Дивіться відповідь, яку я надав нижче. Я думаю, це не ідеально, але вирішує проблему, використовуючи лише сценарії npm, без grunt / gulp / angular-cli. Не те, що я маю щось проти цих рішень, але я просто не хотів їх з’ясовувати прямо зараз!
WillyC

Перевірте мій відповідь це досить чисте зміна маніпулювання model.id трохи stackoverflow.com/a/40694657/986160
Михайло Michailidis

7

На жаль, моїх файлів 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',
...
});

2
хоча це хороша робота ... все-таки головна проблема отримання всіх наших файлів проекту з нашого проекту залежить від двох різних папок ... чи є спосіб розгорнути наш код з однієї папки у браузері. Заздалегідь
дякую

навіть у випадку node_modules ви запускали сценарій збірки. Кожен із модулів node_module зазвичай має вихідний js та файли min.js. Тому я не розумію, чому проблема полягає у розгортанні вихідного коду, а потім запуску сценарію збірки для завантаження залежностей node_module та компіляції машинопису, який створить папку dist. Очевидно, що ви можете налаштувати webpack або подібні процеси, щоб робити зв’язування по-іншому.
Michail Michailidis

7

Отже, щоб вирішити це:

На жаль, моїх файлів 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 .


... хоча я використовую buildпапку, а не distпапку, але ви розумієте.
WillyC

1
Вибачте за голос проти, але вам дійсно потрібно додати, звідки onchangeпоходить. Крім того, слід опублікувати примітку, що цей внесок працює лише для Unix-подібних оболонок. Можливо, це не така проблема для більшості людей, але останнім часом я стикався з багатьма розробниками (змушеними бути) за допомогою Windows.
jhohlfeld

Добре - я додав пояснення звідки onchangeбереться та інформацію про те, як отримати rsyncWindows. Повідомте мене, якщо це стосується ваших проблем.
WillyC

5

Я спробував пропозицію @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сценарію


3

Файли 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"
    }
}

systemjs.config.js

/**
 * System configuration for Angular samples
 * Adjust as necessary for your application needs.
 */
(function (global) {
  System.config({
    paths: {
      // paths serve as alias
      'npm:': 'node_modules/'
    },
    // map tells the System loader where to look for things
    map: {
      // our app is within the app folder
      // app: 'app/dist',  &&  main: './dist/main.js',
      // Error: (SystemJS) XHR error (404 Not Found) loading http://localhost:3000/app/dist/dist/main.js(…)
      app: 'app',
      // angular bundles
      '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
      '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
      '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
      '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
      '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
      '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
      '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
      '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
      '@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js',
      // other libraries
      'rxjs':                      'npm:rxjs',
      'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js'
    },
    // packages tells the System loader how to load when no filename and/or no extension
    packages: {
      app: {
        // index.html import path
        // Error: (SystemJS) XHR error (404 Not Found) loading http://localhost:3000/app/dist/main.js(…)
        // app: 'app/dist',  &&  main: './main.js',
        main: './dist/main.js',
        defaultExtension: 'js'
      },
      rxjs: {
        defaultExtension: 'js'
      }
    }
  });
})(this);

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



1
Це не спрацювало для мене, поки я не змінив цей рядок на:main: './dist/app/main.js',
RichC

Цей допис та коментар + stackoverflow.com/a/40694657/5393271 виконують свою роботу. Якщо у вас є різні папки в програмі зі службами або компонентами, такими як app / components / mycomp.components.ts; app / services / myservice.service.ts він автоматично створить ці папки в dist після запуску npm start (building)
sTx

Ви також можете зробити це: in system.js.configat - map{app:"dist",..}then in packages{app{main:"app/main.js"}}} та in tsconfig.json- "outDir": "dist"+ html / css source
sTx

3

Натхненний @Nagyl, я розробив свій власний шлях, і я вважаю, що варто поділитися:

1) Встановіть cpx

npm install cpx

2) Оновіть bs-config.json і змініть baseDir з "src" на "dist"

"baseDir":"dist"

3) Оновіть tsconfig.json і додайте outDir до кінця compilerOptions:

"outDir": "../dist"

4) Оновіть package.json: 4.1) додайте нову команду до кінця сценаріїв:

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

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

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

Крок 2 модифікація

Крок 3 модифікації

Крок 4 модифікація


2

Ви можете транспілювати .tsфайли в браузері, як і plunker у своєму кутовому шаблоні 2 ts.

Просто запустіть редактор, виберіть новий, потім AngularJS та опцію 2.0.x (TS) (внизу). Але вся суть використання webpack (або будь-якого іншого інструменту зв’язування) полягає у локальній транпіляції файлів.


2

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

Як встановити:

  • Перегляд -> Розширення
  • Піп
  • Встановити
  • Перезавантажте
  • Перегляд -> Командний піддон
  • Підглядати немає
  • змінити .vscode / settings.json за потребою (мій показаний нижче)

-

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

25.01.2017 - оновлення: angular -cli з коробки, подбає про це. та монтажні роботи і зараз.


2

Я спробував перелічені тут рішення. Вони хороші, але не ідеальні для мене. Я хочу просте рішення. Я не хочу жорстко кодувати інформацію про шлях у всіх своїх файлах компонентів. Я не хочу встановлювати більше пакунків npm, щоб подбати про це.

Тож я придумав найпростішу альтернативу. Це не пряма відповідь на це питання, але для мене це дуже добре працює.

Я просто налаштував налаштування робочої області, щоб jsфайли /appне відображалися. Вони все ще там. Вони просто приховані від мого робочого простору. Для мене цього досить.

Я використовую Sublime Text, тож ось що я маю для налаштувань свого проекту:

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

Я впевнений, що багато інших редакторів мають подібні функції.

ОНОВЛЕННЯ:

Просто використовуйте Angular CLI. Про все дбають автоматично.


2

Для Angular 4 з файлами з швидкого запуску все, що мені потрібно було зробити, це наступне (поєднання раніше заявлених відповідей, але трохи інших значень):

  • У tsconfig.json (додати): "outDir": "../dist"
  • У bs-config.json (зміна): "baseDir": ["dist", "src"],
  • У bs-config.e2e.json (зміна): "baseDir": ["dist", "src"],

Ніяких змін до systemjs.config.js.


1

Я спробував пропозицію @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


Я роблю те ж саме, що б ви не підтримували, але після запуску файлу .js файл у форматі .js не створюється у папці app / js
пріянка ахір

1

Я працюю з Angular 2.4. Мені потрібен був додатковий крок, щоб це вдалося. Це було посилання systemJs на файл main.js у файлі index.html, з:

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

до:

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


0

Додаючи поверх того, що сказав Рахіл Шань. Мені довелося внести додаткові зміни в 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); });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.