mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-15 10:07:33 +02:00
feat: prototype dev server
This commit is contained in:
parent
2ab412e563
commit
333574efe6
11 changed files with 524 additions and 38 deletions
95
lib/dev.js
95
lib/dev.js
|
@ -1,3 +1,92 @@
|
|||
module.exports = async function dev(sourceDir, cliOptions = {}) {
|
||||
console.log('Development');
|
||||
};
|
||||
const ora = require('ora');
|
||||
const path = require('path');
|
||||
const chalk = require('chalk');
|
||||
const webpack = require('webpack');
|
||||
const fs = require('fs-extra');
|
||||
const chokidar = require('chokidar');
|
||||
const serve = require('webpack-serve');
|
||||
const convert = require('koa-connect');
|
||||
const mount = require('koa-mount');
|
||||
const range = require('koa-range');
|
||||
const serveStatic = require('koa-static');
|
||||
const history = require('connect-history-api-fallback');
|
||||
const load = require('./loader');
|
||||
const createDevConfig = require('./webpack/dev');
|
||||
|
||||
module.exports = async function dev(sourceDir, cliOptions = {}) {
|
||||
const logger = ora(chalk.blue('Start development server')).start();
|
||||
|
||||
// load site props from preprocessed files in source directory
|
||||
const props = await load(sourceDir);
|
||||
|
||||
// Reload for any add/remove of file
|
||||
const reload = () => {
|
||||
const reloadLogger = ora({
|
||||
color: 'green',
|
||||
text: chalk.green('Reloading files')
|
||||
}).start();
|
||||
load(sourceDir)
|
||||
.then(() => {
|
||||
setTimeout(() => {
|
||||
reloadLogger.stop();
|
||||
}, 1000);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(chalk.red(err.stack));
|
||||
});
|
||||
};
|
||||
const fsWatcher = chokidar.watch(['**/*.md'], {
|
||||
cwd: sourceDir,
|
||||
ignoreInitial: true
|
||||
});
|
||||
fsWatcher.on('add', reload);
|
||||
fsWatcher.on('change', reload);
|
||||
fsWatcher.on('unlink', reload);
|
||||
fsWatcher.on('addDir', reload);
|
||||
fsWatcher.on('unlinkDir', reload);
|
||||
|
||||
// resolve webpack config
|
||||
let config = createDevConfig(props);
|
||||
|
||||
// create compiler from generated webpack config
|
||||
config = config.toConfig();
|
||||
const compiler = webpack(config);
|
||||
logger.succeed();
|
||||
|
||||
// webpack-serve
|
||||
const serveContentDir = path.resolve(__dirname, 'serveContent');
|
||||
const port = cliOptions.port || 8080;
|
||||
await serve(
|
||||
{},
|
||||
{
|
||||
content: [serveContentDir],
|
||||
compiler,
|
||||
devWare: {logLevel: 'warn'},
|
||||
hotClient: {
|
||||
port: port + 1,
|
||||
logLevel: 'error'
|
||||
},
|
||||
logLevel: 'error',
|
||||
port,
|
||||
add: app => {
|
||||
const userPublic = path.resolve(sourceDir, '.blogi/public');
|
||||
|
||||
// enable range request
|
||||
app.use(range);
|
||||
|
||||
// respect base when serving static files...
|
||||
if (fs.existsSync(userPublic)) {
|
||||
app.use(mount(props.publicPath, serveStatic(userPublic)));
|
||||
}
|
||||
|
||||
app.use(
|
||||
convert(
|
||||
history({
|
||||
rewrites: [{from: /\.html$/, to: '/'}]
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue