Dans mon application AngularJS, j'ai de nombreux fichiers js de contrôleurs.
Ces contrôleurs (one.ctrl.js
, two.ctrl.js
, ...
) doit être inclus dans mon index.html
fichier.
Structure du répertoire:
app/
js/
controllers/
one.ctrl.js
two.ctrl.js
Actuellement, les fichiers js
ci-dessus sont inclus dans index.html
fichier comme suit.
index.html:
<!-- other html components -->
<script src="js/controllers/one.ctrl.js"/>
<script src="js/controllers/two.ctrl.js"/>
</body>
</html>
Il va y avoir plus de *.ctrl.js
fichiers qui doivent être inclus dans index.html
.
J'ai besoin d'un moyen d'inclure automatiquement tous les *.ctrl.js
fichiers du répertoire controllers
vers index.html
.
Constatations:
De certaines SO questions,
Charger des fichiers JavaScript et CSS dans des dossiers dans AngularJS
Comment puis-je inclure tous les fichiers JavaScript dans un répertoire via un fichier JavaScript?
J'ai constaté que cela ne peut pas être fait automatiquement et nécessite des outils de script ou de génération côté serveur.
Ma question:
Actuellement, j'utilise yeoman
qui inclut grunt
pour l'outil de construction. Donc, ma question est, comment ces fichiers javascript dans un répertoire peuvent-ils être automatiquement inclus dans un fichier html?
Vous pouvez utiliser le plugin grunt-include-source
En l'utilisant, vous pouvez définir des modèles comme ceux-ci:
html: {
js: '<script src="{filePath}"></script>',
css: '<link rel="stylesheet" type="text/css" href="{filePath}" />',
}
dans votre fichier html qui sera développé pour inclure tous vos fichiers source js et css présents dans votre emplacement source qui peuvent être configurés dans la tâche grunt
Répondre à la question générale de l'ajout de fichiers sources à index.html à la demande et automatiquement et élaborer sur l'utilisation de grunt-include-source .
C'est pour la structure de dossiers suivante:
MyProject
|
+-- index.js
+-- Gruntfile.js
+-- package.json
+-- //other files
|
+--+ app
+-- //app files (.html,.js,.css,.*)
Installez avec npm i -D grunt-include-source grunt-contrib-watch
.
Dans votre Gruntfile.js
, Ajoutez grunt.loadNpmTasks('grunt-include-source');
Ensuite, vous devez ajouter un tas de tâches à votre Gruntfile.js
, Après quoi cela devrait ressembler à ceci:
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
//...
watch: {
//...
includeSource: {
// Watch for added and deleted scripts to update index.html
files: ['app/**/*.js','app/**/*.css'],
tasks: ['includeSource'],
options: {
event: ['added', 'deleted']
}
}
},
includeSource: {
options: {
//This is the directory inside which grunt-include-source will be looking for files
basePath: 'app'
},
app: {
files: {
//Overwriting index.html
'app/index.html': 'app/index.html'
}
}
}
});
//...
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-include-source');
//...
//Include sources, run the server, open the browser, and watch.
grunt.registerTask('default', ['includeSource', 'watch']);
};
Dans votre index.html
, Ajoutez ceci ( le chemin du fichier regarde ici à l'intérieur du chemin de base défini dans Gruntfile.js
):
<!-- include: "type": "css", "files": "**/*.css" -->
<!-- /include -->
<!-- include: "type": "js", "files": "**/*.js" -->
<!-- /include -->
Enfin, sur la ligne de commande:
grunt
Cela devrait démarrer toutes les tâches dans l'ordre, et votre index.html devrait être mis à jour en conséquence lorsqu'un JS ou CSS est ajouté ou supprimé.
Voici à quoi pourrait ressembler votre index.html
Avec un petit nombre de fichiers:
<!-- include: "type": "css", "files": "**/*.css" -->
<link href="styles.css" rel="stylesheet" type="text/css">
<!-- /include -->
<!-- include: "type": "js", "files": "**/*.js" -->
<script src="_routes/routes.js"></script>
<script src="scripts/app.js"></script>
<!-- /include -->
Liens:
Vous pouvez utiliser quelque chose comme ceci:
(function loadScript() {
var head = document.getElementsByTagName("head")[0];
var done = false;
var directory = 'libraries/';
var extension = '.js';
var files = ['functions', 'speak', 'commands', 'wsBrowser', 'main'];
for (var file of files){
var path = directory + file + extension;
var script = document.createElement("script");
script.src = path;
script.onload = script.onreadystatechange = function() {
// attach to both events for cross browser finish detection:
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
// cleans up a little memory:
script.onload = script.onreadystatechange = null;
// to avoid douple loading
head.removeChild(script);
}
};
head.appendChild(script);
done = false;
}
})();