mooncake-cli
Version:
118 lines (103 loc) • 2.91 kB
JavaScript
const path = require('path')
const fs = require('fs')
const cwd = process.cwd()
const pagePath = path.join(cwd, 'src/pages')
const resolvePath = function(subPath) {
return path.resolve(cwd, subPath)
}
function getFiles(path) {
let allFileList = []
getAllFile(path)
function getAllFile(path) {
let files = []
if (fs.existsSync(path)) {
files = fs.readdirSync(path)
files.forEach(file => {
const curPath = path + '/' + file
if (fs.statSync(curPath).isDirectory()) {
getAllFile(curPath)
} else {
if (file === 'index.js') {
const pageName = path.split('/').pop()
const conf = path + '/conf.json'
allFileList.push([pageName, curPath, conf]) //pagename entry conf
}
}
})
}
}
return allFileList
}
const getDevEntry = (entryPath) => {
const fileList = getFiles(entryPath)
const hotScript = path.join(__dirname, '../../node_modules/webpack-hot-middleware/client?reload=true')
const entry = {}
fileList.forEach((item) => {
entry[item[0]] = [item[1], hotScript]
})
return entry
}
const getBuildEntry = (entryPath) => {
const fileList = getFiles(entryPath)
const entry = {}
fileList.forEach((item) => {
entry[item[0]] = item[1]
})
return entry
}
const htmlTemplate = (conf) => {
const {title, css, js} = conf
const links = css.map(function(href) {
return `<link href="${href}" rel="stylesheet">`
}).join('')
const scripts = js.map(function(src) {
return `<script src="${src}"></script>`
}).join('')
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>${title}</title>
${links}
<link href="//cdn.bootcss.com/normalize/8.0.0/normalize.min.css" rel="stylesheet">
<link rel="shortcut icon" href="//cdn.myweimai.com/images/f2b5baf03e211895a9870d2769efbef6_16x16.ico">
<meta name="format-detection" content="email=no,address=no,telephone=no">
<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>
</head>
<body>
<div id="container"></div>
<script src="//m.myweimai.com/common_js/react16_2_0.js"></script>
<script src="//m.myweimai.com/common_js/react_dom16_2_0.js"></script>
${scripts}
</body>
</html>
`
}
const getPages = (path) => {
const fileList = getFiles(path)
const multiplePages = []
function pageObj(item) {
const conf = JSON.parse(fs.readFileSync(item[2]))
return {
templateContent: htmlTemplate(conf),
filename: `${item[0]}.html`,
chunks: [item[0], 'common'],
minify: {
removeComments: true,
collapseWhitespace: true
}
}
}
fileList.forEach((item) => {
multiplePages.push(pageObj(item))
})
return multiplePages
}
module.exports = {
resolvePath,
getDevEntry,
getBuildEntry,
getPages,
pagePath
}