diff --git a/src/generators/dom/visitors/RawMustacheTag.js b/src/generators/dom/visitors/RawMustacheTag.js index e5e8f40c82..12042c8fab 100644 --- a/src/generators/dom/visitors/RawMustacheTag.js +++ b/src/generators/dom/visitors/RawMustacheTag.js @@ -1,3 +1,5 @@ +import deindent from '../../../utils/deindent.js'; + export default { enter ( generator, node ) { const name = generator.current.getUniqueName( 'raw' ); @@ -17,7 +19,8 @@ export default { const isToplevel = generator.current.localElementDepth === 0; - const mountStatement = `${before}.insertAdjacentHTML( 'afterend', ${snippet} );`; + generator.current.builders.init.addLine( `var last_${name} = ${snippet};` ); + const mountStatement = `${before}.insertAdjacentHTML( 'afterend', last_${name} );`; generator.uses.detachBetween = true; const detachStatement = `detachBetween( ${before}, ${after} );`; @@ -27,8 +30,13 @@ export default { generator.current.builders.init.addLine( mountStatement ); } - generator.current.builders.update.addBlock( detachStatement ); - generator.current.builders.update.addBlock( mountStatement ); + generator.current.builders.update.addBlock( deindent` + if ( ( __tmp = ${snippet} ) !== last_${name} ) { + last_${name} = __tmp; + ${detachStatement} + ${mountStatement} + } + ` ); generator.current.builders.detachRaw.addBlock( detachStatement ); } diff --git a/test/generator/raw-mustaches-preserved/_config.js b/test/generator/raw-mustaches-preserved/_config.js new file mode 100644 index 0000000000..698a58f911 --- /dev/null +++ b/test/generator/raw-mustaches-preserved/_config.js @@ -0,0 +1,21 @@ +const ns = ''; + +export default { + 'skip-ssr': true, + + data: { + raw: '
does not change
' + }, + + html: `does not change
${ns}does not change
' }); + assert.equal( target.innerHTML, `does not change
${ns}