/ Align = "left" / js z Angular CLI w środowisku dev

Znalazłem świetny tutorial, który wyjaśnia, jak skonfigurować express.js z Angular CLI, ale w tym tutorialu aplikacja angular jest skompilowana do folderu dist produkcji: https://scotch.io/tutorials/mean-app-with-angular-2-and-the-angular-cli

Jak zintegrować express.js z Angular CLI, ale chcę ekspres.js do pracy z wersją rozwojową aplikacji Angular i chcę, aby nodemon ponownie się uruchomił, jeśli wprowadzę zmiany w express lub angular app.

Spędziłem ponad osiem godzin próbując to uruchomić. Dzięki!

Nie chcę uruchamiać 'ng build' za każdym razem, gdy wprowadzam zmianę w aplikacji Angular (trwa to zbyt długo) - chcę natychmiastowego przeładowania za każdym razem, gdy zapisuję zmianę w mojej aplikacji angular (tak, jakbym uruchamiał 'ng serve') lub express app.

Znalazłem tutorial, w którym podłączasz Angular 2 QuickStart z Expressem, działa, ale szukam Angular CLI.

Rozumiem, że kątowe CLI wykorzystuje WebPack natomiast QuickStart korzysta z systemu.js

Author: Graham, 2017-03-20

7 answers

NOWA ODPOWIEDŹ

Moje doświadczenie 15 godzin nauczyło mnie, że próba serwowania aplikacji kątowej z Express podczas rozwoju nie jest dobrym pomysłem. Właściwym sposobem jest uruchomienie Angular i Express jako dwóch różnych aplikacji na dwóch różnych portach. Angular będzie obsługiwany na porcie 4200 I Express na porcie 3000 jak zwykle. Następnie skonfiguruj serwer proxy dla połączeń API do aplikacji Express.

Dodaj proxy.config.json to root of Angular project:

{
  "/api/*":{
    "target":"http://localhost:3000",
    "secure":false,
    "logLevel":"debug"
  }
}

Otwórz nową kartę terminal i uruchom to polecenie do uruchomienia aplikacji Express:

nodemon [YOUR_EXPRESS_APP.js] --watch server

(YOUR_EXPRESS_APP.js jest zwykle nazywany server.js lub app.js. serwer jest katalogiem, w którym przechowujesz wszystkie pliki aplikacji Express)

Otwórz drugą kartę terminal i uruchom to polecenie, aby uruchomić aplikację Angular:

ng serve --proxy-config proxy.config.json

Zapewni to przebudowę aplikacji Angular i przeładowanie przeglądarki po zmianie dowolnego pliku aplikacji Angular. Podobnie Serwer Express Server zostanie ponownie uruchomiony po wprowadzeniu zmiany w dowolnej aplikacji Express pliki.

Twoja aplikacja Angular jest tutaj: http://localhost:4200/

Obejrzyj ten film, aby zobaczyć, jak skonfigurować serwer proxy dla połączeń API za pomocą Angular CLI

Uwaga: Ta konfiguracja dotyczy tylko środowiska programistycznego. W trakcie produkcji będziesz chciał uruchomić ng build i umieścić aplikację Angular w katalogu dist, który będzie obsługiwany przez Express. W produkcji działa tylko jedna aplikacja-ekspresowa aplikacja obsługująca Twoją aplikację Angular.

Poprzedni ODPOWIEDŹ

Używając wejścia od @echonax wymyśliłem takie rozwiązanie, które jest dość szybkie:

    W tym artykule omówimy, w jaki sposób można uzyskać więcej informacji na ten temat.]}
  • Uruchom to w terminalu:

ng build -w & nodemon server.js --watch dist --watch server

