Skip to content

Commit cf8e2da

Browse files
LaurynasAkryum
Laurynas
authored andcommitted
refactor: use webpack-chain in webpack config (#16), closes #15
* use webpack-chain in webpack config * fix: remove no-emit-on-errors * fix: entry * feat: improve error messages handling
1 parent 0abd075 commit cf8e2da

File tree

2 files changed

+71
-80
lines changed

2 files changed

+71
-80
lines changed

lib/dev-server.js

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ module.exports.setupDevServer = ({ server, templatePath, onUpdate }) => new Prom
4444
}
4545

4646
// modify client config to work with hot middleware
47-
clientConfig.entry = ['webpack-hot-middleware/client', clientConfig.entry]
47+
clientConfig.entry.app = ['webpack-hot-middleware/client', ...clientConfig.entry.app]
4848
clientConfig.plugins.push(
4949
new webpack.HotModuleReplacementPlugin(),
5050
)
@@ -61,10 +61,16 @@ module.exports.setupDevServer = ({ server, templatePath, onUpdate }) => new Prom
6161
server.use(devMiddleware)
6262

6363
clientCompiler.hooks.done.tap('cli ssr', async stats => {
64-
stats = stats.toJson()
65-
stats.errors.forEach(err => console.error(err))
66-
stats.warnings.forEach(err => console.warn(err))
67-
if (stats.errors.length) return
64+
const jsonStats = stats.toJson()
65+
if (stats.hasErrors()) {
66+
console.log(chalk.red('Client errors'))
67+
jsonStats.errors.forEach(err => console.error(err))
68+
}
69+
if (stats.hasWarnings()) {
70+
console.log(chalk.yellow('Client warnings'))
71+
jsonStats.warnings.forEach(err => console.warn(err))
72+
}
73+
if (stats.hasErrors()) return
6874
clientManifest = JSON.parse(readFile(
6975
devMiddleware.fileSystem,
7076
'vue-ssr-client-manifest.json'
@@ -77,6 +83,11 @@ module.exports.setupDevServer = ({ server, templatePath, onUpdate }) => new Prom
7783
onCompilationCompleted()
7884
})
7985

86+
clientCompiler.hooks.failed.tap('cli ssr', (error) => {
87+
console.log(chalk.red('Client compilation failed'))
88+
console.error(error)
89+
})
90+
8091
// hot module replacement middleware
8192
server.use(require('webpack-hot-middleware')(clientCompiler, { heartbeat: 5000 }))
8293

@@ -85,9 +96,20 @@ module.exports.setupDevServer = ({ server, templatePath, onUpdate }) => new Prom
8596
const serverMfs = new MFS()
8697
serverCompiler.outputFileSystem = serverMfs
8798
serverCompiler.watch({}, (err, stats) => {
88-
if (err) throw err
89-
stats = stats.toJson()
90-
if (stats.errors.length) return
99+
if (err) {
100+
console.log(chalk.red('Server critical error'))
101+
throw err
102+
}
103+
const jsonStats = stats.toJson()
104+
if (stats.hasErrors()) {
105+
console.log(chalk.red('Server errors'))
106+
jsonStats.errors.forEach(err => console.error(err))
107+
}
108+
if (stats.hasWarnings()) {
109+
console.log(chalk.yellow('Server warnings'))
110+
jsonStats.warnings.forEach(err => console.warn(err))
111+
}
112+
if (stats.hasErrors()) return
91113
// read bundle generated by vue-ssr-webpack-plugin
92114
serverBundle = JSON.parse(readFile(serverMfs, 'vue-ssr-server-bundle.json'))
93115
update()

lib/webpack.js

Lines changed: 41 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
const webpack = require('webpack')
2-
const mergeWebpack = require('webpack-merge')
31
const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
42
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin')
53
const nodeExternals = require('webpack-node-externals')
@@ -21,7 +19,7 @@ exports.getWebpackConfig = ({ target }) => {
2119
webpackConfig.plugins.delete('preload')
2220
webpackConfig.plugins.delete('prefetch')
2321
webpackConfig.plugins.delete('progress')
24-
webpackConfig.plugins.delete('no-emit-on-errors')
22+
if (!isProd) webpackConfig.plugins.delete('no-emit-on-errors')
2523

2624
if (!isClient) {
2725
webpackConfig.plugins.delete('friendly-errors')
@@ -52,83 +50,54 @@ exports.getWebpackConfig = ({ target }) => {
5250
})
5351
}
5452

55-
webpackConfig = service.resolveWebpackConfig(webpackConfig)
56-
57-
webpackConfig = mergeWebpack(webpackConfig, {
58-
entry: config.entry(target),
59-
plugins: [
60-
new webpack.DefinePlugin({
61-
'process.client': target === 'client',
62-
'process.server': target === 'server',
63-
}),
64-
new webpack.NoEmitOnErrorsPlugin(),
65-
],
66-
stats: isProd ? 'normal' : 'none',
67-
devServer: {
68-
stats: 'errors-only',
69-
quiet: true,
70-
noInfo: true,
71-
},
53+
webpackConfig.entry('app').clear().add(config.entry(target))
54+
55+
webpackConfig.plugin('define').tap(args => {
56+
return [Object.assign(args[0], {'process.client': target === 'client', 'process.server': target === 'server'})]
7257
})
7358

59+
webpackConfig.stats(isProd ? 'normal' : 'none')
60+
webpackConfig.devServer.stats('errors-only').quiet(true).noInfo(true)
61+
7462
if (isClient) {
75-
webpackConfig = mergeWebpack(webpackConfig, {
76-
plugins: [
77-
new VueSSRClientPlugin(),
78-
new WebpackBar({
79-
name: 'Client',
80-
color: 'green',
81-
}),
82-
],
83-
devtool: !isProd ? '#cheap-module-source-map' : undefined,
63+
webpackConfig.plugin('ssr').use(VueSSRClientPlugin)
64+
webpackConfig.plugin('loader').use(WebpackBar, [{name: 'Client', color: 'green'}])
65+
66+
webpackConfig.devtool(!isProd ? '#cheap-module-source-map' : undefined)
67+
68+
webpackConfig.module.rule('vue').use('vue-loader').tap(options => {
69+
options.optimizeSSR = false
70+
return options
8471
})
8572
} else {
86-
webpackConfig = mergeWebpack(webpackConfig, {
87-
plugins: [
88-
new VueSSRServerPlugin(),
89-
new WebpackBar({
90-
name: 'Server',
91-
color: 'orange',
92-
}),
93-
],
94-
externals: nodeExternals({
95-
whitelist: config.nodeExternalsWhitelist,
96-
}),
97-
output: {
98-
libraryTarget: 'commonjs2',
99-
},
100-
target: 'node',
101-
devtool: 'source-map',
102-
optimization: {
103-
splitChunks: false,
104-
minimize: false,
105-
},
106-
})
73+
webpackConfig.plugin('ssr').use(VueSSRServerPlugin)
74+
webpackConfig.plugin('loader').use(WebpackBar, [{name: 'Server', color: 'orange'}])
10775

108-
delete webpackConfig.node
109-
}
76+
webpackConfig.devtool('source-map')
77+
webpackConfig.externals(nodeExternals({whitelist: config.nodeExternalsWhitelist}))
78+
webpackConfig.output.libraryTarget('commonjs2'); webpackConfig.target('node')
79+
webpackConfig.optimization.splitChunks(false).minimize(false)
11080

111-
for (const rule of webpackConfig.module.rules) {
112-
if (rule.use) {
113-
for (const item of rule.use) {
114-
item.options = item.options || {}
115-
if (item.loader === 'cache-loader' && !isClient) {
116-
// Change cache directory for server-side
117-
item.options.cacheIdentifier += '-server'
118-
item.options.cacheDirectory += '-server'
119-
} else if (item.loader === 'vue-loader') {
120-
// Optimize SSR only on server-side
121-
if (isClient) {
122-
item.options.optimizeSSR = false
123-
} else {
124-
item.options.cacheIdentifier += '-server'
125-
item.options.cacheDirectory += '-server'
126-
item.options.optimizeSSR = true
127-
}
128-
}
129-
}
81+
webpackConfig.node.clear()
82+
83+
if (!isClient) {
84+
webpackConfig.module.rule('vue').use('cache-loader').tap(options => {
85+
// Change cache directory for server-side
86+
options.cacheIdentifier += '-server'
87+
options.cacheDirectory += '-server'
88+
return options
89+
})
13090
}
91+
92+
webpackConfig.module.rule('vue').use('vue-loader').tap(options => {
93+
if (!isClient) {
94+
options.cacheIdentifier += '-server'
95+
options.cacheDirectory += '-server'
96+
}
97+
options.optimizeSSR = !isClient
98+
return options
99+
})
131100
}
132101

133-
return webpackConfig
102+
return service.resolveWebpackConfig(webpackConfig)
134103
}

0 commit comments

Comments
 (0)