ydoc
Version:
基于 Markdown 的静态站点生成工具
86 lines (77 loc) • 2.34 kB
JavaScript
const chokidar = require('chokidar');
const path = require('path')
const child_process = require('child_process');
const utils = require('../utils')
const ora = require('ora');
let port = 9999;
function runner() {
const spinner = ora('').start();
const ydocPath = path.resolve(path.dirname(__dirname), '../bin/ydoc')
child_process.exec(`node ${ydocPath} build --mode=dev`, function(error, stdout, stderr){
spinner.stop()
if(error) throw error;
if(stdout) process.stdout.write(stdout);
if(stderr) process.stdout.write(stderr);
utils.log.ok('Starting up http-server: http://127.0.0.1:' + port)
})
}
function preventDuplication(time = 500) {
let sign = true;
return function (fn, ...arg) {
if (sign === false) return;
sign = false;
setTimeout(function () {
sign = true;
fn.apply(this, arg);
}, time)
}
}
function init() {
const ydocPath = path.resolve(__dirname, '../..')
const paths = [
path.resolve(ydocPath, './src'),
path.resolve(ydocPath, './theme')
]
const projectPath = utils.projectPath;
const configFilepath = utils.getConfigPath(projectPath);
const config = utils.getConfig(configFilepath);
config.root = config.root || utils.defaultDocsPath;
config.root = path.resolve(projectPath, config.root);
const buildPath = config.dist || utils.defaultBuildPath;
paths.push(config.root);
if (configFilepath) paths.push(configFilepath)
return {
paths: paths,
buildPath: path.resolve(projectPath, buildPath)
};
}
function server(buildPath){
const Koa = require('koa');
var liveload = require('../live-reload');
const app = new Koa();
app.use(liveload(buildPath))
app.use(require('koa-static')(buildPath));
app.listen(port);
}
module.exports = {
setOptions: function (yargs) {
yargs.option('port', {
describe: 'Port of server',
default: 9999
})
},
run: function (argv) {
let preventDuplicationRunner = preventDuplication()
port = argv.port;
let config = init()
runner()
server(config.buildPath)
chokidar.watch(config.paths, {
ignoreInitial: true
}).on('all', () => {
config = init()
preventDuplicationRunner(runner)
})
},
desc: 'Starts a local server. By default, this is at http://127.0.0.1:' + port
}