如何在不重新启动服务器的情况下更改 Javascript?
How do I change Javascript without restarting the server?
我似乎无法在不重新启动服务器的情况下更改我的任何 JavaScript 文件 - 它真的扼杀了在 Phoenix 工作的很多实时重新加载的乐趣。我做的不多 JavaScript,所以我不确定我是否做错了什么。
凤凰版本:1.2.0
重现步骤:
- 使用
mix phoenix.new foo
创建一个新项目
- 创建
web/static/js/foo.js
文件。
- 在该文件中,写入
alert("Hello, world!");
- 在
app.js
中,在底部包含import "web/static/js/foo"
。
- 使用
mix phoenix.server
启动 Phoenix 并导航到 localhost:4000
。
- 无论您刷新页面多少次,每次都会看到一个带有 "Hello world!" 的警告框,不会失败。
- 将
foo.js
消息编辑为 "Hello worlds!"
- 我预计我仍会收到带有更新文本的警告消息,但警告框完全停止出现。它们只会在我重新启动服务器时再次出现。
这是有意为之的行为吗?凤凰城的一个错误?我是否以 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 = ...
我似乎无法在不重新启动服务器的情况下更改我的任何 JavaScript 文件 - 它真的扼杀了在 Phoenix 工作的很多实时重新加载的乐趣。我做的不多 JavaScript,所以我不确定我是否做错了什么。
凤凰版本:1.2.0
重现步骤:
- 使用
mix phoenix.new foo
创建一个新项目
- 创建
web/static/js/foo.js
文件。 - 在该文件中,写入
alert("Hello, world!");
- 在
app.js
中,在底部包含import "web/static/js/foo"
。 - 使用
mix phoenix.server
启动 Phoenix 并导航到localhost:4000
。 - 无论您刷新页面多少次,每次都会看到一个带有 "Hello world!" 的警告框,不会失败。
- 将
foo.js
消息编辑为 "Hello worlds!" - 我预计我仍会收到带有更新文本的警告消息,但警告框完全停止出现。它们只会在我重新启动服务器时再次出现。
这是有意为之的行为吗?凤凰城的一个错误?我是否以 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 = ...