I would add a third option - both. There are cases where using template literals is preferred than string concatenation and vise versa.
For single line strings, where one needs to concatenate a string with a variable, using template literal is recommended:
const greeting = `Hello, ${name}, the weather outside is ${current_weather}.`;
const greeting = 'Hello, ' + name + ', the weather outside is ' + current_weather + '.';
The second example is much more error-prone than the ES6 one, because of the "unpredictable" whitespaces. Also, its more cleaner and readable in my opinion.
In the template literal all characters are significant so leading whitespaces on a new row are not ignored, meaning:
const htmlTemplate =
`<h2>Weather condition</h2>
<p>The weather today will be cloudy</p>`
"2-years ago" me will though that the variable will output the following result :
<h2>Weather condition</h2>
<p>The weather today will be cloudy</p>
Well, it won't. The result unfortunately will be:
<h2>Weather condition</h2>
<p>The weather today will be cloudy</p>
The template literal won't ignore the whitespace characters and will output the string as is. I learned this the hard way, while testings. My tests broke for no reason when I changed the old ES5 code with its ES6 equivalent. Silly me!
So, I still use string concatenation for multiline strings (with some small exceptions), because the behavior is much more predictable and template literals for single line strings, where I need embedded expressions.