Quelle est la meilleure méthode pour intégrer Angular (version 2, 4, 6, ...) en production sur un serveur web.
Merci d'indiquer la version d'Angular dans vos réponses afin que nous puissions mieux suivre les évolutions des versions ultérieures.
Quelle est la meilleure méthode pour intégrer Angular (version 2, 4, 6, ...) en production sur un serveur web.
Merci d'indiquer la version d'Angular dans vos réponses afin que nous puissions mieux suivre les évolutions des versions ultérieures.
2 to 14
(TypeScript) avec Angular CLInpm install -g @angular/cli
ng new projectFolder
crée une nouvelle applicationng build
(exécuté en ligne de commande lorsque le répertoire est projectFolder
).
drapeau prod
pour la production est maintenant la valeur par défaut (voir la section Documentation Angular pour le personnaliser si nécessaire).
Compresser en utilisant Compression du brotli les ressources à l'aide de la commande suivante
for i in dist/*/*; do brotli $i; done
sont générés par défaut vers projectFolder/dist(/$projectFolder
pour v6+) **
Dimensions avec Angular 14.0.2
avec CLI 14.0.2
et option CSS sans routage Angular
dist/main.[hash].js
Votre application regroupée [ size : 118 KB for new Angular CLI application empty, 36 KB comprimé].dist/polyfill-[es-version].[hash].bundle.js
les dépendances polyfill (@angular, RxJS...) regroupées [ size : 34 KB for new Angular CLI application empty, 11 KB comprimé].dist/index.html
point d'entrée de votre application.dist/runtime.[hash].bundle.js
chargeur webpackdist/style.[hash].bundle.css
les définitions de styledist/assets
copiées à partir de la configuration des ressources Angular CLIVous pouvez obtenir un aperçu de votre application à l'aide de l'outil ng serve --prod
qui démarre un serveur HTTP local de sorte que l'application contenant les fichiers de production soit accessible à l'aide de http://localhost:4200. Il n'est pas sûr de l'utiliser en production.
Pour une utilisation en production, vous devez déployer tous les fichiers du répertoire dist
dans le serveur HTTP de votre choix.
J'ai obtenu l'erreur suivante en exécutant npm install -g angular-cli@webpack : npm ERR ! Veuillez inclure le fichier suivant dans toute demande d'assistance : .... \npm -debug.log. Savez-vous ce qui se passe ?
@Chong Si vous êtes sous Windows, il faut désactiver l'anti virus lors de l'installation sinon je ne peux pas vous renseigner sans détails sur l'erreur.
L'installation de angular-cli@webpack n'a pas fonctionné pour moi, mais npm install angular-cli@1.0.0-beta.15
fait l'affaire. Cependant, j'ai dû appliquer ce correctif pour corriger le problème "TypeError : path must be a string or Buffer" décrit dans numéro 2135
2.0.1 Final
en utilisant Gulp (TypeScript - Cible : ES5)npm install
(à exécuter dans cmd lorsque le répertoire est projectFolder)npm run bundle
(à exécuter dans cmd lorsque le répertoire est projectFolder)
sont générés pour projectFolder / bundles /
bundles/dependencies.bundle.js
[ taille : ~ 1 MB (le plus petit possible) ]
bundles/app.bundle.js
[ taille : dépend de votre projet Le mien est ~ 0.5 MB ]
projectFolder / app / (tous les composants, directives, modèles, etc.)
projectFolder / gulpfile.js
var gulp = require('gulp'), tsc = require('gulp-typescript'), Builder = require('systemjs-builder'), inlineNg2Template = require('gulp-inline-ng2-template');
gulp.task('bundle', ['bundle-app', 'bundle-dependencies'], function(){});
gulp.task('inline-templates', function () { return gulp.src('app/*/.ts') .pipe(inlineNg2Template({ useRelativePaths: true, indent: 0, removeLineBreaks: true})) .pipe(tsc({ "target": "ES5", "module": "system", "moduleResolution": "node", "sourceMap": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "removeComments": true, "noImplicitAny": false })) .pipe(gulp.dest('dist/app')); });
gulp.task('bundle-app', ['inline-templates'], function() { // optional constructor options // sets the baseURL and loads the configuration file var builder = new Builder('', 'dist-systemjs.config.js');
return builder .bundle('dist/app//* - [@angular/*/.js] - [rxjs//*.js]', 'bundles/app.bundle.js', { minify: true}) .then(function() { console.log('Build complete'); }) .catch(function(err) { console.log('Build error'); console.log(err); }); });
gulp.task('bundle-dependencies', ['inline-templates'], function() { // optional constructor options // sets the baseURL and loads the configuration file var builder = new Builder('', 'dist-systemjs.config.js');
return builder .bundle('dist/app/*/.js - [dist/app/*/.js]', 'bundles/dependencies.bundle.js', { minify: true}) .then(function() { console.log('Build complete'); }) .catch(function(err) { console.log('Build error'); console.log(err); }); });
projectFolder / package.json (idem Guide de démarrage rapide (seulement les devDependencies et npm-scripts requis pour le bundle)
{ "name": "angular2-quickstart", "version": "1.0.0", "scripts": {
"gulp": "gulp",
"rimraf": "rimraf",
"bundle": "gulp bundle",
"postbundle": "rimraf dist"
}, "license": "ISC", "dependencies": {
}, "devDependencies": { "rimraf": "^2.5.2", "gulp": "^3.9.1", "gulp-typescript": "2.13.6", "gulp-inline-ng2-template": "2.0.1", "systemjs-builder": "^0.15.16" } }
projectFolder / systemjs.config.js (idem Guide de démarrage rapide , n'est plus disponible sur ce site)
(function(global) {
// map tells the System loader where to look for things var map = { 'app': 'app', 'rxjs': 'node_modules/rxjs', 'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api', '@angular': 'node_modules/@angular' };
// packages tells the System loader how to load when no filename and/or no extension var packages = { 'app': { main: 'app/boot.js', defaultExtension: 'js' }, 'rxjs': { defaultExtension: 'js' }, 'angular2-in-memory-web-api': { defaultExtension: 'js' } };
var packageNames = [ '@angular/common', '@angular/compiler', '@angular/core', '@angular/forms', '@angular/http', '@angular/platform-browser', '@angular/platform-browser-dynamic', '@angular/router', '@angular/router-deprecated', '@angular/testing', '@angular/upgrade', ];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' } packageNames.forEach(function(pkgName) { packages[pkgName] = { main: 'index.js', defaultExtension: 'js' }; });
var config = { map: map, packages: packages };
// filterSystemConfig - index.asp's chance to modify config before we register it. if (global.filterSystemConfig) { global.filterSystemConfig(config); }
System.config(config);
})(this);
projetcFolder / dist-systemjs.config.js (je viens de montrer la différence avec systemjs.config.json)
var map = { 'app': 'dist/app', };
projectFolder / index.html (production) - _L'ordre des balises script est essentiel. En plaçant les balises dist-systemjs.config.js
après les balises du bundle permettrait toujours au programme de s'exécuter, mais le bundle de dépendances serait ignoré et les dépendances seraient chargées à partir de la balise node_modules
dossier._
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <base href="http://stackoverflow.com/"/> <title>Angular</title> <link rel="stylesheet" type="text/css" href="style.css"/> </head> <body>
<my-app> loading... </my-app>
<!-- Polyfill(s) for older browsers --> <script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.min.js"></script> <script src="node_modules/reflect-metadata/Reflect.js"></script> <script src="node_modules/systemjs/dist/system.js"></script>
<script src="dist-systemjs.config.js"></script> <!-- Project Bundles. Note that these have to be loaded AFTER the systemjs.config script --> <script src="bundles/dependencies.bundle.js"></script> <script src="bundles/app.bundle.js"></script>
<script> System.import('app/boot').catch(function (err) { console.error(err); }); </script> </body> </html>
projectFolder / app / boot.ts est l'endroit où se trouve le point d'ancrage.
Le meilleur que j'ai pu faire jusqu'à présent :)
Bonjour, le gulp script crée les bundles, mais je ne sais pas ce qu'il faut mettre dans le fichier boot.ts ? Tous les fichiers ne sont-ils pas maintenant dans le bundle ? Doit-on exécuter le bundle ?
System.import('app/boot')
dans index.html est pour SystemJS, c'est le point de départ de votre application, il est chargé à partir du bundle, vous n'avez pas besoin de boot.ts
après la liasse
Huh, je suppose que je dois réessayer. J'ai essayé de passer à builder.buildStatic et j'ai eu des erreurs de rxjs sur le fait qu'il n'était pas chargé en tant que module commonjs ou amd. Je vais réessayer de suivre votre suggestion
L'équipe d'Angular2 a publié un tutoriel pour l'utilisation de Webpack
J'ai créé et placé les fichiers du tutoriel dans un petit fichier Projet d'amorçage GitHub . Vous pouvez ainsi essayer rapidement le flux de travail.
Instructions :
npm install
npm start . Pour le développement. Cela créera un dossier "dist" virtuel qui sera chargé à l'adresse de votre hôte local.
npm run build . Pour la production. "Cela créera une version physique du dossier "dist" qui pourra être envoyée à un serveur web. Le dossier "dist" pèse 7,8 Mo, mais seulement 234 Ko sont nécessaires pour charger la page dans un navigateur web.
Le présent Kit de démarrage Webpack offre des fonctionnalités de test plus poussées que le tutoriel ci-dessus et semble assez populaire.
Bonjour, est-il possible de mettre à jour le projet de base avec angular 2.1.0 ? Le tutoriel utilise angular 2.1.0 maintenant. Je l'ai suivi et je n'ai pas réussi à le faire fonctionner. L'erreur est http 404 - can't find app.component.html.
J'ai mis à jour vers angular 2.1.0 sans problème. app.component.html est appelé depuis app.component.ts (templateUrl : './app.component.html'). vous avez les deux fichiers dans le même dossier app ?
Le tree-shaking, la minification et le gzipping permettent de réduire considérablement la taille des fichiers lors de la production. Voici un excellent article avec des exemples, blog.mgechev.com/2016/06/26/
Angular.io a un tutoriel de démarrage rapide. J'ai copié ce tutoriel et l'ai étendu avec quelques tâches gulp simples pour tout regrouper dans un dossier dist qui peut être copié sur le serveur et fonctionner comme ça. J'ai essayé d'optimiser le tout pour qu'il fonctionne bien sur Jenkis CI, ainsi les node_modules peuvent être mis en cache et n'ont pas besoin d'être copiés.
Code source et exemple d'application sur Github : https://github.com/Anjmao/angular2-production-workflow
Étapes de la production
Nœud : Bien que vous puissiez toujours créer votre propre processus de construction, je recommande fortement d'utiliser angular-cli, car il a tous les flux de travail nécessaires et fonctionne parfaitement maintenant. Nous l'utilisons déjà en production et n'avons aucun problème avec angular-cli.
Il soutient :
ng new project-name --routing
Vous pouvez ajouter --style=scss
pour le support de SASS .scss.
Vous pouvez ajouter --ng4
pour l'utilisation d'Angular 4 au lieu d'Angular 2.
Après avoir créé le projet, l'interface de programmation exécute automatiquement les commandes suivantes npm install
pour vous. Si vous voulez utiliser Yarn à la place, ou si vous voulez simplement voir le squelette du projet sans l'installer, Pour savoir comment procéder, cliquez ici .
Dans le dossier du projet :
ng build -prod
Dans la version actuelle, vous devez spécifier --aot
manuellement, car il peut être utilisé en mode développement (bien que cela ne soit pas pratique en raison de la lenteur).
Cela permet également d'effectuer une compilation AoT pour des paquets encore plus petits (pas de compilateur Angular, mais une sortie de compilateur générée). Les bundles sont beaucoup plus petits avec AoT si vous utilisez Angular 4 car le code généré est plus petit.
Vous pouvez tester votre application avec AoT en mode développement (cartes de sources, pas de minification) et AoT en lançant ng build --aot
.
Le répertoire de sortie par défaut est ./dist
bien qu'il puisse être modifié dans ./angular-cli.json
.
Le résultat de l'étape de construction est le suivant :
(Note : <content-hash>
se réfère au hash / empreinte digitale du contenu du fichier qui est censé être un moyen de briser le cache, ce qui est possible puisque Webpack écrit le fichier script
par elle-même)
./dist/assets
./src/assets/**
./dist/index.html
./src/index.html
après avoir ajouté webpack scripts à celui-ci./angular-cli.json
./dist/inline.js
./dist/main.<content-hash>.bundle.js
./dist/styles.<content-hash>.bundle.js
Dans les versions antérieures, il créait également des versions gzippées pour vérifier leur taille, et .map
mais ce n'est plus le cas car les gens demandaient à ce qu'ils soient supprimés.
Dans d'autres cas, vous pouvez trouver d'autres fichiers/dossiers indésirables :
./out-tsc/
./src/tsconfig.json
's outDir
./out-tsc-e2e/
./e2e/tsconfig.json
's outDir
./dist/ngfactory/
Est-il possible de séparer les librairies angulaires et leurs dépendances de mon application ?
Je n'utilise pas l'interface de commande, ce qui est nécessaire pour que l'ébranlement des arbres fonctionne. Il s'agit de supprimer tous les modules Angular EcmaScript qui ne sont pas utilisés dans votre application. Il y a un plan pour désactiver cela en mode dev pour la vitesse (ils appellent les bibliothèques chargées telles quelles "DLL"), mais aucun plan pour séparer dans le résultat final. Cela devrait être réalisable si vous déployez vos propres trucs Webpack sans le CLI.
Comment vérifier mon application en utilisant le dossier dist. Comment puis-je héberger mon application sur mon serveur web ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Pour l'instant (rc1). Voici quelques solutions stackoverflow.com/questions/37324511/how-to-bundle-angular2-rc1-with-systemjs
0 votes
Et celui-ci stackoverflow.com/questions/37098942/
0 votes
Rc3 propose désormais une version de fichiers groupés qui réduit le nombre de demandes de plus de 300 à environ 40.
2 votes
Je déteste aussi les WebPack et les étapes de construction en général. C'est un peu exagéré pour un simple site web. C'est pourquoi j'ai créé ceci : github.com/schungx/angular2-bundle
0 votes
Merci Stephen. Il s'agit d'une solution simple pour les vendeurs. J'espère que cette solution sera officiellement proposée et mise à jour. Je suppose que vous utilisez quelque chose comme Gulp pour les fichiers du projet ?
0 votes
En tout cas, moins technique que Gulp... goutte de sueur Mes projets sont pour la plupart des projets TypeScript et je configure le compilateur TypeScript pour qu'il fusionne tous mes modules en un seul fichier script. Une sorte de "Gulp du pauvre". Il existe un paramètre pour cela.
0 votes
@StephenChung Cette offre groupée fonctionnerait-elle sur Plunker ?
0 votes
@AakashThakur Aucune idée ! ( goutte de sueur )