J'ai une question concernant les meilleures pratiques à inclure node_modules
dans un site Web HTML.
Imaginez que j'ai Bootstrap dans mon node_modules
dossier. Maintenant, pour la version de production du site Web, comment pourrais-je inclure le script Bootstrap et les fichiers CSS situés dans le node_modules
dossier? Est-il judicieux de laisser Bootstrap dans ce dossier et de faire quelque chose comme ceci?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
Ou devrais-je ajouter des règles à mon fichier gulp qui copient ensuite ces fichiers dans mon dossier dist? Ou serait-il préférable de laisser gulp supprimer complètement le bootstrap local de mon fichier HTML et le remplacer par la version CDN?
Réponses:
Habituellement, vous ne voulez exposer aucun de vos chemins internes pour la structure de votre serveur au monde extérieur. Ce que vous pouvez faire est de créer une
/scripts
route statique dans votre serveur qui récupère ses fichiers à partir de n'importe quel répertoire où ils se trouvent. Donc, si vos fichiers sont dedans"./node_modules/bootstrap/dist/"
. Ensuite, la balise de script dans vos pages ressemble à ceci:Si vous utilisiez express avec nodejs, une route statique est aussi simple que ceci:
Ensuite, toutes les demandes du navigateur
/scripts/xxx.js
seront automatiquement récupérées de votredist
répertoire à l'adresse__dirname + /node_modules/bootstrap/dist/xxx.js
.Remarque: les nouvelles versions de NPM placent plus de choses au niveau supérieur, pas imbriquées si profondément, donc si vous utilisez une version plus récente de NPM, les noms de chemin seront différents de ceux indiqués dans la question du PO et dans la réponse actuelle. Mais, le concept est toujours le même. Vous découvrez où les fichiers se trouvent physiquement sur votre lecteur de serveur et vous créez un
app.use()
avecexpress.static()
pour créer un pseudo-chemin d'accès à ces fichiers afin de ne pas exposer l'organisation réelle du système de fichiers du serveur au client.Si vous ne souhaitez pas créer une route statique comme celle-ci, il vaut probablement mieux copier les scripts publics vers un chemin que votre serveur Web traite comme
/scripts
ou quelle que soit la désignation de niveau supérieur que vous souhaitez utiliser. Habituellement, vous pouvez intégrer cette copie à votre processus de génération / déploiement.Si vous souhaitez rendre public un seul fichier particulier dans un répertoire et que tout ce qui ne s'y trouve pas, vous pouvez créer manuellement des itinéraires individuels pour chaque fichier plutôt que d'utiliser,
express.static()
par exemple:Et le code pour créer un itinéraire pour cela
Ou, si vous souhaitez toujours délimiter les routes pour les scripts avec
/scripts
, vous pouvez le faire:Et le code pour créer un itinéraire pour cela
la source
/scripts
car de cette façon, toutes les dépendances à l'intérieur du module seraient conservées.express.static()
envoie la première correspondance qu'il trouve. Étant donné que chaqueexpress.static()
instruction ne crée qu'un seul chemin de correspondance possible, il ne doit pas y avoir de doublons à partir d'uneexpress.static()
instruction. Si vous disposez de plusieursexpress.static()
instructions pouvant chacune avoir une correspondance, la première de votre code est celle dont la correspondance sera utilisée. De plus, vous ne devriez vraiment pas avoir plusieurs fichiers avec le même nom et le même chemin d'accès accessibles par lesexpress.static()
instructions. La meilleure pratique est de ne pas le faire.express.static()
vers un répertoire qui contient UNIQUEMENT des fichiers publics (y compris les sous-répertoires). Donc, je ne peux pas vraiment imaginer un projet où il y aurait beaucoup dedist
répertoires publiés. Cela me semble très inhabituel. Vous souhaitez peut-être créer un itinéraire spécifique vers un fichier spécifique ou vers 2-3 fichiers. Dans ce cas, vous êtes responsable de lever l'ambiguïté de ces fichiers. De toute façon, cela ne vous fera aucun bien d'avoir quatrescript.js
fichiers./script.js
est demandé par le navigateur. Ainsi, la réponse abstraite est que vous ne devez pas autoriser la situation de noms de fichiers en double, car ce n'est pas un problème résoluble, sauf si vous avez besoin d'un préfixe unique pour chaque répertoire de fichiers. Ensuite, les noms de racine en double ne sont pas un problème de toute façon. Pour une réponse plus spécifique avec une recommandation détaillée, vous devez publier votre propre question avec des détails exacts.J'utiliserais le module path npm puis ferais quelque chose comme ceci:
IMPORTANT: nous utilisons path.join pour créer des chemins se joignant en utilisant le système de manière agnostique, c'est-à-dire que sur Windows et Unix, nous avons différents séparateurs de chemin (/ et)
la source
Comme mentionné par jfriend00, vous ne devez pas exposer la structure de votre serveur. Vous pouvez copier vos fichiers de dépendance de projet dans quelque chose comme
public/scripts
. Vous pouvez le faire très facilement avec dep-linker comme ceci:la source
src
ressembleront alors à quelque chose/scripts/[package-name]/dist/file.min.js
.Si vous voulez une solution rapide et facile (et que vous avez installé gulp).
Dans mon,
gulpfile.js
je lance une simple tâche de copier-coller qui place tous les fichiers dont j'ai besoin dans le./public/modules/
répertoire.L'inconvénient est qu'il n'est pas automatisé. Cependant, si vous n'avez besoin que de quelques scripts et styles copiés (et conservés dans une liste), cela devrait faire l'affaire.
la source
'scripts': {'install':'yarn gulp copy-modules'}
, en supposant que yarn est le gestionnaire de packages et que gulp est installé dans le package.Le répertoire 'node_modules' ne se trouve peut-être pas dans le répertoire actuel, vous devez donc résoudre le chemin de manière dynamique.
la source
Je veux mettre à jour cette question avec une solution plus simple. Créez un lien symbolique vers node_modules.
Le moyen le plus simple d'accorder l'accès public à node_modules est de créer un lien symbolique pointant vers vos node_modules à partir de votre répertoire public. Le lien symbolique fera comme si les fichiers existaient où que le lien soit créé.
Par exemple, si le serveur de noeud a du code pour servir des fichiers statiques
et __dirname fait référence à / path / to / app afin que vos fichiers statiques soient servis depuis / path / vers / app / dist
et node_modules se trouve dans / path / to / app / node_modules, puis créez un lien symbolique comme celui-ci sur mac / linux:
ou comme ça sur windows:
Maintenant, obtenez une demande pour:
recevra une réponse avec le fichier à l'adresse
qui est vraiment le fichier
Si votre répertoire dans / path / to / app / dist n'est pas un emplacement sûr, peut-être en raison d'interférences d'un processus de construction avec gulp ou grunt, vous pouvez ajouter un répertoire séparé pour le lien et ajouter un nouvel appel serveStatic tel que:
et dans le noeud, ajoutez:
la source
Je n'ai trouvé aucune solution propre (je ne veux pas exposer la source de tous mes modules node_modules) alors j'ai juste écrit un script Powershell pour les copier:
la source
J'ai fait les changements ci-dessous pour AUTO-INCLUDE les fichiers dans l'index html. De sorte que lorsque vous ajoutez un fichier dans le dossier, il sera automatiquement récupéré dans le dossier, sans que vous ayez à inclure le fichier dans index.html
la source
Voici ce que j'ai configuré sur mon
express
serveur:Bonne chance...
la source