From bcd672f9315c98a9437a5cdc686d7516588b73c3 Mon Sep 17 00:00:00 2001 From: Andrey Shertsinger Date: Wed, 13 Feb 2019 16:18:41 +0700 Subject: [PATCH] fix: generate failure (#5007) --- packages/webpack/src/plugins/vue/server.js | 9 +++- packages/webpack/src/plugins/vue/util.js | 6 ++- .../filenames-query-part.test.js | 3 ++ .../filenames-query-part/nuxt.config.js | 8 +++ .../filenames-query-part/pages/index.vue | 5 ++ test/unit/filenames-query-part.test.js | 53 +++++++++++++++++++ 6 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/filenames-query-part/filenames-query-part.test.js create mode 100644 test/fixtures/filenames-query-part/nuxt.config.js create mode 100644 test/fixtures/filenames-query-part/pages/index.vue create mode 100644 test/unit/filenames-query-part.test.js diff --git a/packages/webpack/src/plugins/vue/server.js b/packages/webpack/src/plugins/vue/server.js index 00ac888029..b893b1dbc4 100644 --- a/packages/webpack/src/plugins/vue/server.js +++ b/packages/webpack/src/plugins/vue/server.js @@ -1,4 +1,4 @@ -import { validate, isJS } from './util' +import { validate, isJS, extractQueryPartJS } from './util' export default class VueSSRServerPlugin { constructor(options = {}) { @@ -44,7 +44,12 @@ export default class VueSSRServerPlugin { stats.assets.forEach((asset) => { if (isJS(asset.name)) { - bundle.files[asset.name] = asset.name + const queryPart = extractQueryPartJS(asset.name) + if (queryPart !== undefined) { + bundle.files[asset.name] = asset.name.replace(queryPart, '') + } else { + bundle.files[asset.name] = asset.name + } } else if (asset.name.match(/\.js\.map$/)) { bundle.maps[asset.name.replace(/\.map$/, '')] = asset.name } else { diff --git a/packages/webpack/src/plugins/vue/util.js b/packages/webpack/src/plugins/vue/util.js index 7db9feb8f8..1b992ff84d 100644 --- a/packages/webpack/src/plugins/vue/util.js +++ b/packages/webpack/src/plugins/vue/util.js @@ -22,6 +22,10 @@ export const validate = (compiler) => { } } -export const isJS = file => /\.js(\?[^.]+)?$/.test(file) +const isJSRegExp = /\.js(\?[^.]+)?$/ + +export const isJS = file => isJSRegExp.test(file) + +export const extractQueryPartJS = file => isJSRegExp.exec(file)[1] export const isCSS = file => /\.css(\?[^.]+)?$/.test(file) diff --git a/test/fixtures/filenames-query-part/filenames-query-part.test.js b/test/fixtures/filenames-query-part/filenames-query-part.test.js new file mode 100644 index 0000000000..d721c3eebc --- /dev/null +++ b/test/fixtures/filenames-query-part/filenames-query-part.test.js @@ -0,0 +1,3 @@ +import { buildFixture } from '../../utils/build' + +buildFixture('filenames-query-part') diff --git a/test/fixtures/filenames-query-part/nuxt.config.js b/test/fixtures/filenames-query-part/nuxt.config.js new file mode 100644 index 0000000000..fb293c9e5a --- /dev/null +++ b/test/fixtures/filenames-query-part/nuxt.config.js @@ -0,0 +1,8 @@ +export default { + build: { + filenames: { + app: '[name].js?v=[contenthash]', + chunk: '[name].js?v=[contenthash]' + } + } +} diff --git a/test/fixtures/filenames-query-part/pages/index.vue b/test/fixtures/filenames-query-part/pages/index.vue new file mode 100644 index 0000000000..24fa9df56e --- /dev/null +++ b/test/fixtures/filenames-query-part/pages/index.vue @@ -0,0 +1,5 @@ + diff --git a/test/unit/filenames-query-part.test.js b/test/unit/filenames-query-part.test.js new file mode 100644 index 0000000000..c99eb19050 --- /dev/null +++ b/test/unit/filenames-query-part.test.js @@ -0,0 +1,53 @@ +import { resolve } from 'path' +import { existsSync, readFileSync } from 'fs' +import { getPort, loadFixture, Nuxt } from '../utils' + +let port + +let nuxt = null + +expect.extend({ + toFileExist(file) { + if (existsSync(file)) { + return { + message: () => `expected '${file}' not exist`, + pass: true + } + } else { + return { + message: () => `expected '${file}' exist`, + pass: false + } + } + } +}) + +describe('build filenames with query part', () => { + beforeAll(async () => { + const config = await loadFixture('filenames-query-part') + nuxt = new Nuxt(config) + port = await getPort() + await nuxt.server.listen(port, 'localhost') + }) + + test('server manifest files exist', () => { + const manifest = JSON.parse(readFileSync(resolve(__dirname, '..', 'fixtures/filenames-query-part/.nuxt/dist/server/server.manifest.json'), 'utf8')) + expect(manifest).toMatchObject({ + files: expect.any(Object) + }) + for (const file in manifest.files) { + expect(resolve(__dirname, '..', `fixtures/filenames-query-part/.nuxt/dist/server/${manifest.files[file]}`)).toFileExist() + } + }) + + test("render / without error 'Cannot find module'", async () => { + await expect(nuxt.server.renderRoute('/')).resolves.toMatchObject({ + html: expect.stringContaining('

Chunks with version in query part

') + }) + }) + + // Close server and ask nuxt to stop listening to file changes + afterAll(async () => { + await nuxt.close() + }) +})