Oddzielne pliki Angular2 TypeScript i pliki JavaScript do różnych folderów, np. „Dist”

82

Korzystam z 5-minutowego szybkiego startu ze strony angular.io, która zawiera taką strukturę plików:

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

tsconfig.json to taki blok kodu :

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

Również plik 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"
  }
}

Zmieniam sourceMap z true na false, więc w edytorze kodu plik mapy nie jest generowany ponownie, ale plik js nadal jest generowany.

Chcę pracować tylko na pliku ts i nie chcę pobierać brunchu plików js i js.map, co powinienem zrobić, aby umieścić wszystkie moje pliki ts w moim zwykłym folderze deweloperskim, takim jak folder aplikacji i wszystkie js i js. mapować pliki do folderu o nazwie dist?

Dobrym przykładem może być angular2-webpack-quickstart . Ale nie wiedziałem, jak oni to robią?

Wszelkie porady, jak to zrobić, oczywiście nie ręcznie.

Dzięki,

Xinrui Ma
źródło
musisz skompilować maszynopis do js, ​​tak czyta go przeglądarka, spójrz na format: 'register', defaultExtension: 'js' w twoim index.html
Sari Yono
angular2-webpack-starter jest bardzo aktualny, jest obecnie w wersji beta 1. Sugerujemy, abyś lepiej zaznajomił się z git (szczególnie git pull).
Tim McNamara,
@TimMcNamara Chwytam angular2-webpack-starter i zaczynam tworzyć jak miesiąc temu, ale jest już ustawiony na inny zdalny prywatny adres github, więc w tym przypadku, jak powinienem zapoznać się z angular2-webpack-starter, który część należy zaktualizować? Dzięki.
Xinrui Ma
Możesz po prostu zastąpić swój plik package.json obecnym z tego linku, który usuniesz node_modulesi npm installzaktualizujesz wszystko
Tim McNamara
Zrób to, co powiedział Raheel Shan . Z WYJĄTKIEM w system.config.js powinno to być „app”: „dist / app” // zamiast tylko „dist”
Martin Cremer

Odpowiedzi:

97

Prawdopodobnie późno, ale tutaj jest rozwiązanie dwuetapowe.

Krok 1

Zmień system.config.js , aktualizując 'app'do 'dist/app':

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

Teraz będzie wyglądać tak:

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

Krok 2

Utwórz folder dist .

Edytuj tsconfig.json i dodaj:

"outDir": "dist"

Wynik tsconfig.json:

{
  "compilerOptions": {
    .
    .
    .
    .

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

Uruchom npm starti powinieneś zobaczyć wszystkie skompilowane .jsi .map.jspliki w folderze dist .

Uwaga : przejrzyj inne odpowiedzi. Są również przydatne i pouczające.

Muhammad Raheel
źródło
17
Próbowałem tego, to działa. Niestety, moich plików html / css nie ma w folderze dist. Jak to zrobić, aby skopiować cały html / css do folderu dist? dzięki
Adavo
Próbowałem tego i po chwili katalog aplikacji został utworzony w moim folderze dist.
cccvandermeer
3
Jak radzisz sobie z wymaganymi modułami node_modules, takimi jak @angular? Czy musisz kopiować to wszystko do katalogu dist przy każdej kompilacji?
Jeremy Moritz
4
Do przyszłych czytelników: pytanie html/css files is not present in the dist folderma odpowiedzi poniżej ...
Ben Winding
Folder „dist” nie musi być zatwierdzony, prawda? Mam to wykluczone z mojego projektu Visual Studio i chcę mieć pewność, że to prawda.
Bryan
20

Moje rozwiązanie różni się nieco od powyższego. Zacząłem od ziarna Angular2 Quickstart zdefiniowanego tutaj: https://github.com/angular/quickstart#create-a-new-project-based-on-the-quickstart

A potem tylko zmienił następujące:

  • Dodano "outDir": "../dist"dotsconfig.json
  • Zmieniono baseDiratrybut wewnątrz bs-config.jsonna"baseDir": ["dist", "src"]

Wtedy npm run startdziała jak poprzednio (nawet html / css i inne pliki bez kopiowania), ale skompilowane .jsi .mappliki są wbudowane dist/appi nie zanieczyszczają twojego src/appkatalogu.

Pamiętaj, że nie testowałem jeszcze, jak to wpływa na testowanie.

NagyI
źródło
To najprostsze i najczystsze rozwiązanie
JeffG
to jest najlepszy!
Windchill,
To działa! Ale czy ktoś ma problemy jak ja, debugowanie aplikacji za pomocą Chrome DevTools? Otrzymuję pliki .ts puste.
Aquiles
fantastyczne rozwiązania. Naprawdę łatwe i bardzo czyste!
Cribber
17

Mogę się też spóźnić, ale zrobiłem to.

Najpierw zrób to , co powiedział Raheel Shan .

Następnie utwórz folder dist .

Po utworzeniu folderu przejdź do pliku tsconfig.jsoni dodaj to:

"outDir": "dist"

Wynikowy 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"
  ]
}

