I don't think I'd mentioned 4-byte alignment. I typically align to 16 bytes (as per the defines). That way SIMD can be mixed in with non-simd structs without needed custom allocator everywhere. iOS/OSX and Win 64-bit already follow this strategy, 32-bit Win and 32-bit/64-bit Linux and Android are still lagging behind on this to eek out memory and hold to legacy but at a price to code generation.
Abort on failure is an issue since Emscripten has a fixed size heap. We have resources that can be purged from memory, but if the heap aborts on failure then we don't get null back from dlmalloc, and the app just exits. It's a reasonable default strategy, but not a shippable one.
This is what I consider a reasonable strategy, where attempts are made to free up space. This is a simplification of what I do. Typically the browsers provide no feedback as to actual ram or vram, so you're forced into a try and fail strategy, but have fail and abort enforced by default doesn't allow this approach.
freeMemory(size);
ptr = malloc(size);
if (!ptr) {
freeMemory(size);
ptr = malloc(size);
if (!ptr)
abort();