Update dept and start next generate

This commit is contained in:
Sébastien Chopin 2016-11-24 01:47:11 +01:00
parent e441b7eb12
commit 40515ac91a
6 changed files with 93 additions and 27 deletions

View File

@ -1,7 +1,7 @@
'use strict' 'use strict'
import Vue from 'vue' import Vue from 'vue'
import Meta from 'vue-meta/lib/vue-meta.js' // require the ES2015 lib import Meta from 'vue-meta'
import router from './router.js' import router from './router.js'
<% if (store) { %>import store from '~store/index.js'<% } %> <% if (store) { %>import store from '~store/index.js'<% } %>
import NuxtContainer from './components/nuxt-container.vue' import NuxtContainer from './components/nuxt-container.vue'

View File

@ -6,7 +6,7 @@ import Router from 'vue-router'
Vue.use(Router) Vue.use(Router)
<% uniqBy(router.routes, '_name').forEach((route) => { %> <% uniqBy(router.routes, '_name').forEach((route) => { %>
const <%= route._name %> = process.BROWSER ? () => System.import('<%= route._component %>') : require('<%= route._component %>') const <%= route._name %> = process.BROWSER_BUILD ? () => System.import('<%= route._component %>') : require('<%= route._component %>')
<% }) %> <% }) %>
const scrollBehavior = (to, from, savedPosition) => { const scrollBehavior = (to, from, savedPosition) => {

View File

@ -5,7 +5,6 @@ const _ = require('lodash')
const co = require('co') const co = require('co')
const chokidar = require('chokidar') const chokidar = require('chokidar')
const fs = require('fs-extra') const fs = require('fs-extra')
const glob = require('glob-promise')
const hash = require('hash-sum') const hash = require('hash-sum')
const pify = require('pify') const pify = require('pify')
const webpack = require('webpack') const webpack = require('webpack')
@ -16,6 +15,7 @@ const remove = pify(fs.remove)
const readFile = pify(fs.readFile) const readFile = pify(fs.readFile)
const writeFile = pify(fs.writeFile) const writeFile = pify(fs.writeFile)
const mkdirp = pify(fs.mkdirp) const mkdirp = pify(fs.mkdirp)
const glob = pify(require('glob'))
const reqSep = /\//g const reqSep = /\//g
const sysSep = _.escapeRegExp(sep) const sysSep = _.escapeRegExp(sep)
const normalize = string => string.replace(reqSep, sysSep) const normalize = string => string.replace(reqSep, sysSep)
@ -171,8 +171,7 @@ function * generateRoutesAndFiles () {
isDev: this.dev, isDev: this.dev,
router: { router: {
base: this.options.router.base, base: this.options.router.base,
linkActiveClass: this.options.router.linkActiveClass, linkActiveClass: this.options.router.linkActiveClass
routes: this.routes
}, },
head: this.options.head, head: this.options.head,
store: this.options.store, store: this.options.store,
@ -190,10 +189,13 @@ function * generateRoutesAndFiles () {
templateVars.loading = templateVars.loading + '.vue' templateVars.loading = templateVars.loading + '.vue'
} }
// Format routes for the lib/app/router.js template // Format routes for the lib/app/router.js template
templateVars.router.routes.forEach((route) => { templateVars.router.routes = this.routes.map((route) => {
route._component = route.component const r = Object.assign({}, route)
route._name = '_' + hash(route._component) r._component = r.component
route.component = route._name r._name = '_' + hash(r._component)
r.component = r._name
r.path = r.path.replace(/\\/g, '\\\\') // regex expression in route path escaping for lodash templating
return r
}) })
if (files.includes('pages/_app.vue')) { if (files.includes('pages/_app.vue')) {
templateVars.appPath = r(this.dir, 'pages/_app.vue') templateVars.appPath = r(this.dir, 'pages/_app.vue')

View File

@ -1,12 +1,13 @@
'use strict' 'use strict'
const debug = require('debug')('nuxt:generate')
const fs = require('fs-extra') const fs = require('fs-extra')
const co = require('co') const co = require('co')
const pify = require('pify') const pify = require('pify')
const debug = require('debug')('nuxt:generate') const pathToRegexp = require('path-to-regexp')
const _ = require('lodash') const _ = require('lodash')
const { resolve, join, dirname, sep } = require('path') const { resolve, join, dirname, sep } = require('path')
const { urlJoin } = require('./utils') const { urlJoin, promisifyRouteParams } = require('./utils')
const copy = pify(fs.copy) const copy = pify(fs.copy)
const remove = pify(fs.remove) const remove = pify(fs.remove)
const writeFile = pify(fs.writeFile) const writeFile = pify(fs.writeFile)
@ -59,24 +60,45 @@ module.exports = function () {
yield copy(srcBuiltPath, distNuxtPath) yield copy(srcBuiltPath, distNuxtPath)
debug('Static & build files copied') debug('Static & build files copied')
}) })
.then(() => {
// Resolve config.generate.routesParams promises before generating the routes
return resolveRouteParams(this.options.generate.routeParams)
})
.then(() => { .then(() => {
/* /*
** Generate html files from routes ** Generate html files from routes
*/ */
var promises = [] var promises = []
this.routes.forEach((route) => { this.routes.forEach((route) => {
var promise = this.renderRoute(route.path) let subRoutes = []
.then(({ html }) => { if (route.path.includes(':') || route.path.includes('*')) {
var path = join(route.path, sep, 'index.html') // /about -> /about/index.html const routeParams = this.options.generate.routeParams[route.path]
debug('Generate file: ' + path) if (!routeParams) {
path = join(distPath, path) console.error(`Could not generate the dynamic route ${route.path}, please add the mapping params in nuxt.config.js (generate.routeParams).`)
// Make sure the sub folders are created return process.exit(1)
return co(function * () { }
yield mkdirp(dirname(path)) const toPath = pathToRegexp.compile(route.path)
yield writeFile(path, html, 'utf8') routeParams.forEach((params) => {
const newRoute = Object.assign({}, route, { path: toPath(params) })
subRoutes.push(newRoute)
}) })
} else {
subRoutes.push(route)
}
subRoutes.forEach((route) => {
var promise = this.renderRoute(route.path)
.then(({ html }) => {
var path = join(route.path, sep, 'index.html') // /about -> /about/index.html
debug('Generate file: ' + path)
path = join(distPath, path)
// Make sure the sub folders are created
return co(function * () {
yield mkdirp(dirname(path))
yield writeFile(path, html, 'utf8')
})
})
promises.push(promise)
}) })
promises.push(promise)
}) })
return Promise.all(promises) return Promise.all(promises)
}) })
@ -84,3 +106,20 @@ module.exports = function () {
debug('HTML Files generated') debug('HTML Files generated')
}) })
} }
function resolveRouteParams (routeParams) {
let promises = []
Object.keys(routeParams).forEach(function (routePath) {
let promise = promisifyRouteParams(routeParams[routePath])
.then((routeParamsData) => {
routeParams[routePath] = routeParamsData
})
.catch((e) => {
console.error(`Could not resolve routeParams[${routePath}]`)
console.error(e)
process.exit(1)
})
promises.push(promise)
})
return Promise.all(promises)
}

