docusaurus/lib/dev.js
2018-07-28 20:25:38 +08:00

92 lines
2.4 KiB
JavaScript

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: '/'}]
})
)
);
}
}
);
};