How to make Angular work with ESP32 SPIFFS / ESPAsyncWebserver
The main issue when using Angular web UIs is that the resulting files get too large, hence building the filesystem image will fail with SPIFFS_write error(-10001): File system is full.
Using these tips, I could get an Angular PrimeNG app to fit into a 4MB flash ESP32 module without any custom partition table and without any other crazy hacks! Even the fonts & PrimeNG icons fit into the SPIFFS easily, with a total of only 380 kB
of the approximately 1.5 MB
being consumed.
File compression
The number one most important tip is that you can just gzip -9
the files from the angular dist
directory and ESPAsyncWebserver
will automatically handle decompressing them!
This is my platformio.ini
:
[env:esp32dev]
platform = espressif32
platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.3
board = esp32dev
framework = arduino
board_build.filesystem = littlefs
lib_deps =
esphome/AsyncTCP-esphome@^1.2.2
esphome/ESPAsyncWebServer-esphome@^2.1.0
[email protected]
upload_speed = 460800
monitor_speed = 115200
This is my angular build script:
#!/bin/sh
ng build --aot --build-optimizer --optimization --progress --output-hashing none
gzip -9 dist/**/*
This is where I tell ESPAsyncWebserver (note that you should use the esphome fork) to serve files statically:
server.serveStatic("/", SPIFFS, "/www/").setDefaultFile("index.html");
Other tips
In order to make your life easier managing the data directory with both Angular files and other files, see How to link Angular project dist directory to PlatformIO SPIFFS data directory
You can use purgecss
but compression works so well that it isn’t really worth both the risk of accidentally removing some CSS rules which you manually need to whitelist. Before discovering how well compression worked, I started to manually remove CSS rules from the PrimeNG theme file. This worked fine, but the SPIFFS still wasn’t small enough.
Often you can save space by deleting.
For example, primeicons.svg
and primeicons.ttf
are two different formats with the same content. Note that some (especially older, and some mobile) browsers don’t support all formats, hence it’s rather risky to remove them if you need to support multiple platforms.