<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="style.css" />
</head>
<script src="index.js"></script>
<body></body>
</html>let button = document.createElement('button');
button.textContent = 'Добавить книгу';
document.body.append(button);<head> и <body> плохая практика. При рендере страницы у тебя скрипт выполняется в момент, когда браузер его увидел, то есть до того как появился <body>. defer, повторюсь, скрипты вне <head> и <body> плохая практика.<head> и <body>. Тут есть нюанс, у тебя скрипт написан так что он выполяется сразу как только браузер увидит код. В текущем виде твой скрипт лучше подключать в конце <body>. Если нужно в head, то оберни свой код в обработчик, например:document.addEventListener('DOMContentLoaded', () => {
let button = document.createElement('button');
button.textContent = 'Добавить книгу';
document.body.append(button);
}); <!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<link rel="stylesheet" href="style.css" />
</head>
<script>
function main(){
let button = document.createElement('button');
button.textContent = 'Добавить книгу';
document.body.append(button);
}
</script>
<body onload="main();"></body>
</html>