如何在不重新启动服务器的情况下更改 Javascript?

How do I change Javascript without restarting the server?

我似乎无法在不重新启动服务器的情况下更改我的任何 JavaScript 文件 - 它真的扼杀了在 Phoenix 工作的很多实时重新加载的乐趣。我做的不多 JavaScript,所以我不确定我是否做错了什么。

凤凰版本:1.2.0

重现步骤:

  1. 使用 mix phoenix.new foo
  2. 创建一个新项目
  3. 创建 web/static/js/foo.js 文件。
  4. 在该文件中,写入 alert("Hello, world!");
  5. app.js中,在底部包含import "web/static/js/foo"
  6. 使用 mix phoenix.server 启动 Phoenix 并导航到 localhost:4000
  7. 无论您刷新页面多少次,每次都会看到一个带有 "Hello world!" 的警告框,不会失败。
  8. foo.js 消息编辑为 "Hello worlds!"
  9. 我预计我仍会收到带有更新文本的警告消息,但警告框完全停止出现。它们只会在我重新启动服务器时再次出现。

这是有意为之的行为吗?凤凰城的一个错误?我是否以 Brunch 不希望的方式编写 JS 代码?这是一个 Babel 问题吗?我应该以不同的方式组织我的代码吗?

应该补充一点,我正在 Linux Chrome 中开发 - 以防这可能是浏览器问题

编辑:我无法再重现这个确切的问题,但我的非玩具项目仍然存在问题:

我最初的问题是在我实际开发的应用程序中 - 我在 app.js 中有 global.jQuery = require("jquery")global.bootstrap = require("bootstrap")。如果我评论这两行,保存并取消评论,我会在浏览器中收到 Javascript 错误:app.js:16Uncaught Error: Cannot find module 'jquery' from 'web/static/js/app.js'

在您的客户端(浏览器)中禁用缓存(如果启用)。 在您的服务器中禁用缓存(如果启用)。

  • 这是有意为之的行为吗?是的。
  • Phoenix 中的错误?号
  • 我是否以 Brunch 不希望的方式编写 JS 代码?你是对的。
  • 这是 Babel 问题吗?没有。
  • 我应该以不同的方式组织我的代码吗?应该是吧。

Brunch(或 Node.js 或任何其他模块捆绑器)期望 import 语句中的相对路径:它无法从 web/static/js/app.js 解析 web/static/js/foo 并且不标记 foo.js 作为 app.js 的依赖项(入口点)。这就是为什么当 foo.js 改变时它不重建 app.js 的原因。当 Brunch 重新启动时,它会使用磁盘中的最新 foo.js(Brunch 包含它,因为 joinTo.javascripts 在配置中)版本完全重建 app.js

指定相对路径 (import "./foo") 并且更喜欢 import jquery from ... 而不是 global.jquery = ...