Jeśli teraz uruchomić npm starti zapisać plik powinien być widoczny przez cały skompilowany .jsi .map.jsw dist folderu.

Lirianer
źródło
8

Dzięki, Raheel Shan, twoja odpowiedź dała początek,

Jak @Adavo słusznie zapytał powyżej w komentarzach

Niestety, moich plików html / css nie ma w folderze dist. Jak to zrobić, aby skopiować cały html / css do folderu dist?

Odpowiedzią na to pytanie jest * podanie pełnej ścieżki do pliku HTML / CSS, używając znaku „/” (z katalogu głównego) we wszystkich plikach .ts, a głównie we właściwości „templateURL” @Component

po jakimś czasie - zrozumiałem - bez użycia Gulpa :) Yipppeee

Abdeali Chandanwala
źródło
Czy jest jakieś rozwiązanie, które każdy może zasugerować, aby to zrobić bez konieczności podawania pełnej ścieżki? ... najlepiej proste rozwiązanie, które nie wymaga całkowitego remontu działającego inaczej systemu kompilacji.
WillyC
Wydaje się, że nie jest to możliwe, możesz wypróbować angular-cli, aby lepiej zorganizować kod, ale ta pełna ścieżka do html jest również
wymagana
Znalazłem sposób! Zobacz odpowiedź, której udzieliłem poniżej. Wydaje mi się, że nie jest to idealne rozwiązanie, ale rozwiązuje problem za pomocą skryptów npm, bez grunt / gulp / angular-cli. Nie to, żebym miał coś przeciwko tym rozwiązaniom, ale po prostu nie chciałem ich teraz rozgryzać!
WillyC
Sprawdź moją odpowiedź to całkiem czysta zmiana z manipulowaniem modelem. Trochę stackoverflow.com/a/40694657/986160
Michail Michailidis
7

Niestety, moich plików html / css nie ma w folderze dist. Jak to zrobić, aby skopiować cały html / css do folderu dist?

Względne ścieżki w Angular 2 nie są takie proste, ponieważ framework chce być elastyczny w sposobie ładowania plików (CommonJs, SystemJs, ... itd.) Zgodnie z artykułem Component-Relative Paths in Angular 2 .

Jak wyjaśniono w artykule, module.idgdy jest używany z CommonJs (sprawdź plik tsconfig.json) zawiera bezwzględny katalog główny modułu i może być użyty do skonstruowania ścieżki względnej.

Więc lepszą alternatywą może być pozostawienie plików css / html z plikami ts i skonfigurowanie komponentu jak poniżej, zakładając, że masz tylko pliki kompilacji w oddzielnym folderze o nazwie dist .. W ten sposób twoje pliki css i html zostaną załadowane z nie ma problemu z używaniem ścieżek względnych poprzez konwersję wyprowadzonej ścieżki kompilacji na źródłową, która je zawiera - zasadniczo usuwając /dist/lub zmieniając jej nazwę na /src/;)

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

jeśli masz oddzielne foldery dla źródła i kompilacji, możesz to zrobić:

