mist_reload
Reload your mist webserver on file changes. Includes livereloading of the browser.
gleam add --dev mist_reload@1
Example
This example uses wisp but any mist based webserver will work.
To create our basic application we need a server and a router.
// src/myapp/router.gleam
import wisp
pub fn route(request, _context) {
case request {
_ ->
wisp.html_response(
"<html><head></head><body><h1>Hello!</h1></body></html>",
200,
)
}
}
The router must be a separate module to the server so that it gets compiles to an external function call. This is required for erlangs code reloading to take effect.
// src/myapp/server.gleam
import mist
import myapp/router
import wisp
import wisp/wisp_mist
pub fn start(wrap_reload) {
wisp.configure_logger()
let context = Nil
let secret_key_base = ""
router.route(_, context)
|> wisp_mist.handler(secret_key_base)
|> wrap_reload()
|> mist.new
|> mist.bind("0.0.0.0")
|> mist.port(8080)
|> mist.start
}
The wrap_reload
function is passed as an argument, rather than using a boolean value for dev/prod.
This is needed as mist_reload
is a dev dependency and so cannot be imported in any src modules.
Next we create the function for our entry file for dev.
// dev/myapp_dev.gleam
import gleam/erlang/process
import mist/reload
import myapp/server
pub fn main() {
let assert Ok(_) = server.start(reload.wrap)
process.sleep_forever()
}
Start your dev server with gleam dev
Finally we need to be able to run our server without reload for production.
// src/myapp.gleam
import gleam/erlang/process
import mist/reload
import myapp/server
pub fn main() {
let assert Ok(_) = server.start(fn(h) { h })
process.sleep_forever()
}
Start your server with gleam run
. There will be no code reloading
Further documentation can be found at https://hexdocs.pm/mist_reload.
Development
gleam run # Run the project
gleam test # Run the tests