cyb-cli
Version:
塞伯坦CYB-CLI是面向前端模块化工程的构建工具。主要目的是帮助开发者统一前端开发模式和项目开发结构,提高功能扩展和降低维护成本,自动化前端工作流,提高开发效率和开发质量。
545 lines (467 loc) • 14.2 kB
JavaScript
/**
* =================================
* @2018 塞伯坦-CYB前端模块化工程构建工具
* https://github.com/jd-cyb/cyb-cli
* =================================
*/
/**
* ---------------------------------
* 工程框架配置文件
* ---------------------------------
* 每个项目目录中的配置文件会覆盖此文件中的默认配置
*/
require('babel-register')({
babelrc: false,
presets: ['env']
})
const path = require('path')
const fs = require('fs')
const _ = require('lodash')
const fezConfigDefault = {
/**
* -------------------------------
* 项目目录名称
* -------------------------------
*/
projectName: process.cwd().split(path.sep).pop(),
/**
* 页面入口脚本扩展名,可以改为.ts、.jsx等
*/
entryExt: '.js',
/**
* -------------------------------
* webpack配置
* -------------------------------
*/
webpack: {
/**
* 相当于webpack.config.js的配置功能
* 根据需求场景每个项目均可安装loader、plugin及个性化配置
*/
config: {},
/**
* 用于提取合并公共模块
* {
* target: '{打包名称}',
* chunk: ['{chunk1名称}','{chunk2名称}','{chunk3名称}']
* }
*/
extract: {
js: []
},
/**
* webpack打包档案分析
*/
analyzer: {
available: false,
options: {}
},
/**
* css-loader配置
*/
cssLoader: {
options: {
sourceMap: true
}
},
/**
* less-loader配置
*/
lessLoader: {
options: {
sourceMap: true
}
},
/**
* sass-loader配置
*/
sassLoader: {
options: {
sourceMap: true
}
},
/**
* stylus-loader配置
*/
stylusLoader: {
options: {
sourceMap: true
}
}
},
/**
* 雪碧图配置
* 配置参考:https://github.com/kisenka/svg-sprite-loader#configuration
*/
svgSprite: {
options: {
publicPath: 'static/svg'
}
},
/**
* autoprefixer 配置
* 配置参考:https://github.com/postcss/autoprefixer#options
*/
autoprefixer: {
options: {
overrideBrowserslist: ["> 1%", "last 2 versions", "not ie <= 8"]
}
},
/**
* -------------------------------
* 侵入式mock配置
* /* @if MOCK *\/
* code...
* /* @endif *\/
* -------------------------------
* 配置参考:
* https://github.com/furic-zhao/fezmock/wiki
*/
useMock: {
dev: false, // dev打包使用Mock数据
dist: false // dist打包使用Mock数据
},
/**
* -------------------------------
* 样式编译器配置
* 仅适用于部署在src/static/styles目录中的样式
* -------------------------------
*/
style: {
/**
* less配置
* https://www.npmjs.com/package/gulp-less
*/
lessOptions: {},
/**
* sass配置
* https://www.npmjs.com/package/gulp-sass
*/
sassOptions: {},
/**
* stylus配置
* https://github.com/stevelacy/gulp-stylus
*/
stylusOptions: {}
},
/**
* -------------------------------
* 启用 PX => REM 自动化转换
* 如果启用 REM 转换需要在公共样式中对<html>设置基准值
* 通过 media媒体查询 为 <html> 设置不同值 以实现在不同的屏幕中等比缩放
* -------------------------------
*/
useREM: {
css: {
available: false, //启用 样式中的 px => rem 转换
/**
* 配置参考:
* https://github.com/cuth/postcss-pxtorem
*/
options: {
rootValue: 16, //相对于html根字体大小
unitPrecision: 5, //允许REM单位增长到的十进制数
propList: ["*"], //可以从px更改为rem的属性
selectorBlackList: [], //要忽略的选择器
replace: true, //替换包含rems的规则,而不是添加fallback
mediaQuery: false, //允许在媒体查询中转换px
minPixelValue: 0 //设置要替换的最小像素值
}
}
},
/**
* -------------------------------
* 图片压缩默认配置
* -------------------------------
*/
imagemin: {
jpg: {
/**
* jpg图片默认压缩质量
*/
quality: 85
},
gif: {
/**
* gif图片默认压缩质量
*/
optimizationLevel: 1
},
png: {}
},
/**
* -------------------------------
* 压缩ttf
* -------------------------------
*/
fontmin: {
/**
* 填写需要显示特殊字体的文本内容
*/
text: ``
},
/**
* -------------------------------
* 生产环境 启用 图片 => webp 自动化转换
* -------------------------------
*/
useWebp: {
available: false,
/**
* 配置参考:
* https://github.com/imagemin/imagemin-webp
*/
options: {
quality: 75, //将质量因子设置为0到100。
alphaQuality: 100, //将透明度 - 压缩质量设置为0到100。
method: 4, //指定要使用的压缩方法,介于0(最快)和6(最慢)之间。此参数控制编码速度与压缩文件大小和质量之间的折衷。
sns: 80, //设置空间噪声整形的幅度在0和100之间
lossless: false //无损编码图像
}
},
/**
* -------------------------------
* 生产环境 启用添加CDN地址前缀
* -------------------------------
*/
useCdn: {
available: false,
extFile: 'css,html', // 替换CDN地址的文件扩展名
base: "//cybcdn.com/cdndemo/", // 默认CDN地址
// js: "http://js.fezcdn.com/", // 脚本CDN地址
// css: "http://css.fezcdn.com/", // 样式CDN地址
// images: "http://img.fezcdn.com/", // 图片CDN地址
// fonts: "http://fonts.fezcdn.com/" // 字体CDN地址
},
/**
* -------------------------------
* 生产环境 上传sftp服务器配置信息
* -------------------------------
*/
sftp: {
host: "", // ssh服务器地址
port: "", // ssh服务器端口号,默认是22
user: "", // ssh服务器登录用户名
password: "", // ssh服务器登录密码
remotePath: "", // 上传到ssh服务器的目录
includeHtml: true // 是否包含 html 文件
},
/**
* -------------------------------
* 合并静态资源
* 仅适用于使用bower安装的第三方框架库资源
* 及部署在src/common目录中的项目公共脚本
* 【支持自定义合并多个文件到一个文件】
* 【支持自定义合并单个文件】
* 【未配置的文件合并打包成一个文件】
* 【插入页面顺序以配置顺序降序排列】
* 【合并顺序以文件配置先后降序排列】
* -------------------------------
*/
merge: {
/**
* 用于合并使用bower安装的第三方框架库资源
*/
vendor: {
available: true, //启用 vendor 文件自动化注入
/**
* 合并vendor脚本
* {
* target: '{打包名称}.js',
* contain: ['**\/{文件1}.js', '**\/{文件2}.js', '**\/{文件3}.js']
* }
*/
js: [],
/**
* 合并vendor样式
* {
* target: '{打包名称}.css',
* contain: ['**\/{文件1}.css', '**\/{文件2}.css', '**\/{文件3}.css']
* }
*/
css: []
},
/**
* 用于合并部署在src/common目录中的项目公共资源
*/
common: {
available: true, //启用 common 文件自动化注入
/*
* 合并common脚本
* {
* target: '{打包名称}.js',
* contain: ['**\/{文件1}', '**\/{文件2}', '**\/{文件3}']
* }
*/
js: []
},
/**
* 页面对应的js、css自动注入到页面
* src/static/styles/{对应的页面名称}.{less,scss,styl,css}
* src/views/{对应的页面目录名称}/index.js
*/
page: true //启用 对应页面脚本和样式 自动化注入
},
/**
* -------------------------------
* 生产环境css压缩配置
* -------------------------------
*/
useCssMin: {
available: true,
options: {
safe: true,
reduceTransforms: false,
rebase: false,
advanced: false, // 类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: "ie8", // 保留ie7及以下兼容写法(hack写法) 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepSpecialComments: 0 // 保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
}
},
/**
* -------------------------------
* 生产环境 html压缩配置
* -------------------------------
*/
useHtmlMin: {
available: true,
/**
* 配置参考:
* https://github.com/kangax/html-minifier
*/
options: {
removeComments: true, //清除HTML注释
collapseWhitespace: true, //压缩HTML
collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input checked />
removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true, //删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true, //删除<style>和<link>的type="text/css"
minifyJS: true, //压缩页面JS
minifyCSS: true //压缩页面CSS
}
},
/**
* -------------------------------
* browsersync配置信息
* -------------------------------
*/
browsersync: {
dev: {
available: true, // 研发环境是否开启浏览器自动化刷新
/**
* 配置参考:
* http://www.browsersync.cn/docs/options/
*/
options: {
port: 8080, // 研发环境 本地服务器的默认端口
startPath: "zindex.html"
}
},
test: {
/**
* 配置参考:
* http://www.browsersync.cn/docs/options/
*/
options: {
port: 8080, // 研发环境 本地服务器的默认端口
startPath: "zindex.html"
}
}
},
/**
* proxy转发
*/
proxy: [],
/**
* -------------------------------
* 路径配置
* -------------------------------
*/
paths: {
dir: "./",
/**
* 源码目录配置
*/
src: {
dir: "./src", //源码根目录
img: "./src/static/images", //图片目录
svg: "./src/static/svg", //SVG源文件目录
fonts: "./src/static/fonts", //字体存放目录
common: "./src/common", //项目公共库文件
custom: "./src/custom", //自定义文件目录
vendor: "./src/vendor", //第三方公共文件库目录
appJs: "./src/views", //每个页面目录下的index.js 入口文件
styles: "./src/static/styles",
html: "./src/views", //所有html文件
},
/**
* 开发目录配置
*/
dev: {
dir: "./dev", //开发环境根目录
common: "./dev/common", //公共库文件生成目录
custom: "./dev/custom", //自定义文件目录
appjs: "./dev/static/js", //编译后的业务逻辑存放目录
css: "./dev/static/css", //编译后的css代码存放目录
fonts: "./dev/static/fonts", //编译后的字体文件存放目录
img: "./dev/static/images", //压缩后的图片存放目录
svg: "./dev/static/svg", //压缩后的图片存放目录
html: "./dev" //html编译后的存放目录
},
/**
* 缓存目录配置
*/
tmp: {
dir: "./tmp", //缓存根目录
common: "./tmp/common", //公共库文件生成目录
custom: "./tmp/custom", //自定义文件目录
appjs: "./tmp/static/js", //编译后的业务逻辑存放目录
css: "./tmp/static/css", //编译后的css代码存放目录
fonts: "./tmp/static/fonts", //编译后的字体文件存放目录
img: "./tmp/static/images", //压缩后的图片存放目录
svg: "./tmp/static/svg", //处理后的SVG存放目录
media: "./tmp/static/media", //处理后的SVG存放目录
html: "./tmp" //html编译后的存放目录
},
/**
* 生产目录配置
*/
dist: {
dir: "./dist", //生产环境根目录
common: "./dist/common", //公共库文件生成目录 (已废弃)
custom: "./dist/custom", //自定义文件目录
appjs: "./dist/static/js", //编译后脚本代码存放目录
css: "./dist/static/css", //编译后的css代码存放目录
fonts: "./dist/static/fonts", //编译后的字体文件存放目录
img: "./dist/static/images", //压缩后的图片存放目录
svg: "./dist/static/svg", //处理后的SVG存放目录
html: "./dist" //html编译后的存放目录
},
/**
* 测试目录配置
*/
test: {
dir: "./test", //测试环境 根目录
custom: "./test/custom", //自定义文件目录
appjs: "./test/static/js", //编译后脚本代码存放目录
css: "./test/static/css", //编译后的css代码存放目录
fonts: "./test/static/fonts", //编译后的字体文件存放目录
img: "./test/static/images", //压缩后的图片存放目录
svg: "./dist/static/svg", //处理后的SVG存放目录
html: "./test" //html编译后的存放目录
}
}
}
const fezConfig = {}
const fezConfigPath = path.resolve(process.cwd(), 'fez.config.js')
const cybConfigPath = path.resolve(process.cwd(), 'cyb.config.js')
if (fs.existsSync(cybConfigPath)) {
const cybConfigProject = require(cybConfigPath)
Object.assign(fezConfig, _.defaultsDeep((cybConfigProject.default || cybConfigProject), fezConfigDefault))
} else if (fs.existsSync(fezConfigPath)) {
const fezConfigProject = require(fezConfigPath)
Object.assign(fezConfig, _.defaultsDeep((fezConfigProject.default || fezConfigProject), fezConfigDefault))
} else {
Object.assign(fezConfig, fezConfigDefault)
}
module.exports = fezConfig