@Component({
   moduleId: module.id.replace("/dist/", "/src/"),
   templateUrl: 'relative-path-to-template/component.html',
...
});
Michail Michailidis
źródło
2
chociaż jest to dobre obejście ... nadal główny problem z pobieraniem wszystkich naszych plików projektu z naszego projektu zależy od dwóch różnych folderów ... czy istnieje sposób na wdrożenie naszego kodu z jednego folderu do przeglądarki. Z góry
dziękuję
nawet w przypadku modułów node_modules uruchomiłeś skrypt kompilacji. Każdy z modułów node_modules zwykle ma źródłowe pliki js i min.js. Więc nie rozumiem, dlaczego wdrożenie kodu źródłowego, a następnie uruchomienie skryptu kompilacji, aby pobrać zależności node_module i skompilować maszynopis, który utworzy folder dist, jest problemem. Oczywiście możesz skonfigurować pakiet WebPack lub podobne procesy, aby wykonać pakietowanie w inny sposób.
Michail Michailidis
7

Aby rozwiązać ten problem:

Niestety, moich plików html / css nie ma w folderze dist. Jak to zrobić, aby skopiować cały html / css do folderu dist?

Wykonaj kroki w odpowiedziach @raheel shan i @ Lirianer. ... wtedy możesz to zakończyć tym.

Rozwiązałem to dla moich celów za pomocą skryptów npm. Poniżej znajduje się sekcja skryptów w moim pliku package.json. Rozwiązaniem jest uruchomienie onchnage(pakietu npm - npm install --save onchange) jednocześnie z tscserwerem. Następnie użyj rsync, aby skopiować zasoby, które chcesz przenieść:

"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/"
}

Dla tych z Was, którzy korzystają z systemu Windows, można uzyskać rsyncza pośrednictwem Cygwinlub z pakietami rozwiązań, takich jak cwRsync .

WillyC
źródło
... chociaż używam buildfolderu, a nie distfolderu, ale masz pomysł.
WillyC
1
Przepraszamy za głos przeciw, ale naprawdę musisz dodać, skąd onchangepochodzi. Powinieneś także napisać notatkę, że ta rata działa tylko dla powłok typu unix. Może nie stanowi to większego problemu dla większości ludzi, ale ostatnio natknąłem się na wielu programistów (zmuszonych) używających okien.
jhohlfeld
OK - dodałem wyjaśnienie, skąd się onchangebierze i informacje, jak zdobyć rsyncWindows. Daj mi znać, jeśli to rozwiązuje Twoje problemy.
WillyC
5

Wypróbowałem sugestię @WillyC i zadziałałem jak marzenie, po prostu zwróć uwagę, że będziesz musiał dodać onchangezależność do swojego package.jsonpliku. Dodałem tylko trochę dodatkowych skryptów, aby mieć czystą konfigurację przy pierwszym uruchomieniu, a także aby usunąć pozostałe pliki html / css (byłoby miło, gdyby to samo można było zrobić dla TSC)

W każdym razie tutaj jest sekcja mojego package.jsonpliku

{
  ...
  "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"
  }
}

W przypadku rsyncusuwania zwróć uwagę na --deleteflagę w rsyncpoleceniu watchassetsskryptu

AlphaZygma
źródło
3

Pliki Angular2 TypeScript i pliki JavaScript w innym folderze

Oto moja konfiguracja dla Angular 2 w najnowszej wersji V2.1.1 i działa bardzo dobrze!

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);

wprowadź opis obrazu tutaj

xgqfrms
źródło
1
To nie zadziałało, dopóki nie zmieniłem tej linii na:main: './dist/app/main.js',
RichC
Ten post i komentarz + stackoverflow.com/a/40694657/5393271 załatwią sprawę. Jeśli masz różne foldery w aplikacji z usługami lub komponentami, takimi jak app / components / mycomp.components.ts; app / services / myservice.service.ts automatycznie utworzy te foldery w dist po wykonaniu npm start (building)
sTx
możesz też to zrobić: w system.js.configat - map{app:"dist",..}potem w packages{app{main:"app/main.js"}}} i w tsconfig.json- "outDir": "dist"+ źródło html / css
sTx
3

Zainspirowany @Nagyl, wypracowałem swój własny sposób i uważam, że warto się nim podzielić:

1) Zainstaluj cpx

npm install cpx

2) Zaktualizuj bs-config.json i zmień baseDir z „src” na „dist”

"baseDir":"dist"

3) Zaktualizuj tsconfig.json i dodaj outDir na końcu kompilatora Opcje:

"outDir": "../dist"

4) Zaktualizuj package.json: 4.1) dodaj nowe polecenie do końca skryptów:

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

4.2) zmodyfikuj wiersz „start”, aby zawierał polecenie „cpx”:

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

