Assets TL;DR
You can automatically copy static assets
(essentially files and folders) into your
canister's filesystem during deploy by using the
assets and
build_assets properties of the
canister object in your project's
dfx.json file.
Here's an example that copies the
src/frontend/dist directory on the
deploying machine into the
dist directory of the canister,
using the assets and
build_assets properties:
{
"canisters": {
"backend": {
"type": "azle",
"main": "src/backend/index.ts",
"custom": {
"experimental": true,
"assets": [["src/frontend/dist", "dist"]],
"build_assets": "npm run build"
}
}
}
}
The assets property is an array of
tuples, where the first element of the tuple is
the source directory on the deploying machine,
and the second element of the tuple is the
destination directory in the canister. Use
assets for total assets up to ~2
GiB in size. We are working on increasing this
limit further.
The build_assets property allows
you to specify custom terminal commands that
will run before Azle copies the assets into the
canister. You can use
build_assets to build your frontend
code for example. In this case we are running
npm run build, which refers to an
npm script that we have specified in our
package.json file.
Once you have loaded assets into your canister, they are accessible from that canister's filesystem. Here's an example of using the Express static middleware to serve a frontend from the canister's filesystem:
import express from 'express';
const app = express();
app.use(express.static('/dist'));
app.listen();
Assuming the /dist directory in the
canister has an appropriate
index.html file, this canister
would serve a frontend at its URL when loaded in
a web browser.