build.templatesFiles

This feature adds advanced plugin and template support to modules
This commit is contained in:
Pooya Parsa 2017-05-11 22:41:00 +04:30
parent a8d681af3f
commit 4800a9e8fd
3 changed files with 45 additions and 24 deletions

View File

@ -57,7 +57,8 @@ const defaults = {
loaders: [], loaders: [],
plugins: [], plugins: [],
babel: {}, babel: {},
postcss: [] postcss: [],
templatesFiles: []
} }
const defaultsLoaders = [ const defaultsLoaders = [
{ {
@ -109,6 +110,7 @@ export function options () {
const manifest = fs.readFileSync(manifestPath, 'utf8') const manifest = fs.readFileSync(manifestPath, 'utf8')
createRenderer.call(this, JSON.parse(bundle), JSON.parse(manifest)) createRenderer.call(this, JSON.parse(bundle), JSON.parse(manifest))
addAppTemplate.call(this) addAppTemplate.call(this)
this.module.renderPlugins.call(this.module)
} }
} }
} }
@ -149,6 +151,7 @@ function * buildFiles () {
yield webpackRunClient.call(this) yield webpackRunClient.call(this)
yield webpackRunServer.call(this) yield webpackRunServer.call(this)
addAppTemplate.call(this) addAppTemplate.call(this)
this.module.renderPlugins.call(this.module)
} }
} }
@ -239,17 +242,26 @@ function * generateRoutesAndFiles () {
if (this.options.store) { if (this.options.store) {
templatesFiles.push('store.js') templatesFiles.push('store.js')
} }
let moveTemplates = templatesFiles.map((file) => { // Resolve all internal template files relative to app directory
return readFile(r(__dirname, 'app', file), 'utf8') templatesFiles = templatesFiles.map(file => { return {src: r(__dirname, 'app', file), dst: file} })
// Add external template files (used in modules)
if (Array.isArray(this.options.build.templatesFiles)) {
templatesFiles = templatesFiles.concat(this.options.build.templatesFiles)
}
let moveTemplates = templatesFiles.map(({src, dst, options}) => {
return readFile(src, 'utf8')
.then((fileContent) => { .then((fileContent) => {
const template = _.template(fileContent, { const template = _.template(fileContent, {
imports: { imports: {
serialize, serialize,
hash hash
} },
options: options || {},
nuxt: this.options
}) })
const content = template(templateVars) const content = template(templateVars)
const path = r(this.dir, '.nuxt', file) const path = r(this.dir, '.nuxt', dst)
return writeFile(path, content, 'utf8') return writeFile(path, content, 'utf8')
.then(() => { .then(() => {
// Fix webpack loop (https://github.com/webpack/watchpack/issues/25#issuecomment-287789288) // Fix webpack loop (https://github.com/webpack/watchpack/issues/25#issuecomment-287789288)

View File

@ -3,6 +3,7 @@
import path from 'path' import path from 'path'
import fs from 'fs' import fs from 'fs'
import {uniq} from 'lodash' import {uniq} from 'lodash'
import hash from 'hash-sum'
class Module { class Module {
constructor (nuxt) { constructor (nuxt) {
@ -17,27 +18,39 @@ class Module {
this.options.build.vendor = uniq(this.options.build.vendor.concat(vendor)) this.options.build.vendor = uniq(this.options.build.vendor.concat(vendor))
} }
addPlugin (plugin) { addTemplate (template) {
if (!plugin) { if (!template) {
return return
} }
const ssr = Boolean(plugin.ssr) // Validate & parse source
const copyOnly = Boolean(plugin.copyOnly) const src = template.src || template
const src = plugin.src || plugin const srcPath = path.parse(src)
if (!src || typeof src !== 'string' || !fs.existsSync(src)) { if (!src || typeof src !== 'string' || !fs.existsSync(src)) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.warn('[Nuxt] invalid plugin', plugin) console.warn('[Nuxt] invalid template', template)
return return
} }
// Copy plugin to project // Generate unique and human readable dst filename
const fileName = path.basename(src) const dst = template.dst ||
// TODO: Build removes this? ((template.dstName || (path.basename(srcPath.dir) + '.' + srcPath.name)) + '.' + hash(src) + (template.dstExt || srcPath.ext))
const dst = path.resolve(this.nuxt.rootDir, '.nuxt', fileName)
fs.copySync(src, dst) // Add to templates list
// Add to nuxt plugins const templateObj = {
if (!copyOnly) { src,
this.options.plugins.push({src: dst, ssr}) dst,
options: template.options
} }
this.options.build.templatesFiles.push(templateObj)
return templateObj
}
addPlugin (template) {
const {dst} = this.addTemplate(template)
// Add to nuxt plugins
this.options.plugins.push({
src: '~/.nuxt/' + dst,
ssr: Boolean(template.ssr)
})
} }
extendBuild (extendFn) { extendBuild (extendFn) {

View File

@ -56,11 +56,7 @@ class Nuxt {
webpack: {}, webpack: {},
chokidar: {} chokidar: {}
}, },
build: { build: {}
postcss: [],
vendor: [],
plugins: []
}
} }
// Sanitization // Sanitization
if (options.loading === true) delete options.loading if (options.loading === true) delete options.loading