Krok 2 modyfikacja

Krok 3 modyfikacja

Krok 4 modyfikacja

Windchill
źródło
2

Możesz transpilować .tspliki w przeglądarce, tak jak robi to Plunker w swoim szablonie kątowym 2 ts.

Po prostu uruchom edytor, wybierz nowy, następnie AngularJS i opcję 2.0.x (TS) (na samym dole). Ale cały sens używania webpacka (lub dowolnego innego narzędzia do sprzedaży wiązanej) polega na lokalnej transpozycji plików.

Eggy
źródło
2

Wypróbowałem kilka z wyżej wymienionych opcji i ostatecznie zdecydowałem się na: Peep - rozszerzenie dla Visual Studio Code.

Jak zainstalować:

  • Widok -> Rozszerzenia
  • Ćwierkanie
  • zainstalować
  • Przeładować
  • Widok -> Paleta poleceń
  • Peep None
  • zmodyfikuj plik .vscode / settings.json zgodnie z wymaganiami (moje pokazane poniżej)

-

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

25.01.2017 - aktualizacje: angular -cli po wyjęciu z pudełka, dba o to. i prace instalacyjne i teraz.

Anand Rockzz
źródło
2

Wypróbowałem wymienione tutaj rozwiązania. Są dobre, ale nie są dla mnie idealne. Chcę prostego rozwiązania. Nie chcę na stałe zakodować informacji o ścieżce we wszystkich moich plikach składowych. Nie chcę instalować więcej pakietów npm, aby się tym zająć.

Więc wymyślam najłatwiejszą alternatywę. To nie jest bezpośrednia odpowiedź na to pytanie, ale dla mnie działa bardzo dobrze.

Po prostu poprawiam ustawienia mojego obszaru roboczego, tak aby jspliki w/app nie były wyświetlane. Nadal tam są. Są po prostu ukryte w moim obszarze roboczym. Dla mnie to wystarczy.

Używam Sublime Text, więc oto, co mam dla ustawień mojego projektu:

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

Jestem pewien, że wiele innych edytorów ma podobne funkcje.

AKTUALIZACJA:

Po prostu użyj Angular CLI. Wszystko odbywa się automatycznie.

Shawn
źródło
2

W przypadku Angular 4 z plikami z przewodnika Szybki start musiałem tylko wykonać następujące czynności (kombinacja wcześniej podanych odpowiedzi, ale nieco inne wartości):

  • W tsconfig.json (dodaj): "outDir": "../dist"
  • W bs-config.json (zmień): "baseDir": ["dist", "src"],
  • W bs-config.e2e.json (zmień): "baseDir": ["dist", "src"],

Bez zmian w systemjs.config.js.

M. Neuweiler
źródło
1

Wypróbowałem sugestię @raheel i zadziałało to dla mnie. Zmodyfikowałem konstrukcję zgodnie z moimi potrzebami.

Używam następującej struktury

Używam następującej struktury

Aby to uzyskać, zmodyfikowałem tylko dwa pliki 1. systemjs.config.js i 2.tsconfig.json

W systemjs.config.js zmieniłem na

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

systemjs.config.js

iw tsconfig.json muszę dodać "outDir": "app/js"

tsconfig.json

Sanjoy Kanrar
źródło
Robię to samo co ty maintion ale po pliku .js rozpocząć NPM nie tworzyć w app / js Folder
Priyanka Ahire
1

Pracuję z Angular 2.4. Potrzebowałem dodatkowego kroku, aby to zadziałało. To było odniesienie do aktualizacji systemJs do pliku main.js w index.html pochodzi z:

System.import ('main.js'). Catch (function (błąd) {console.error (błąd);});

do:

System.import ('dist / main.js'). Catch (function (błąd) {console.error (błąd);});

Eugenio
źródło
0

Dodając do tego, co powiedział Raheel Shan. Musiałem dokonać dodatkowej zmiany w pliku index.html, aby teraz zaimportować poprawny plik javascript.

Oto podsumowanie z mojej strony.

tsconfig.json

Przed

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

Po:

{
  "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

Przed:

'app': 'app',

Po:

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

index.html

Przed:

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

Po:

System.import('dist/main.js').catch(function(err){ console.error(err); });
Tanmay
źródło