Deno Embedder
I've really been enjoying writing code in Deno. It does a great job of removing barriers to just writing some code. You can open up a text file, import some dependencies from URLs, and deno run
it to get stuff done really quickly.
One nice thing is that Deno will walk all the transitive dependencies of any of your code, download them, and cache them. So even if your single file actually stands on the shoulders of giant( dependency tree)s, you still get to just treat it as a single script file that you want to run.
You can deno run foo.ts
or deno install https://url.to/foo.ts
and everything is pretty painless. My favorite is that you can even deno compile foo.ts
to bundle up all of those transitive dependencies into a self-contained executable for folks who don't have/want Deno.
Well... almost.
This doesn't work if you're writing something that needs access to static data files, though. The problem is that Deno's cache resolution mechanism only works for code files (.ts
, .js
, .tsx
, .jsx
and more recently, .json
). So if you want to include an index.html
or style.css
or image.jpg
, you're stuck with either reading it from disk or fetching it from the network.
If you fetch from disk, deno run <remoteUrl>
doesn't work, and if you fetch from the network, your application can't work in disconnected environments. (Not to mention the overhead of constantly re-fetching network resources every time your application needs them.)
In FeoBlog, I've been using the rust-embed crate, which works well. I was a bit surprised that I didn't find anything that was quite as easy to use in Deno. So I wrote it myself!
Deno Embedder follows a pattern I first saw in Fresh: You run a development server that automatically (re)generates code for you during development. Once you're finished changing things, you commit both your changes AND the generated code, and deploy that.
In Fresh's case, the generated code is (I think?) just the fresh.gen.ts file which contains metadata about all of the web site's routes, and their corresponding .tsx
files.
Deno Embedder instead will create a directory of .ts
files containing base64-encoded, (possibly) compressed copies of files from some other source directory. These .ts
files are perfectly cacheable by Deno, so will automatically get picked up by deno run
, deno install
, deno compile
, etc.
I'm enjoying using it for another personal project I'm working on. I really like the model of creating a single executable that contains all of its dependencies, and this makes it a lot easier. Let me know if you end up using it!