Есть ли какая-нибудь разница между document.ready и атрибутом defer?
Есть. Document.ready - это
событие, а
defer - это
атрибут асинхронной загрузки скриптов с сохранением порядка их выполнения.
Является ли что-то из этого более предпочтительным?
Я думаю одно другое не может заменить в полной мере и ещё, как мне кажется, если Вы оставите
document.ready там же где он и был, не зависимо от того, будет ли использоваться
defer или нет, для совместимости и переносимости кода в будущем - это будет оптимальным решением.