diff --git a/lib/builder/builder.js b/lib/builder/builder.js index cebeeb4d6d..eb891f9858 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -161,14 +161,18 @@ export default class Builder extends Tapable { // -- Layouts -- if (fs.existsSync(resolve(this.options.srcDir, 'layouts'))) { - const layoutsFiles = await glob('layouts/*.vue', { cwd: this.options.srcDir }) + const layoutsFiles = await glob('layouts/*.{vue,js}', { cwd: this.options.srcDir }) + let hasErrorLayout = false layoutsFiles.forEach((file) => { - let name = file.split('/').slice(-1)[0].replace('.vue', '') - if (name === 'error') return + let name = file.split('/').slice(-1)[0].replace(/\.(js|vue)$/, '') + if (name === 'error') { + hasErrorLayout = true + return + } templateVars.layouts[name] = this.relativeToBuild(this.options.srcDir, file) }) - if (layoutsFiles.includes('layouts/error.vue') && !templateVars.components.ErrorPage) { - templateVars.components.ErrorPage = this.relativeToBuild(this.options.srcDir, 'layouts/error.vue') + if (!templateVars.components.ErrorPage && hasErrorLayout) { + templateVars.components.ErrorPage = this.relativeToBuild(this.options.srcDir, 'layouts/error') } } // If no default layout, create its folder and add the default folder @@ -183,7 +187,7 @@ export default class Builder extends Tapable { // If user defined a custom method to create routes if (this._nuxtPages) { // Use nuxt.js createRoutes bases on pages/ - const files = await glob('pages/**/*.vue', { cwd: this.options.srcDir }) + const files = await glob('pages/**/*.{vue,js}', { cwd: this.options.srcDir }) templateVars.router.routes = createRoutes(files, this.options.srcDir) } else { templateVars.router.routes = this.options.build.createRoutes(this.options.srcDir) @@ -431,13 +435,13 @@ export default class Builder extends Tapable { r(this.options.srcDir, 'layouts'), r(this.options.srcDir, 'store'), r(this.options.srcDir, 'middleware'), - r(this.options.srcDir, 'layouts/*.vue'), - r(this.options.srcDir, 'layouts/**/*.vue') + r(this.options.srcDir, 'layouts/*.{vue,js}'), + r(this.options.srcDir, 'layouts/**/*.{vue,js}') ] if (this._nuxtPages) { patterns.push(r(this.options.srcDir, 'pages')) - patterns.push(r(this.options.srcDir, 'pages/*.vue')) - patterns.push(r(this.options.srcDir, 'pages/**/*.vue')) + patterns.push(r(this.options.srcDir, 'pages/*.{vue,js}')) + patterns.push(r(this.options.srcDir, 'pages/**/*.{vue,js}')) } const options = Object.assign({}, this.options.watchers.chokidar, { ignoreInitial: true diff --git a/lib/common/utils.js b/lib/common/utils.js index 7e5f846d08..e3ffa32059 100644 --- a/lib/common/utils.js +++ b/lib/common/utils.js @@ -186,7 +186,7 @@ export function cleanChildrenRoutes (routes, isChild = false) { export function createRoutes (files, srcDir) { let routes = [] files.forEach((file) => { - let keys = file.replace(/^pages/, '').replace(/\.vue$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) + let keys = file.replace(/^pages/, '').replace(/\.(vue|js)$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) let route = { name: '', path: '', component: r(srcDir, file) } let parent = routes keys.forEach((key, i) => { diff --git a/test/basic.test.js b/test/basic.test.js index 624916b74d..4603ee0df0 100755 --- a/test/basic.test.js +++ b/test/basic.test.js @@ -26,6 +26,11 @@ test('/stateless', async t => { t.true(html.includes('