mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-11 08:33:53 +00:00
perf(spa): inline runtime chunk
This commit is contained in:
parent
342d9a8bf6
commit
6a68e381b6
@ -6,6 +6,7 @@ import webpack from 'webpack'
|
|||||||
import HTMLPlugin from 'html-webpack-plugin'
|
import HTMLPlugin from 'html-webpack-plugin'
|
||||||
import StylishPlugin from 'webpack-stylish'
|
import StylishPlugin from 'webpack-stylish'
|
||||||
import BundleAnalyzer from 'webpack-bundle-analyzer'
|
import BundleAnalyzer from 'webpack-bundle-analyzer'
|
||||||
|
import HtmlWebpackInlineSourcePlugin from 'html-webpack-inline-source-plugin'
|
||||||
|
|
||||||
import Debug from 'debug'
|
import Debug from 'debug'
|
||||||
import base from './base.config'
|
import base from './base.config'
|
||||||
@ -42,6 +43,7 @@ export default function webpackClientConfig() {
|
|||||||
filename: 'index.spa.html',
|
filename: 'index.spa.html',
|
||||||
template: this.options.appTemplatePath,
|
template: this.options.appTemplatePath,
|
||||||
inject: true,
|
inject: true,
|
||||||
|
inlineSource: /runtime.*\.js$/,
|
||||||
chunksSortMode: 'dependency'
|
chunksSortMode: 'dependency'
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@ -57,6 +59,10 @@ export default function webpackClientConfig() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enhances html-webpack-plugin functionality by adding the inlineSource option.
|
||||||
|
// https://github.com/DustinJackson/html-webpack-inline-source-plugin
|
||||||
|
config.plugins.push(new HtmlWebpackInlineSourcePlugin())
|
||||||
|
|
||||||
// Generate vue-ssr-client-manifest
|
// Generate vue-ssr-client-manifest
|
||||||
config.plugins.push(
|
config.plugins.push(
|
||||||
new VueSSRClientPlugin({
|
new VueSSRClientPlugin({
|
||||||
|
@ -74,20 +74,22 @@ export default class MetaRenderer {
|
|||||||
const shouldPreload = this.options.render.bundleRenderer.shouldPreload || (() => true)
|
const shouldPreload = this.options.render.bundleRenderer.shouldPreload || (() => true)
|
||||||
const shouldPrefetch = this.options.render.bundleRenderer.shouldPrefetch || (() => true)
|
const shouldPrefetch = this.options.render.bundleRenderer.shouldPrefetch || (() => true)
|
||||||
|
|
||||||
|
const runtimeRegex = /runtime.*\.js$/
|
||||||
|
|
||||||
if (this.options.render.resourceHints && clientManifest) {
|
if (this.options.render.resourceHints && clientManifest) {
|
||||||
const publicPath = clientManifest.publicPath || '/_nuxt/'
|
const publicPath = clientManifest.publicPath || '/_nuxt/'
|
||||||
|
|
||||||
// Preload initial resources
|
// Preload initial resources
|
||||||
if (Array.isArray(clientManifest.initial)) {
|
if (Array.isArray(clientManifest.initial)) {
|
||||||
meta.resourceHints += clientManifest.initial
|
meta.resourceHints += clientManifest.initial
|
||||||
.filter(file => shouldPreload(file))
|
.filter(file => shouldPreload(file) && !(runtimeRegex.test(file)))
|
||||||
.map(
|
.map(
|
||||||
r => `<link rel="preload" href="${publicPath}${r}" as="script" />`
|
r => `<link rel="preload" href="${publicPath}${r}" as="script" />`
|
||||||
)
|
)
|
||||||
.join('')
|
.join('')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pre-Fetch async resources
|
// Prefetch async resources
|
||||||
if (Array.isArray(clientManifest.async)) {
|
if (Array.isArray(clientManifest.async)) {
|
||||||
meta.resourceHints += clientManifest.async
|
meta.resourceHints += clientManifest.async
|
||||||
.filter(file => shouldPrefetch(file))
|
.filter(file => shouldPrefetch(file))
|
||||||
@ -104,7 +106,7 @@ export default class MetaRenderer {
|
|||||||
// Emulate getPreloadFiles from vue-server-renderer (works for JS chunks only)
|
// Emulate getPreloadFiles from vue-server-renderer (works for JS chunks only)
|
||||||
meta.getPreloadFiles = () =>
|
meta.getPreloadFiles = () =>
|
||||||
clientManifest.initial
|
clientManifest.initial
|
||||||
.filter(file => shouldPreload(file))
|
.filter(file => shouldPreload(file) && !(runtimeRegex.test(file)))
|
||||||
.map(r => ({
|
.map(r => ({
|
||||||
file: r,
|
file: r,
|
||||||
fileWithoutQuery: r,
|
fileWithoutQuery: r,
|
||||||
|
@ -79,6 +79,7 @@
|
|||||||
"glob": "^7.1.2",
|
"glob": "^7.1.2",
|
||||||
"hash-sum": "^1.0.2",
|
"hash-sum": "^1.0.2",
|
||||||
"html-minifier": "^3.5.11",
|
"html-minifier": "^3.5.11",
|
||||||
|
"html-webpack-inline-source-plugin": "^0.0.10",
|
||||||
"html-webpack-plugin": "^3.0.6",
|
"html-webpack-plugin": "^3.0.6",
|
||||||
"launch-editor-middleware": "^2.2.1",
|
"launch-editor-middleware": "^2.2.1",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
|
25
yarn.lock
25
yarn.lock
@ -2445,6 +2445,12 @@ eslint-plugin-standard@^3.0.1:
|
|||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2"
|
||||||
|
|
||||||
|
eslint-plugin-vue@^4.3.0:
|
||||||
|
version "4.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.3.0.tgz#478c6267269dbaa20f6e8b2cfae7a0ccc98c1d72"
|
||||||
|
dependencies:
|
||||||
|
vue-eslint-parser "^2.0.3"
|
||||||
|
|
||||||
eslint-scope@^3.7.1, eslint-scope@~3.7.1:
|
eslint-scope@^3.7.1, eslint-scope@~3.7.1:
|
||||||
version "3.7.1"
|
version "3.7.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
|
||||||
@ -3339,6 +3345,14 @@ html-tags@^2.0.0:
|
|||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b"
|
resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b"
|
||||||
|
|
||||||
|
html-webpack-inline-source-plugin@^0.0.10:
|
||||||
|
version "0.0.10"
|
||||||
|
resolved "https://registry.yarnpkg.com/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz#89bd5f761e4f16902aa76a44476eb52831c9f7f0"
|
||||||
|
dependencies:
|
||||||
|
escape-string-regexp "^1.0.5"
|
||||||
|
slash "^1.0.0"
|
||||||
|
source-map-url "^0.4.0"
|
||||||
|
|
||||||
html-webpack-plugin@^3.0.6:
|
html-webpack-plugin@^3.0.6:
|
||||||
version "3.0.6"
|
version "3.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.0.6.tgz#d35b0452aae129a8a9f3fac44a169a625d8cf3fa"
|
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.0.6.tgz#d35b0452aae129a8a9f3fac44a169a625d8cf3fa"
|
||||||
@ -7395,6 +7409,17 @@ vm-browserify@0.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
indexof "0.0.1"
|
indexof "0.0.1"
|
||||||
|
|
||||||
|
vue-eslint-parser@^2.0.3:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
|
||||||
|
dependencies:
|
||||||
|
debug "^3.1.0"
|
||||||
|
eslint-scope "^3.7.1"
|
||||||
|
eslint-visitor-keys "^1.0.0"
|
||||||
|
espree "^3.5.2"
|
||||||
|
esquery "^1.0.0"
|
||||||
|
lodash "^4.17.4"
|
||||||
|
|
||||||
vue-hot-reload-api@^2.2.0:
|
vue-hot-reload-api@^2.2.0:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
|
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
|
||||||
|
Loading…
Reference in New Issue
Block a user