View File

@ -31,3 +31,28 @@ exports.waitFor = function * (ms) {
exports.urlJoin = function () { exports.urlJoin = function () {
return [].slice.call(arguments).join('/').replace(/\/+/g, '/') return [].slice.call(arguments).join('/').replace(/\/+/g, '/')
} }
exports.promisifyRouteParams = function (fn) {
// If routeParams[route] is an array
if (Array.isArray(fn)) {
return Promise.resolve(fn)
}
let promise
// If routeParams[route] is a function expecting a callback
if (fn.length === 1) {
promise = new Promise((resolve, reject) => {
fn(function (err, routeParams) {
if (err) {
reject(err)
}
resolve(routeParams)
})
})
} else {
promise = fn()
}
if (!(promise instanceof Promise)) {
promise = Promise.resolve(promise)
}
return promise
}

View File

@ -1,6 +1,6 @@
{ {
"name": "nuxt", "name": "nuxt",
"version": "0.6.9", "version": "0.7.0",
"description": "A minimalistic framework for server-rendered Vue.js applications (inspired by Next.js)", "description": "A minimalistic framework for server-rendered Vue.js applications (inspired by Next.js)",
"main": "index.js", "main": "index.js",
"license": "MIT", "license": "MIT",
@ -30,7 +30,7 @@
"extract-text-webpack-plugin": "2.0.0-beta.4", "extract-text-webpack-plugin": "2.0.0-beta.4",
"file-loader": "^0.9.0", "file-loader": "^0.9.0",
"fs-extra": "^1.0.0", "fs-extra": "^1.0.0",
"glob-promise": "^2.0.0", "glob": "^7.1.1",
"hash-sum": "^1.0.2", "hash-sum": "^1.0.2",
"lodash": "^4.17.2", "lodash": "^4.17.2",
"lru-cache": "^4.0.1", "lru-cache": "^4.0.1",
@ -39,12 +39,12 @@
"serialize-javascript": "^1.3.0", "serialize-javascript": "^1.3.0",
"serve-static": "^1.11.1", "serve-static": "^1.11.1",
"url-loader": "^0.5.7", "url-loader": "^0.5.7",
"vue": "^2.1.0", "vue": "^2.1.3",
"vue-loader": "^10.0.0", "vue-loader": "^10.0.0",
"vue-meta": "^0.4.4", "vue-meta": "^0.5.2",
"vue-router": "^2.0.3", "vue-router": "^2.0.3",
"vue-server-renderer": "^2.1.0", "vue-server-renderer": "^2.1.3",
"vue-template-compiler": "^2.1.0", "vue-template-compiler": "^2.1.3",
"vuex": "^2.0.0", "vuex": "^2.0.0",
"webpack": "2.1.0-beta.27", "webpack": "2.1.0-beta.27",
"webpack-dev-middleware": "^1.8.4", "webpack-dev-middleware": "^1.8.4",