2016-08-06 7 views
1

Je ne peux pas sembler changer aucun de mes fichiers JavaScript sans redémarrer le serveur - il tue vraiment beaucoup de plaisir de rechargement en direct de travailler dans Phoenix. Je ne fais pas une tonne de JavaScript, donc je ne suis pas sûr de faire quelque chose de mal.Comment changer le Javascript sans redémarrer le serveur?

Version Phoenix: 1.2.0

Étapes pour reproduire:

  1. Créer un nouveau projet avec mix phoenix.new foo
  2. Créer un fichier web/static/js/foo.js.
  3. Dans ce fichier, écrire alert("Hello, world!");
  4. En app.js, comprennent import "web/static/js/foo" au fond. Commencez Phoenix avec mix phoenix.server et accédez à localhost:4000.
  5. Peu importe le nombre de fois que vous actualisez la page, vous verrez une boîte d'alerte avec "Bonjour tout le monde!" chaque fois, sans faute.
  6. Modifier le message foo.js pour être "Bonjour mondes!"
  7. Je m'attends à recevoir un message d'alerte avec le texte mis à jour, mais les boîtes d'alerte cessent d'apparaître - au total. Ils commencent seulement à apparaître à nouveau lorsque je redémarre le serveur.

Est-ce un comportement prévu? Un bug à Phoenix? Est-ce que j'écris mon code JS d'une manière que Brunch ne m'attend pas? Est-ce un problème de Babel? Devrais-je organiser mon code différemment?

dois ajouter que je développe dans Chrome sur Linux - dans le cas où cela pourrait être un problème de navigateur

Edit: Je ne peux pas reproduire plus cette question précise, mais je suis encore avoir des problèmes avec ma non -toy project:

Mon numéro original était dans l'application que je suis en train de développer - où j'ai global.jQuery = require("jquery") et global.bootstrap = require("bootstrap") en app.js. Si je commente ces deux lignes, enregistrer, et décommenter, je reçois une erreur Javascript dans le navigateur: app.js:16Uncaught Error: Cannot find module 'jquery' from 'web/static/js/app.js'

+0

Qu'est-ce que vous obtenez lorsque rechargeant simplement navigateur au lieu de serveur? Eh bien, vous devez comprendre le script Java s'exécute côté client. –

+0

"mais les boîtes d'alerte cessent d'apparaître - au total" Avez-vous des erreurs (éventuellement liées à Brunch) dans le terminal où vous avez lancé 'mix phoenix.server'? Avez-vous une erreur dans la console JS dans le navigateur? Est-ce que le fichier JS contient le nouveau contenu si vous y accédez directement depuis localhost: 4000? – Dogbert

+0

@Jits J'ai couvert cela dans mes étapes de reproduction. – Kevin

Répondre

4
  • Est-ce un comportement prévu? Oui.
  • Un bug dans Phoenix? Est-ce que j'écris mon code JS d'une manière que Brunch ne m'attend pas? Tu as raison.
  • Est-ce un problème de Babel? Nan.
  • Dois-je organiser mon code différemment? Probablement.

Brunch (ou Node.js ou tout autre module Bundler) prévoit chemin relatif dans import déclaration: il ne parvient pas à résoudre web/static/js/foo de web/static/js/app.js et ne marque pas foo.js comme dépendance de app.js (point d'entrée). C'est pourquoi il ne reconstruit pas app.js lorsque foo.js est modifié.Lorsque le Brunch est redémarré, il reconstruit complètement app.js, avec la dernière version foo.js (Brunch l'inclut en raison de la version joinTo.javascripts dans la configuration) à partir du disque.

Spécifiez les chemins relatifs (import "./foo") et préfèrent import jquery from ... sur global.jquery = ...

+0

C'est super utile! Alors, comment Brunch sait-il quels fichiers ont changé? Je pensais que ce serait (dans Phoenix par défaut) regarder sous 'web/static', où foo.js est logé. Ne devrait pas Brunch voir ce changement et mettre à jour? Le brunch est assez opaque pour moi – Kevin

0

Désactiver la mise en cache (si activé) dans votre client (navigateur). Désactivez la mise en cache (si activée) sur votre serveur.

+0

Ne fonctionne pas. Je recharge avec Ctrl-Shift-R et je désactive le cache dans les outils de développement, et Phoenix n'a pas de cache par défaut. – Kevin