From cb740ae26893edeb568c81a2227fa191e588978d Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Wed, 25 Sep 2019 00:19:25 +0800 Subject: [PATCH] fix: correctly ignore html templates in copy-webpack-plugin (#4613) Fixes #3597. Fixes #4299. --- .../@vue/cli-service/__tests__/multiPage.spec.js | 13 ++++++++++++- packages/@vue/cli-service/lib/config/app.js | 13 ++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/@vue/cli-service/__tests__/multiPage.spec.js b/packages/@vue/cli-service/__tests__/multiPage.spec.js index b7da0de805..c85e2c4f65 100644 --- a/packages/@vue/cli-service/__tests__/multiPage.spec.js +++ b/packages/@vue/cli-service/__tests__/multiPage.spec.js @@ -15,7 +15,12 @@ async function makeProjectMultiPage (project) { index: { entry: 'src/main.js' }, foo: { entry: 'src/foo.js' }, bar: { entry: 'src/bar.js' }, - foobar: { entry: ['src/foobar.js'] } + foobar: { entry: ['src/foobar.js'] }, + baz: { + entry: 'src/main.js', + template: 'public/baz.html', + filename: 'qux.html' + } }, chainWebpack: config => { const splitOptions = config.optimization.get('splitChunks') @@ -25,6 +30,7 @@ async function makeProjectMultiPage (project) { } } `) + await project.write('public/baz.html', await project.read('public/index.html')) await project.write('src/foo.js', ` import Vue from 'vue' new Vue({ @@ -96,6 +102,11 @@ test('build w/ multi page', async () => { expect(project.has('dist/foo.html')).toBe(true) expect(project.has('dist/bar.html')).toBe(true) + // should properly ignore the template file + expect(project.has('dist/baz.html')).toBe(false) + // should respect the `filename` field in a multi-page config + expect(project.has('dist/qux.html')).toBe(true) + const assertSharedAssets = file => { // should split and preload vendor chunk expect(file).toMatch(/]*js\/chunk-vendors[^>]*\.js rel=preload as=script>/) diff --git a/packages/@vue/cli-service/lib/config/app.js b/packages/@vue/cli-service/lib/config/app.js index 365833614e..de23998496 100644 --- a/packages/@vue/cli-service/lib/config/app.js +++ b/packages/@vue/cli-service/lib/config/app.js @@ -158,6 +158,11 @@ module.exports = (api, options) => { ? htmlPath : defaultHtmlPath + publicCopyIgnore.push({ + glob: path.relative(api.resolve('public'), api.resolve(htmlOptions.template)), + matchBase: false + }) + webpackConfig .plugin('html') .use(HTMLPlugin, [htmlOptions]) @@ -214,15 +219,17 @@ module.exports = (api, options) => { // resolve page index template const hasDedicatedTemplate = fs.existsSync(api.resolve(template)) - if (hasDedicatedTemplate) { - publicCopyIgnore.push(template) - } const templatePath = hasDedicatedTemplate ? template : fs.existsSync(htmlPath) ? htmlPath : defaultHtmlPath + publicCopyIgnore.push({ + glob: path.relative(api.resolve('public'), api.resolve(templatePath)), + matchBase: false + }) + // inject html plugin for the page const pageHtmlOptions = Object.assign( {},