|
1 | 1 | 'use strict'
|
2 | 2 |
|
3 |
| -module.exports = async function dev (sourceDir, cliOptions = {}) { |
| 3 | +module.exports = async (sourceDir, cliOptions = {}, ctx) => { |
| 4 | + const { server, host, port } = await prepareServer(sourceDir, cliOptions, ctx) |
| 5 | + server.listen(port, host, err => { |
| 6 | + if (err) { |
| 7 | + console.log(err) |
| 8 | + } |
| 9 | + }) |
| 10 | +} |
| 11 | + |
| 12 | +module.exports.prepare = prepareServer |
| 13 | + |
| 14 | +async function prepareServer (sourceDir, cliOptions = {}, context) { |
| 15 | + const WebpackDevServer = require('webpack-dev-server') |
4 | 16 | const { path } = require('@vuepress/shared-utils')
|
5 | 17 | const webpack = require('webpack')
|
6 | 18 | const chokidar = require('chokidar')
|
7 |
| - const serve = require('webpack-serve') |
8 |
| - const convert = require('koa-connect') |
9 |
| - const mount = require('koa-mount') |
10 |
| - const range = require('koa-range') |
11 |
| - const serveStatic = require('koa-static') |
12 |
| - const history = require('connect-history-api-fallback') |
13 | 19 |
|
14 | 20 | const prepare = require('./prepare/index')
|
15 |
| - const { chalk, fs, logger } = require('@vuepress/shared-utils') |
| 21 | + const { chalk, logger } = require('@vuepress/shared-utils') |
16 | 22 | const HeadPlugin = require('./webpack/HeadPlugin')
|
17 | 23 | const DevLogPlugin = require('./webpack/DevLogPlugin')
|
18 | 24 | const createClientConfig = require('./webpack/createClientConfig')
|
19 | 25 | const { applyUserWebpackConfig } = require('./util/index')
|
20 | 26 | const { frontmatterEmitter } = require('@vuepress/markdown-loader')
|
21 | 27 |
|
22 |
| - logger.wait('Extracting site metadata...') |
23 |
| - const ctx = await prepare(sourceDir, cliOptions, false /* isProd */) |
| 28 | + const ctx = context || await prepare(sourceDir, cliOptions, false /* isProd */) |
24 | 29 |
|
25 | 30 | // setup watchers to update options and dynamically generated files
|
26 | 31 | const update = (reason) => {
|
@@ -105,52 +110,52 @@ module.exports = async function dev (sourceDir, cliOptions = {}) {
|
105 | 110 | config = applyUserWebpackConfig(userConfig, config, false /* isServer */)
|
106 | 111 | }
|
107 | 112 |
|
| 113 | + const serverConfig = Object.assign({ |
| 114 | + disableHostCheck: true, |
| 115 | + compress: true, |
| 116 | + clientLogLevel: 'error', |
| 117 | + hot: true, |
| 118 | + quiet: true, |
| 119 | + headers: { |
| 120 | + 'access-control-allow-origin': '*' |
| 121 | + }, |
| 122 | + publicPath: ctx.base, |
| 123 | + watchOptions: { |
| 124 | + ignored: /node_modules/ |
| 125 | + }, |
| 126 | + historyApiFallback: { |
| 127 | + rewrites: [ |
| 128 | + { from: /\.html$/, to: '/' } |
| 129 | + ] |
| 130 | + }, |
| 131 | + overlay: false, |
| 132 | + host, |
| 133 | + contentBase: path.resolve(sourceDir, '.vuepress/public'), |
| 134 | + before (app, server) { |
| 135 | + ctx.pluginAPI.options.beforeDevServer.syncApply(app, server) |
| 136 | + }, |
| 137 | + after (app, server) { |
| 138 | + ctx.pluginAPI.options.afterDevServer.syncApply(app, server) |
| 139 | + } |
| 140 | + }, ctx.siteConfig.devServer || {}) |
| 141 | + |
| 142 | + WebpackDevServer.addDevServerEntrypoints(config, serverConfig) |
| 143 | + |
108 | 144 | const compiler = webpack(config)
|
| 145 | + const server = new WebpackDevServer(compiler, serverConfig) |
109 | 146 |
|
110 |
| - const nonExistentDir = path.resolve(__dirname, 'non-existent') |
111 |
| - await serve({ |
112 |
| - // avoid project cwd from being served. Otherwise if the user has index.html |
113 |
| - // in cwd it would break the server |
114 |
| - content: [nonExistentDir], |
115 |
| - compiler, |
| 147 | + return { |
| 148 | + server, |
116 | 149 | host,
|
117 |
| - dev: { logLevel: 'warn' }, |
118 |
| - hot: { |
119 |
| - port: port + 1, |
120 |
| - logLevel: 'error' |
121 |
| - }, |
122 |
| - logLevel: 'error', |
123 | 150 | port,
|
124 |
| - open: cliOptions.open, |
125 |
| - add: app => { |
126 |
| - // apply plugin options to extend dev server. |
127 |
| - ctx.pluginAPI.options.enhanceDevServer.syncApply(app) |
128 |
| - |
129 |
| - const userPublic = path.resolve(sourceDir, '.vuepress/public') |
130 |
| - |
131 |
| - // enable range request |
132 |
| - app.use(range) |
133 |
| - |
134 |
| - // respect base when serving static files... |
135 |
| - if (fs.existsSync(userPublic)) { |
136 |
| - app.use(mount(ctx.base, serveStatic(userPublic))) |
137 |
| - } |
138 |
| - |
139 |
| - app.use(convert(history({ |
140 |
| - rewrites: [ |
141 |
| - { from: /\.html$/, to: '/' } |
142 |
| - ] |
143 |
| - }))) |
144 |
| - } |
145 |
| - }) |
| 151 | + ctx |
| 152 | + } |
146 | 153 | }
|
147 | 154 |
|
148 | 155 | function resolveHost (host) {
|
149 |
| - // webpack-serve hot updates doesn't work properly over 0.0.0.0 on Windows, |
150 |
| - // but localhost does not allow visiting over network :/ |
151 |
| - const defaultHost = process.platform === 'win32' ? 'localhost' : '0.0.0.0' |
| 156 | + const defaultHost = 'localhost' |
152 | 157 | host = host || defaultHost
|
153 |
| - const displayHost = host === defaultHost && process.platform !== 'win32' |
| 158 | + const displayHost = host === defaultHost |
154 | 159 | ? 'localhost'
|
155 | 160 | : host
|
156 | 161 | return {
|
|
0 commit comments