cyb-cli
Version:
塞伯坦CYB-CLI是面向前端模块化工程的构建工具。主要目的是帮助开发者统一前端开发模式和项目开发结构,提高功能扩展和降低维护成本,自动化前端工作流,提高开发效率和开发质量。
130 lines (111 loc) • 3.9 kB
JavaScript
/**
* =================================
* @2018 塞伯坦-CYB前端模块化工程构建工具
* https://github.com/jd-cyb/cyb-cli
* =================================
*/
const glob = require('glob')
const fancyLog = require('fancy-log')
const chalk = require('chalk')
const path = require('path')
const webpack = require('webpack')
const merge = require('webpack-merge')
const config = require('../fezconfig')
const outputPath = require('./output-path')
const webpackGlob = () => {
return new Promise((resolve, reject) => {
glob(path.join(process.cwd(), 'webpack.config*.js'), (error, files) => {
let webpackConfigGlob = {}
files.map((file) => {
webpackConfigGlob = merge(webpackConfigGlob, require(file))
})
resolve(webpackConfigGlob)
})
})
}
module.exports = {
/**
* 研发任务
*/
dev() {
try {
return new Promise((resolve, reject) => {
process.env.NODE_ENV = 'development'
webpackGlob().then((webpackGlobData) => {
let webpackConfig = merge(config.webpack.config, webpackGlobData, require('./config.base'), require('./config.dev'))
// console.log(JSON.stringify(webpackConfig))
glob(path.join(process.cwd(), config.paths.src.appJs, `*/index${config.entryExt}`), (error, files) => {
//获取所有JS入口
files.map((file) => {
const source_name = path.dirname(file).split('/').pop()
webpackConfig.entry[outputPath.js(source_name)] = ['webpack/hot/dev-server', 'webpack-hot-middleware/client?reload=true', file]
})
let compiler = webpack(webpackConfig)
resolve({
compiler: compiler,
webpackConfig: webpackConfig
})
})
})
})
} catch (error) {
if (error) {
throw new Error(error)
}
}
},
/**
* 生产任务
*/
dist() {
try {
return new Promise((resolve, reject) => {
process.env.NODE_ENV = 'production'
webpackGlob().then((webpackGlobData) => {
let webpackConfig = merge(config.webpack.config, webpackGlobData, require('./config.base'), require('./config.dist'))
/**
* 合并自定义vendor脚本
*/
for (let item of config.webpack.extract.js) {
webpackConfig.optimization.splitChunks.cacheGroups[`vendor-webpack-${item.target}`] = {
name: path.join(outputPath.js(), `vendor-webpack-${item.target}`),
chunks: 'all',
test: function(module) {
return (
module.resource &&
new RegExp(`node_modules\/(${item.chunk.join('|')})\/(.*)\.js$`).test(module.resource)
)
}
}
}
glob(path.join(process.cwd(), config.paths.src.appJs, `*/index${config.entryExt}`), (error, files) => {
//获取所有js入口
files.map((file) => {
const source_name = path.dirname(file).split('/').pop()
webpackConfig.entry[source_name] = file
})
webpack(webpackConfig, function(err, stats) {
//致命的 wepback 错误(配置出错等)
if (err) throw err
//编译错误(缺失的 module,语法错误等)
// const info = stats.toJson()
// info.errors 错误详情
if (stats.hasErrors()) {
fancyLog.error(chalk.red('语法错误、或缺失module'))
}
// //编译告警
// if (stats.hasWarnings()) {
// fancyLog.warn(info.warnings)
// }
resolve()
})
})
})
})
} catch (error) {
if (error) {
throw new Error(error)
}
}
}
}