Spowoduje to przebudowę aplikacji Angular do folderu dist, a serwer węzła będzie się restartował za każdym razem, gdy to nastąpi. Jednak nie ma automatycznego odświeżania przeglądarki z tą konfiguracją: (

Więcej na ten temat tutaj:

Https://github.com/jprichardson/reload

 92
Author: etayluz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 17:01:23

"rozwiązanie etayluz" jest bardzo dobre. Ale chcę dodać dodatkową opcję dla NEW ANSWER , aby nie otwierać dwa razy terminala.

Najpierw musisz zainstalować pakiet ( https://www.npmjs.com/package/concurrently);

npm install concurrently --save 

Następnie możesz dodać poniższe kody do swojej paczki.plik json.

"start": "concurrently \"npm run serve-api\" \"npm run serve\"",
"serve": "ng serve --port 3333 --proxy-config proxy.config.json", // You could add --port for changing port
"serve-api": "nodemon [YOUR_EXPRESS_APP.js] --watch server",

npm start wystarczy do prowadzenia projektu.

 15
Author: yusuf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-17 22:06:03

Używając angular-cli, polecenie ng build lub ng build --prod da ci spakowane pliki wraz z index.html. Upewnij się, że app.js (node / express) jest skierowany do tego pliku.

Przykład:

app.use( express.static(__dirname + '/src' ) ); //<- it will automatically search for index.html under src folder.
 5
Author: eko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 04:51:51

Dłuższe Wyjaśnienie

Spędziłem sporo czasu, zastanawiając się, jak to zrobić we własnym środowisku programistycznym. Najlepsze, co wymyśliłem, to Podwójna implementacja, która łączy wiele rozwiązań echonax, squirrelsareducka i Maxa, ale korzystając z wbudowanych strategii kątowych CLI do oglądania zmian frontend/Angular i używając nodemona do oglądania zmian backend/Express. Krótko mówiąc, w końcu uruchamiasz dwa procesy (ng build i nodemon), aby uzyskać twoje środowisko programistyczne działa, ale automatycznie przebudowuje i uruchamia wszystko pod jednym ekspresowym serwerem WWW.

Pierwszym procesem, który będziesz musiał uruchomić będzie zbudowanie folderu Angular dist i obserwowanie wszelkich zmian wprowadzonych do nakładki Angular. Na szczęście dla nas, Angular CLI może to zrobić natywnie (testowane na Angular CLI >= 1.5) za pomocą następującego polecenia:

ng build --watch

Musisz zostawić to uruchomione w tle, ale to będzie obserwować wszelkie zmiany wykonane w kodzie kątowym i odbudować wiązki w locie.

Drugi proces wymaga użycia nodemona do uruchomienia serwera Express i może wymagać nieco więcej konfiguracji i planowania w zależności od tego, jak obszerna jest konfiguracja backendu / Express. Upewnij się tylko, że Express wskazuje na Twój plik indeksu w folderze dist. Dużą zaletą jest to, że możesz dodać to wszystko do pliku Gulpfile za pomocą gulp-nodemon, aby wykonać jeszcze więcej sekwencyjnych zadań po uruchomieniu nodemona, aby obejrzeć backend / Express, takie jak linting backend, Uruchamianie testów równolegle do kompilacji, minifying backend, lub cokolwiek innego, co możesz wymyślić, aby użyć Gulp. Użyj npm lub Yarn aby dodać i zainstalować nodemona do zależności twojego projektu, a następnie uruchom następujący Serwer Express:

nodemon app.js

Zastąp app.js z dowolnym plikiem używanym do budowania Twojego expresowego backendu i powinien teraz odbudowywać się, gdy tylko zostaną wprowadzone zmiany Twój backend.

Tldr;

Uruchom dwa oddzielne procesy w tle, aby uruchomić środowisko programistyczne. Pierwszy bieg:

ng build --watch

Po Drugie, dodaj nodemon do zależności projektu i uruchom następujące polecenie w tle gdzie Aplikacja.js jest zastępowany przez dowolny plik Express:

nodemon app.js

Bonus

Ponieważ zapytałeś, jak automatycznie przeładować przeglądarkę, najlepszym rozwiązaniem będzie skorzystanie z wtyczki przeglądarki o nazwie Wątroba. Ponieważ będziemy już używać nodemona do oglądania naszego backendu, możesz poważnie rozważyć użycie Gulp, jeśli nie masz jeszcze do uruchomienia zarówno nodemon, jak i LiveReload jako dwóch zadań. Najlepszym rozwiązaniem dla wdrożenia LiveReload do Gulp jest użycie wtyczki gulp-refresh, ponieważ jest to zaktualizowana wersja wtyczki gulp-livereload. W końcu znajdziesz coś podobnego do tego:

const defaultAssets = require('./config/assets/default'),
  gulp = require('gulp'),
  gulpLoadPlugins = require('gulp-load-plugins'),
  runSequence = require('run-sequence'),
  plugins = gulpLoadPlugins(),
  semver = require('semver');
  
// I store the locations of my backend js files in a config file, so 
// that I can call them later on. ie; defaultAssets
gulp.task('nodemon', function () {
  // Node.js v7 and newer use different debug argument
  const debugArgument = semver.satisfies(process.versions.node, '>=7.0.0') ? '--inspect' : '--debug';

  return plugins.nodemon({
    script: 'app.js',
    nodeArgs: [debugArgument],
    ext: 'js,html',
    verbose: true,
    watch: defaultAssets.server.allJS
  });
});

// Watch Files For Changes
gulp.task('watch', function () {
  // Start LiveReload
  plugins.refresh.listen();

  // Watch backend for changes
  gulp.watch(defaultAssets.server.allJS).on('change', plugins.refresh.changed);
  // Watch frontend dist folder for changes
  gulp.watch('./dist').on('change', plugins.refresh.changed);
});
  
  
gulp.task('default', function (done) {
  runSequence(['nodemon', 'watch'], done);
});

Teraz wystarczy uruchomić gulp polecenie zamiast nodemon app.js aby uruchomić serwer Express.

 2
Author: Clark Brent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 00:40:42

Też się nad tym zastanawiałem. Kurs Udemy na stosie MEAN autorstwa Maxa Schwarzmüllera zawiera przykładowy kod do integracji Express i Angular. W pakiecie tego przykładowego kodu.plik json, use używa skryptów.zbuduj właściwość, aby dać webpack polecenie, które obserwuje pliki kątowe i odpowiednio aktualizuje. Nie chcę tu kopiować jego kodu, ale o to chodzi. Reszta będzie wymagała odkrycia.

W pliku readme sugeruje uruchomienie npm run build, który uruchamia webpack, a następnie w nowym terminalu uruchamiającym npm start dla serwera węzła. Więc teoretycznie, to uruchamia dwa programy, jak zasugerowałeś w swojej wersji odpowiedzi. Ale robi to bardziej "skryptowy" / predefiniowany sposób uruchamiania procesu Angular build, zamiast nawigować do podkatalogu Angular i wpisywać tam ng build --watch i uruchamiać aplikację Express osobno.

 1
Author: squirrelsareduck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 15:28:41

Być może możesz dodać zależność o nazwie 'równocześnie', lub (npm-run-all, parallelshell ).

npm i concurrently --save-dev

Następnie Edytuj pakiet.json like this: `

"scripts": {
        "dev": "concurrently \"ng build -w\"  \"cross-env NODE_ENV=development node .\" "
    }

` to może być praca.

Bibliografia:

przykład: https://stackoverflow.com/a/30950298/7421101 ,

Npm-run-all przykład: https://stackoverflow.com/a/38213212/7421101 ,

Parallelshell przykład: https://stackoverflow.com/a/42373547/7421101 .

 0
Author: jackchen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 10:36:31

A proxy.conf.json plik w katalogu src o kodzie-

{
  "/api/*": {
    "target": "http://localhost:3000",
    "secure": false,
    "logLevel": "debug",
    "changeOrigin": true
  }
}

I edytując package.json dodając do niego te 3 wpisy - (zastąp z powrotem.js z Twoim plikiem express, który znajduje się w katalogu głównym projektu Angular)

"scripts": {
    "client": "ng serve",
    "server": "nodemon back.js",
    "start": "npm-run-all -p client server"
  }

Teraz uruchomienie npm start spowoduje uruchomienie zarówno Angular, jak i Express W tym samym czasie w środowisku deweloperskim.

 0
Author: Vibhor Dube,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-17 04:49:49