Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Universal Webpack #3578

Merged
merged 138 commits into from
Jan 30, 2018
Merged
Show file tree
Hide file tree
Changes from 65 commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
fcb3430
Speed up next build
timneutkens Dec 21, 2017
c1ebbf6
Document webpack config
timneutkens Dec 21, 2017
83916b7
Speed up next build
timneutkens Dec 21, 2017
443ece9
Remove comment
timneutkens Dec 21, 2017
0aacb17
Add comment
timneutkens Dec 21, 2017
ad6cc8a
Merge branch 'fix/webpack-build-speed-increase' into feature/universa…
timneutkens Dec 21, 2017
6ce025e
Clean up rules
timneutkens Dec 21, 2017
c3914ea
Add comments
timneutkens Dec 21, 2017
b1aac7b
Run in parallel
timneutkens Dec 21, 2017
7bee9a7
Push plugins seperately
timneutkens Dec 21, 2017
5373354
Create a new chunk for react
timneutkens Dec 21, 2017
dc3f242
Don’t uglify react since it’s already uglified. Move react to commons…
timneutkens Dec 22, 2017
6fabf34
Use the minified version directly
timneutkens Dec 22, 2017
654c48e
Re-add globpattern
timneutkens Dec 22, 2017
3192950
Merge branch 'canary' of github.com:zeit/next.js into fix/add-comment…
timneutkens Dec 22, 2017
25e8bca
Move loaders into a separate variable
timneutkens Dec 22, 2017
82e5505
Add comment linking to Dan’s explanation
timneutkens Dec 22, 2017
c8ff14b
Remove dot
timneutkens Dec 22, 2017
b4fbe50
Add universal webpack
timneutkens Dec 23, 2017
a057415
Initial dev support
timneutkens Dec 27, 2017
8226bd9
Fix linting
timneutkens Dec 27, 2017
91569e0
Merge branch 'canary' of github.com:zeit/next.js into feature/webpack
timneutkens Dec 27, 2017
e5d2078
Add changes from Arunoda's work
timneutkens Dec 27, 2017
b843e6e
Made next dev works.
arunoda Jan 4, 2018
9da6404
Fix client side hot reload
timneutkens Jan 4, 2018
5cb819a
Server side hmr
timneutkens Jan 4, 2018
b97bc2f
Only in dev
timneutkens Jan 4, 2018
89f9793
Add on-demand-entries client + hot-middleware
timneutkens Jan 5, 2018
aec6aa1
Add .babelrc support
timneutkens Jan 5, 2018
888bc35
Speed up on demand entries by running in parallel
timneutkens Jan 5, 2018
ab26369
Serve static generated files
timneutkens Jan 5, 2018
8859c5f
Add missing config in dev
timneutkens Jan 5, 2018
84d785a
Add sass support
timneutkens Jan 5, 2018
c5ccf23
Add support for .map
timneutkens Jan 5, 2018
bb5cf9a
Add cssloader config and fix .jsx support
timneutkens Jan 5, 2018
565bf54
Rename
timneutkens Jan 5, 2018
122fc92
use same defaults as css-loader. Fix linting
timneutkens Jan 9, 2018
c487416
Add NoEmitErrorsPlugin
timneutkens Jan 9, 2018
c6c7e15
Add clientBootstrap
timneutkens Jan 9, 2018
008e659
Use webpackhotmiddleware on the multi compiler
timneutkens Jan 9, 2018
fa4b18f
alpha.3
timneutkens Jan 9, 2018
2057482
Use babel 16.2.x
timneutkens Jan 11, 2018
7bd3178
Fix reloading after error
timneutkens Jan 11, 2018
c136af8
Remove comment
timneutkens Jan 11, 2018
bf78292
Release 5.0.0-univeral-alpha.1
timneutkens Jan 11, 2018
5e5b9e8
Remove check for React 16
timneutkens Jan 11, 2018
7b339a4
Release 5.0.0-universal-alpha.2
timneutkens Jan 11, 2018
6494359
React hot loader v4
timneutkens Jan 13, 2018
f8f1fba
Use our static file rendering machanism to serve pages.
arunoda Jan 13, 2018
820d3c3
Release 5.0.0-universal-alpha.3
timneutkens Jan 13, 2018
48e4d63
Remove optional loaders
timneutkens Jan 13, 2018
190b930
Release 5.0.0-universal-alpha.4
timneutkens Jan 13, 2018
573d4a6
Remove clientBootstrap
timneutkens Jan 14, 2018
e0d2a41
Remove renderScript
timneutkens Jan 15, 2018
7d83ae4
Make sure pages bundles are served correctly
timneutkens Jan 13, 2018
9eac841
Remove unused import
timneutkens Jan 15, 2018
ea67454
Revert to using the same code as canary
timneutkens Jan 15, 2018
340b93d
Fix hot loader
timneutkens Jan 15, 2018
52605da
Release 5.0.0-universal-alpha.5
timneutkens Jan 15, 2018
3347940
Check if externals dir exist before applying config
timneutkens Jan 15, 2018
5434104
Add typescript support
timneutkens Jan 16, 2018
d4b1d9b
Add support for transpiling certain packages in node_modules
timneutkens Jan 16, 2018
4ca1a44
Add BABEL_DISABLE_CACHE support
timneutkens Jan 16, 2018
5821d49
Make sourcemaps in production opt-in
timneutkens Jan 16, 2018
91ad193
Revert "Add support for transpiling certain packages in node_modules"
timneutkens Jan 16, 2018
dbbdec4
Support typescript through next.config.js
timneutkens Jan 17, 2018
5fd08f1
Remove comments
timneutkens Jan 17, 2018
fcea07c
Bring back commons.js calculation
timneutkens Jan 17, 2018
04651be
Remove unused dependencies
timneutkens Jan 17, 2018
1f023a8
Move base.config.js to webpack.js
timneutkens Jan 17, 2018
435b60d
Make sure to only invalidate webpackDevMiddleware one after other.
arunoda Jan 17, 2018
1a2ab91
Allow babel-loder caching by default.
arunoda Jan 18, 2018
495e0a4
Add comment about preact support
timneutkens Jan 17, 2018
2a3aa74
Bring back buildir replace
timneutkens Jan 17, 2018
8e96607
Remove obsolete plugin
timneutkens Jan 18, 2018
6473226
Remove build replace, speed up build
timneutkens Jan 18, 2018
30af0bf
Resolve page entries like pages/day/index.js to pages/day.js
timneutkens Jan 18, 2018
d82c566
Add componentDidCatch back
timneutkens Jan 18, 2018
94fdee5
Compile to bundles
timneutkens Jan 18, 2018
bd27a7e
Use config.distDir everywhere
timneutkens Jan 18, 2018
deff65a
Make sure the file is an array
timneutkens Jan 18, 2018
ef06a04
Remove console.log
timneutkens Jan 18, 2018
de8d0fb
Apply optimization to uglifyjs
timneutkens Jan 18, 2018
c80228b
Add comment pointing to source
timneutkens Jan 18, 2018
49e2808
Create entries the same way in dev and production
timneutkens Jan 18, 2018
7106aff
Remove unused and broken pagesGlobPattern
timneutkens Jan 18, 2018
a10c21e
day/index.js is automatically turned into day.js at build time
timneutkens Jan 18, 2018
fb7c862
Remove poweredByHeader option
timneutkens Jan 18, 2018
d948ef5
Load pages with the correct path.
arunoda Jan 19, 2018
763a1d2
Release 5.0.0-universal-alpha.6
timneutkens Jan 19, 2018
9b709c5
Make sure react-dom/server can be overwritten by module-alias
timneutkens Jan 19, 2018
6b62551
Only add react-hot-loader babel plugin in dev
timneutkens Jan 19, 2018
4617987
Release 5.0.0-universal-alpha.7
timneutkens Jan 19, 2018
6833e8b
Revert tests
timneutkens Jan 19, 2018
516fa62
Release 5.0.0-universal-alpha.10
timneutkens Jan 19, 2018
97f45e9
Make sure next/head is working properly.
arunoda Jan 19, 2018
e57c236
Add wepack alias for 'next' back.
arunoda Jan 19, 2018
7ed60b7
Make sure overriding className in next/head works
timneutkens Jan 19, 2018
4911d0a
Alias react too
timneutkens Jan 19, 2018
f820315
Merge branch 'feature/webpack' of github.com:zeit/next.js into featur…
timneutkens Jan 19, 2018
8e9f8c7
Add missing r
timneutkens Jan 19, 2018
7e9fa41
Fragment fallback has to wrap the children
timneutkens Jan 19, 2018
1e6e829
Use min.js
timneutkens Jan 20, 2018
3897e64
Remove css.js
timneutkens Jan 20, 2018
9f4de5b
Remove wallaby.js
timneutkens Jan 20, 2018
0aa6aac
Release 5.0.0-universal-alpha.11
timneutkens Jan 20, 2018
65c0747
Merge branch 'canary' of github.com:zeit/next.js into feature/webpack
timneutkens Jan 20, 2018
a13f3e4
Resolve relative to workdir instead of next
timneutkens Jan 20, 2018
15d2280
Make sure we touch the right file
timneutkens Jan 21, 2018
280b9c7
Resolve next modules
timneutkens Jan 21, 2018
3479800
Remove dotjsx removal plugins since we use webpack on the server
timneutkens Jan 21, 2018
49b119b
Revert "Resolve relative to workdir instead of next"
timneutkens Jan 22, 2018
5650e50
Externalize any locally loaded module lives outside of app dir.
timneutkens Jan 21, 2018
e7a938c
Remove server aliases
timneutkens Jan 22, 2018
827c813
Check node_modules reliably
timneutkens Jan 22, 2018
aeea881
Add symlink to next for tests
timneutkens Jan 22, 2018
f9e9712
Make sure dynamic imports work locally.
arunoda Jan 23, 2018
6845af9
dynmaic -> dynamic
timneutkens Jan 23, 2018
89f5563
Remove webpack-node-externals
timneutkens Jan 23, 2018
c8f9c70
Make sure dynamic imports support SSR.
arunoda Jan 26, 2018
53c9a6b
Remove css support in favor of next-css
timneutkens Jan 26, 2018
d6dee1e
Make sure we load path from `/` since it’s included in the path matching
timneutkens Jan 28, 2018
ef5f3de
Catch when ensurepage couldn’t be fulfilled for `.js.map`
timneutkens Jan 28, 2018
96b99ac
Register require cache flusher for both client and server
timneutkens Jan 29, 2018
440b39f
Add comment explaining this is to facilitate hot reloading
timneutkens Jan 29, 2018
c73853c
Only load module when needed
timneutkens Jan 29, 2018
3269104
Remove unused modules
timneutkens Jan 29, 2018
e38c605
Release 5.0.0-universal-alpha.12
timneutkens Jan 29, 2018
01c84a1
Only log the `found babel` message once
timneutkens Jan 29, 2018
91ce3f9
Make sure ondemand entries working correctly.
arunoda Jan 29, 2018
a62b764
Better sourcemaps
timneutkens Jan 29, 2018
415de61
Release 5.0.0-universal-alpha.13
timneutkens Jan 29, 2018
3de72fc
Lock uglify version to 1.1.6
timneutkens Jan 29, 2018
256ad20
Release 5.0.0-universal-alpha.14
timneutkens Jan 29, 2018
563c9c3
Fix a typo.
arunoda Jan 30, 2018
3b0d1f8
Introduce multi-zones support for mircofrontends
arunoda Jan 30, 2018
3018694
Add section on css
timneutkens Jan 30, 2018
1226b3d
Merge branch 'feature/webpack' of github.com:zeit/next.js into featur…
timneutkens Jan 30, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion bin/next-dev
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#!/usr/bin/env node
import 'source-map-support/register'
import { resolve, join } from 'path'
import parseArgs from 'minimist'
import { existsSync, readFileSync } from 'fs'
Expand Down
2 changes: 1 addition & 1 deletion client/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ async function doRender ({ Component, props, hash, err, emitter: emitterProp = e

let isInitialRender = true
function renderReactElement (reactEl, domEl) {
if (isInitialRender) {
if (isInitialRender && typeof ReactDOM.hydrate === 'function') {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need to check this? This came with 16.0.0 right?

Copy link
Member Author

@timneutkens timneutkens Jan 17, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@arunoda to support preact and the likes that haven't added hydrate yet 🕵️

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah ha. Shall we add a comment here about this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good idea 👍

ReactDOM.hydrate(reactEl, domEl)
isInitialRender = false
} else {
Expand Down
1 change: 0 additions & 1 deletion client/next-dev.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'react-hot-loader/patch'
import stripAnsi from 'strip-ansi'
import initNext, * as next from './'
import ErrorDebugComponent from '../lib/error-debug'
Expand Down
6 changes: 0 additions & 6 deletions lib/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,6 @@ export default class App extends Component {
}
}

componentDidCatch (error, info) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why we remove this?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. it's not SSR compatible and we didn't add it (community contribution for React v16 support)
  2. It didn't do anything. Tried multiple times and the error component got rendered just fine.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (this.state.hasError) return null should probably remove this too 😄

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@timneutkens for SSR we don't need this. We can easily catch them with try catch. This is for development to track errors inside render functions.
(Or it's more for tracking an edge case)

Earlier, we had to hack React to get this. Please do not remove it.
Create an issue asking whether we really need this.
Sometimes, React Hot Loader might already use it. If so we can remove this.
Otherwise, it's better to keep it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

error.stack = `${error.stack}\n\n${info.componentStack}`
window.next.renderError(error)
this.setState({ hasError: true })
}

render () {
if (this.state.hasError) return null

Expand Down
8 changes: 2 additions & 6 deletions lib/page-loader.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* global window, document, __NEXT_DATA__ */
/* global window, document */
import EventEmitter from './EventEmitter'

const webpackModule = module
Expand Down Expand Up @@ -69,11 +69,7 @@ export default class PageLoader {

loadScript (route) {
route = this.normalizeRoute(route)
let scriptRoute = route

if (__NEXT_DATA__.nextExport) {
scriptRoute = route === '/' ? '/index.js' : `${route}.js`
}
const scriptRoute = route === '/' ? '/index.js' : `${route}.js`

const script = document.createElement('script')
const url = `${this.assetPrefix}/_next/${encodeURIComponent(this.buildId)}/page${scriptRoute}`
Expand Down
25 changes: 16 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "next",
"version": "4.3.0-canary.1",
"version": "5.0.0-universal-alpha.5",
"description": "Minimalistic framework for server-rendered React applications",
"main": "./dist/server/next.js",
"license": "MIT",
Expand Down Expand Up @@ -68,8 +68,11 @@
"babel-template": "6.26.0",
"case-sensitive-paths-webpack-plugin": "2.1.1",
"cross-spawn": "5.1.0",
"css-hot-loader": "1.3.4",
"css-loader": "0.28.7",
"del": "3.0.0",
"etag": "1.8.1",
"extract-text-webpack-plugin": "3.0.2",
"find-up": "2.1.0",
"fresh": "0.5.2",
"friendly-errors-webpack-plugin": "1.6.1",
Expand All @@ -78,6 +81,7 @@
"hoist-non-react-statics": "2.3.1",
"htmlescape": "1.1.1",
"http-status": "1.0.1",
"ignore-loader": "0.1.2",
"json-loader": "0.5.7",
"loader-utils": "1.1.0",
"md5-file": "3.2.3",
Expand All @@ -89,23 +93,26 @@
"pkg-up": "2.0.0",
"prop-types": "15.6.0",
"prop-types-exact": "1.1.1",
"react-hot-loader": "3.1.1",
"react-hot-loader": "4.0.0-beta.14",
"recursive-copy": "2.0.6",
"send": "0.16.1",
"source-map-support": "0.4.18",
"source-map-support": "0.5.0",
"stats-webpack-plugin": "0.6.1",
"strip-ansi": "3.0.1",
"style-loader": "0.19.1",
"styled-jsx": "2.2.1",
"touch": "3.1.0",
"uglifyjs-webpack-plugin": "^1.1.1",
"unfetch": "3.0.0",
"url": "0.11.0",
"uuid": "3.1.0",
"walk": "2.3.9",
"webpack": "3.6.0",
"webpack": "3.10.0",
"webpack-dev-middleware": "1.12.0",
"webpack-hot-middleware": "2.19.1",
"webpack-hot-middleware": "2.21.0",
"webpack-node-externals": "1.6.0",
"write-file-webpack-plugin": "4.2.0",
"xss-filters": "1.2.7",
"uglifyjs-webpack-plugin": "^1.1.1"
"xss-filters": "1.2.7"
},
"devDependencies": {
"@taskr/babel": "1.1.0",
Expand All @@ -131,8 +138,8 @@
"node-notifier": "5.1.2",
"nyc": "11.2.1",
"portfinder": "1.0.13",
"react": "16.0.0",
"react-dom": "16.0.0",
"react": "16.2.0",
"react-dom": "16.2.0",
"standard": "9.0.2",
"taskr": "1.1.0",
"wd": "1.4.1"
Expand Down
21 changes: 1 addition & 20 deletions server/build/babel/preset.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
const babelRuntimePath = require.resolve('babel-runtime/package').replace(/[\\/]package\.json$/, '')
const relativeResolve = require('../root-module-relative-path').default(require)

// Resolve styled-jsx plugins
function styledJsxOptions (opts) {
if (!opts) {
Expand Down Expand Up @@ -53,22 +50,6 @@ module.exports = (context, opts = {}) => ({
require.resolve('babel-plugin-transform-class-properties'),
[require.resolve('babel-plugin-transform-runtime'), opts['transform-runtime'] || {}],
[require.resolve('styled-jsx/babel'), styledJsxOptions(opts['styled-jsx'])],
...plugins,
[
require.resolve('babel-plugin-module-resolver'),
{
alias: {
'babel-runtime': babelRuntimePath,
'next/link': relativeResolve('../../../lib/link'),
'next/prefetch': relativeResolve('../../../lib/prefetch'),
'next/css': relativeResolve('../../../lib/css'),
'next/dynamic': relativeResolve('../../../lib/dynamic'),
'next/head': relativeResolve('../../../lib/head'),
'next/document': relativeResolve('../../../server/document'),
'next/router': relativeResolve('../../../lib/router'),
'next/error': relativeResolve('../../../lib/error')
}
}
]
...plugins
]
})
40 changes: 25 additions & 15 deletions server/build/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ import { tmpdir } from 'os'
import { join } from 'path'
import fs from 'mz/fs'
import uuid from 'uuid'
import del from 'del'
import webpack from './webpack'
import replaceCurrentBuild from './replace'
// import del from 'del'
import webpack from 'webpack'
import getConfig from '../config'
import baseConfig from './webpack/base.config.js'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rename like: getBaseWebpackConfig?

// import replaceCurrentBuild from './replace'
import md5File from 'md5-file/promise'

export default async function build (dir, conf = null) {
const config = getConfig(dir, conf)
const buildId = uuid.v4()
const tempDir = tmpdir()
const buildDir = join(tempDir, uuid.v4())

try {
await fs.access(tempDir, fs.constants.W_OK)
Expand All @@ -19,26 +21,34 @@ export default async function build (dir, conf = null) {
throw err
}

const compiler = await webpack(dir, { buildId, buildDir, conf })

try {
const stats = await runCompiler(compiler)
await writeBuildStats(buildDir, stats)
await writeBuildId(buildDir, buildId)
const configs = await Promise.all([
baseConfig(dir, { buildId, isServer: false, config }),
baseConfig(dir, { buildId, isServer: true, config })
])

await runCompiler(configs)

// await fs.writeFile(join(dir, '.next', 'server-stats.json'), JSON.stringify(serverStats), 'utf8')
// await fs.writeFile(join(dir, '.next', 'client-stats.json'), JSON.stringify(stats), 'utf8')

await writeBuildStats(dir)
await writeBuildId(dir, buildId)
} catch (err) {
console.error(`> Failed to build on ${buildDir}`)
console.error(`> Failed to build`)
throw err
}

await replaceCurrentBuild(dir, buildDir)
// await replaceCurrentBuild(dir, buildDir)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we need these?

Copy link
Contributor

@arunoda arunoda Jan 17, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure we documented why we removed it.


// no need to wait
del(buildDir, { force: true })
// del(buildDir, { force: true })
Copy link
Contributor

@arunoda arunoda Jan 17, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we need to delete the current directory before running next build.
Is webpack doing that already?

}

function runCompiler (compiler) {
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
return new Promise(async (resolve, reject) => {
const webpackCompiler = await webpack(await compiler)
webpackCompiler.run((err, stats) => {
if (err) return reject(err)

const jsonStats = stats.toJson()
Expand All @@ -55,7 +65,7 @@ function runCompiler (compiler) {
})
}

async function writeBuildStats (dir, stats) {
async function writeBuildStats (dir) {
// Here we can't use hashes in webpack chunks.
// That's because the "app.js" is not tied to a chunk.
// It's created by merging a few assets. (commons.js and main.js)
Expand Down
9 changes: 5 additions & 4 deletions server/build/loaders/hot-self-accept-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ module.exports = function (content, sourceMap) {
this.callback(null, `${content}
(function (Component, route) {
if (!module.hot) return
if (!__resourceQuery) return
// if (!__resourceQuery) return
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's get rid these. (Remove commented lines).
And the console.log


var qs = require('querystring')
var params = qs.parse(__resourceQuery.slice(1))
if (params.entry == null) return
// var qs = require('querystring')
// var params = qs.parse(__resourceQuery.slice(1))
// if (params.entry == null) return

console.log('ACCEPTING')
module.hot.accept()
Component.__route = route

Expand Down
1 change: 0 additions & 1 deletion server/build/plugins/combine-assets-plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export default class CombineAssetsPlugin {

// We add each matched asset from this.input to a new bundle
concat.add(asset)

// The original assets are kept because they show up when analyzing the bundle using webpack-bundle-analyzer
// See https://github.com/zeit/next.js/tree/canary/examples/with-webpack-bundle-analyzer
})
Expand Down
Loading