From 3ef0d15f6b3ae714f0f9c22cad1b73c69144949b Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 11 Jul 2017 03:23:06 +0430 Subject: [PATCH] perf: use es6 import for plugins --- lib/app/empty.js | 1 + lib/app/index.js | 51 +++++++++--------------------------------- lib/app/utils.js | 9 ++++++++ lib/builder/builder.js | 37 +++++++++++++++++++++++------- 4 files changed, 49 insertions(+), 49 deletions(-) create mode 100644 lib/app/empty.js diff --git a/lib/app/empty.js b/lib/app/empty.js new file mode 100644 index 0000000000..d96e1063fb --- /dev/null +++ b/lib/app/empty.js @@ -0,0 +1 @@ +// This file is intentially left empty for noop aliases diff --git a/lib/app/index.js b/lib/app/index.js index 09a0cf44a1..6a42150fb2 100644 --- a/lib/app/index.js +++ b/lib/app/index.js @@ -9,40 +9,16 @@ import Nuxt from './components/nuxt.vue' import App from '<%= appPath %>' import { getContext } from './utils' <% if (store) { %>import { createStore } from './store.js'<% } %> - -if (process.browser) { - // window.onNuxtReady(() => console.log('Ready')) hook - // Useful for jsdom testing or plugins (https://github.com/tmpvar/jsdom#dealing-with-asynchronous-script-loading) - window._nuxtReadyCbs = [] - window.onNuxtReady = function (cb) { - window._nuxtReadyCbs.push(cb) - } -} - -<% if (plugins.filter(p => p.ssr).length) { %> -// Require plugins -<% plugins.filter(p => p.ssr).forEach(plugin => { %> -let <%= plugin.name %> = require('<%= relativeToBuild(plugin.src) %>') -<%= plugin.name %> = <%= plugin.name %>.default || <%= plugin.name %> +<% plugins.forEach(plugin => { %>import <%= plugin.name %> from '<%= plugin.name %>' <% }) %> -<% } %> - -<% if (plugins.filter(p => !p.ssr).length) { %> -// Require browser-only plugins -if (process.browser) { - <% plugins.filter(p => !p.ssr).forEach(plugin => { %> - let <%= plugin.name %> = require('<%= relativeToBuild(plugin.src) %>') - <%= plugin.name %> = <%= plugin.name %>.default || <%= plugin.name %> - <% }) %> -} -<% } %> - // Component: Vue.component(NuxtChild.name, NuxtChild) + // Component: Vue.component(NuxtLink.name, NuxtLink) -// Component: + +// Component: ` Vue.component(Nuxt.name, Nuxt) // vue-meta configuration @@ -132,24 +108,17 @@ async function createApp (ssrContext) { route: router.currentRoute, next, error: app._nuxt.error.bind(app), - <% if(store) { %> store,<% } %> + <% if(store) { %>store,<% } %> req: ssrContext ? ssrContext.req : undefined, res: ssrContext ? ssrContext.res : undefined, }, app) - <% if (plugins.filter(p => p.ssr).length) { %> <% plugins.filter(p => p.ssr).forEach(plugin => { %> - if (typeof <%= plugin.name %> === 'function') await <%= plugin.name %>(ctx) - <% }) %> - <% } %> - + if (typeof <%= plugin.name %> === 'function') await <%= plugin.name %>(ctx)<% }) %> <% if (plugins.filter(p => !p.ssr).length) { %> - if (process.browser) { - <% plugins.filter(p => !p.ssr).forEach(plugin => { %> - if (typeof <%= plugin.name %> === 'function') await <%= plugin.name %>(ctx) - <% }) %> - } - <% } %> + if (process.browser) { <% plugins.filter(p => !p.ssr).forEach(plugin => { %> + if (typeof <%= plugin.name %> === 'function') await <%= plugin.name %>(ctx)<% }) %> + }<% } %> return { app, @@ -158,4 +127,4 @@ async function createApp (ssrContext) { } } -export { createApp, NuxtError } +export { createApp, NuxtError } \ No newline at end of file diff --git a/lib/app/utils.js b/lib/app/utils.js index 0529c9b9bc..6771b61686 100644 --- a/lib/app/utils.js +++ b/lib/app/utils.js @@ -2,6 +2,15 @@ import Vue from 'vue' const noopData = () => ({}) +// window.onNuxtReady(() => console.log('Ready')) hook +// Useful for jsdom testing or plugins (https://github.com/tmpvar/jsdom#dealing-with-asynchronous-script-loading) +if (process.browser) { + window._nuxtReadyCbs = [] + window.onNuxtReady = function (cb) { + window._nuxtReadyCbs.push(cb) + } +} + export function applyAsyncData (Component, asyncData = {}) { const ComponentData = Component.options.data || noopData // Prevent calling this method for each request on SSR context diff --git a/lib/builder/builder.js b/lib/builder/builder.js index 08352af0bd..f6681dd340 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -49,6 +49,14 @@ export default class Builder extends Tapable { this._buildStatus = STATUS.INITIAL } + get plugins () { + return this.options.plugins.map((p, i) => { + if (typeof p === 'string') p = { src: p } + p.src = r(this.options.srcDir, p.src) + return { src: p.src, ssr: (p.ssr !== false), name: `plugin${i}` } + }) + } + async build () { // Avoid calling build() method multiple times when dev:true /* istanbul ignore if */ @@ -119,6 +127,7 @@ export default class Builder extends Tapable { 'router.js', 'server.js', 'utils.js', + 'empty.js', 'components/nuxt-error.vue', 'components/nuxt-loading.vue', 'components/nuxt-child.js', @@ -137,11 +146,7 @@ export default class Builder extends Tapable { middleware: fs.existsSync(join(this.options.srcDir, 'middleware')), store: this.options.store, css: this.options.css, - plugins: this.options.plugins.map((p, i) => { - if (typeof p === 'string') p = { src: p } - p.src = r(this.options.srcDir, p.src) - return { src: p.src, ssr: (p.ssr !== false), name: `plugin${i}` } - }), + plugins: this.plugins, appPath: './App.vue', layouts: Object.assign({}, this.options.layouts), loading: typeof this.options.loading === 'string' ? this.relativeToBuild(this.options.srcDir, this.options.loading) : this.options.loading, @@ -264,16 +269,32 @@ export default class Builder extends Tapable { async webpackBuild () { debug('Building files...') - let compilersOptions = [] + const compilersOptions = [] // Client - let clientConfig = clientWebpackConfig.call(this) + const clientConfig = clientWebpackConfig.call(this) compilersOptions.push(clientConfig) // Server - let serverConfig = serverWebpackConfig.call(this) + const serverConfig = serverWebpackConfig.call(this) compilersOptions.push(serverConfig) + // Alias plugins to their real path + this.plugins.forEach(p => { + const src = this.relativeToBuild(p.src) + + // Client config + if (!clientConfig.resolve.alias[p.name]) { + clientConfig.resolve.alias[p.name] = src + } + + // Server config + if (!serverConfig.resolve.alias[p.name]) { + // Alias to noop for ssr:false plugins + serverConfig.resolve.alias[p.name] = p.ssr ? src : './empty.js' + } + }) + // Simulate webpack multi compiler interface // Separate compilers are simpler, safer and faster this.compiler = { compilers: [] }