【问题标题】:How do I change Javascript without restarting the server?如何在不重新启动服务器的情况下更改 Javascript?
【发布时间】:2016-08-09 10:39:09
【问题描述】:

如果不重新启动服务器,我似乎无法更改我的任何 JavaScript 文件 - 这确实扼杀了在 Phoenix 工作的许多实时重新加载乐趣。我不会做大量的 JavaScript,所以我不确定我是否做错了什么。

凤凰版:1.2.0

重现步骤:

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

这是预期的行为吗?凤凰城的虫子?我是否以早午餐不期望的方式编写我的 JS 代码?这是巴别塔的问题吗?我应该以不同的方式组织我的代码吗?

应该补充一下,我正在 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'

【问题讨论】:

  • 只重新加载浏览器而不是服务器会得到什么?那么您需要了解在客户端运行的 java 脚本。
  • "但警告框停止出现 - 完全" 您在启动 mix phoenix.server 的终端中是否收到任何错误(可能与早午餐有关)?您在浏览器的 JS 控制台中是否收到任何错误?如果直接从localhost:4000访问,JS文件是否包含新内容?
  • @Jits 我在复制步骤中介绍了这一点。
  • @Dogbert 终端没有错误,Chrome 控制台也没有 JS 错误。我没有直接导航到浏览器中的 JS 文件——这是个好主意。我明天会这样做(我现在是凌晨 3 点 - 睡前发帖)
  • 嗯。我无法再重现这个确切的问题。我最初的问题是在我实际开发的应用程序中——我在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'

标签: javascript phoenix-framework brunch


【解决方案1】:
  • 这是预期的行为吗?是的。
  • 凤凰城的一个错误?没有。
  • 我编写 JS 代码的方式是 Brunch 没有预料到的吗?没错。
  • 这是 Babel 问题吗?没有。
  • 我应该以不同的方式组织我的代码吗?可能。

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

指定相对路径 (import "./foo") 并首选 import jquery from ... 而不是 global.jquery = ...

【讨论】:

  • 这个超级有用!那么,Brunch 是如何知道哪些文件发生了变化呢?我认为它会(默认情况下在 Phoenix 中)在 foo.js 所在的web/static 下查找。早午餐不应该看到这种变化和更新吗?早午餐对我来说很不透明
【解决方案2】:

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

【讨论】:

  • 没用。我正在使用Ctrl-Shift-R 重新加载并在开发者工具中禁用缓存,Phoenix 默认没有缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2013-10-01
  • 2016-03-10
  • 2013-12-22
  • 2011-09-28
相关资源
最近更新 更多