boi-cli
v1.1.6
Published
cli tool for boi
Downloads
41
Readme
Boi-cli
boi is short for bolshoi
基于webpack的前端工程构建工具。
Get Start
安装
npm install boi-cli -g
创建boi项目
boi安装成功后,在工作目录内运行:
boi new boi-demo
或者在已存在目录下运行:
boi new .
命令行将依次有以下提示:
自定义项目名称,默认项目名称为app。
选择项目类型,上图中依次为常规项目、vue作为第三方库单独引入的项目和vue参与webpack打包的项目。
常规项目不限制任何选型,开发者可以自由使用第三方库的引入方式(script标签、npm等)。同时,常规项目的boi-conf.js只有最基本的配置,也就是说,如果在常规项目中使用vue,开发者需自行进行配置。
选择npm第三方依赖。
最终确认。
配置完毕后,boi会自动安装npm第三方依赖。全部执行成功后,生成的项目目录如下图:
编译项目文件
- 在项目根目录下创建文件
boi-conf.js
; - 编辑
boi-conf.js
中的配置项,比如js文件的编译配置如下:
boi.spec('js', {
extType: 'js',
srcType: ['es2015'],
srcDir: 'js',
destDir: 'js'
});
在项目根目录下执行boi build
。默认是dev环境的编译,会生成souremap文件以方便debug。
生产环境的编译执行:
boi build prod
prod环境编译输出的文件不会产生souremap。
使用插件
编辑boi-conf.js
,使用API boi.use
引入插件,比如:
boi.use('boi-plugin-loader-vue');
boi会判断用户是否已安装此插件,如果没有,则boi会自动安装此插件。
建议自行安装插件,boi使用npm安装插件,由于一些原因可能会安装失败
如果npm被墙,请尝试以下任意一种方案:
- 挂VPN;
- 修改npm仓库到淘宝镜像
npm config set registry https://registry.npm.taobao.org
; - 安装cnpm。
如果安装cnpm,请务必自行安装插件
dev server
项目根目录下执行:
boi serve
执行成功后,如果项目中只存在一个index.*.html
文件,可直接访问localhost:8888
即可;如果项目中存在多个index.*.html
文件,访问localhost:8888/*.html
或者localhost:8888/views/*.html
(html文件根据具体命名改动)。boi支持动态编译,开发过程中不必多次重启dev server。
规范(v1.0.0)
boi框架约定了一套默认开发规范(可配置),包括目录规范、文件命名规范和部分编码规范。
目前v1.0.0规范比较宽松,后续版本会制定详细约束。
目录规范
开发源码目录:
src
- JS源码目录:
src/js
; - style源码目录:
src/style
; - html模板源码目录:
src/views
; - 媒体资源原始文件目录:
src/assets
。
- JS源码目录:
第三方库文件目录:
libs
boi不支持非npm管理的第三方库文件打包。此类库文件应该是多项目共用的,建议使用固定CDN地址引用。
本地编译输出目录:
dest
命名规范
目前(v1.0.0)规范中只约定了入口文件的命名规范,子文件暂时不做约束。
所有文件遵循以下规范:
- 不论是否在相同子目录内,同类型文件一定不能重名,否则会编译出错;
- 源码中引用其他文件使用相对目录。
JS文件命名规范
- 存放目录:
src/js
; - 入口文件以
main
为命名前缀。比如main.app.js
; - 子文件一定不要以
main
为命名前缀。
style文件命名规范
- 存放目录:
src/style
; - 入口文件以
main
为命名前缀。比如main.app.scss
; - 子文件一定不要以
main
为命名前缀。
html模板文件命名规范
- 存放目录:
src/views
; - 以
index
为命名前缀。比如main.app.html
;
编码规范
资源引用规范
由于webpack不支持style文件作为编译入口,所以style文件必须借助JS文件引入。比如
main.app.js
中引入main.app.scss
语法如下:import '../style/main.app.scss';
html模板引用JS、style文件时,只需写文件名即可,不能写任何与路径相关的字符,否则会编译出错。如下:
<script src="main.suyun.comment.js"></script>
编译后的结果如下:
<script src="/js/main.suyun.comment.fb74692f.js"></script>
html模板引用第三方库文件使用绝对路径。如下:
<script src="/libs/vue.min.js" charset="utf-8"></script>
boi不对第三方库文件进行编译,上述的引用建议只在本地开发中使用,真实上线文件请使用公司通用的第三方库文件url。
模块化开发规范
目前v1.0.0版本支持CommonJS和AMD规范,两者在load on demand模块的打包中有细微差别。
CommonJS
CommonJS使用
require.ensure
实现load on demand,如下:import a from './part/part.a.js'; import b from './part/part.b.js'; window.onload = function() { console.log('main chunk a is loaded'); a(); b(); document.body.onclick = function() { // 第三个参数是chunk name,决定编译打包的文件名称 require.ensure([], (require) => { let c = require('./part/part.c'); c.fn(); }, 'asyncC'); } };
require.ensure
的第三个参数必须指定,这个参数影响打包输出的文件名称。上述文件打包后输出结果如下:红框处即
require.ensure
的第三个参数值,如果不指定此参数,编译后的结果为:AMD
以实现AMD规范的require.js为例,其实现load on demand的语法如下:
import '../styles/main.a.scss'; // ADM sample require(['./part/part.a.js', './part/part.b.js'], function(a, b) { console.log('main chunk a is loaded'); a(); b(); document.body.onclick = function() { require(['./part/part.c.js'], function(c) { c(); }); } });
AMD规范无法配置load on demand模块的文件文件名,输出的编译文件如下:
webpack虽然提供配置输出chunk文件名的API,但是AMD规范目前无法实现,也可能是本人未研究透彻,希望各位指正。
配置API
boi配置文件位于项目根目录,文件名为boi-conf.js
。
目前v1.0.0支持的可配置项有:
spec
配置项是编译项目的配置,包括以下几种:
basic
:Object
,基础配置;js
:Object
,JS文件的编译配置项;style
:Object
,style文件的编译配置项;html
:Object
,html模板文件的编译配置项;image
:Object
,图片文件的编译配置项。
serve
配置项是dev server的配置,包括以下几种:
port
:String
,修改默认监听端口;domain
:String
,修改默认监听域名
目前版本支持的配置项较少,以满足本公司需求为主,后续版本会扩充可配置模块。
spec配置项
basic
appName
:String
,项目名称,默认值为app
;localPath
:Object
,本地目录配置;src
:String
,源码文件目录;dest
:String
,编译输出的本地目录;thirdparty
:本地第三方库文件目录。 -
cdn
:【选填】Object
,cdn相关配置;server
:String
,cdn域名;path
:String
,项目在cdn服务器的路径。 -
js
extType
:String
,扩展名,默认值为js;srcType
:Array
,源文件的转译配置,默认值为['es2015']
;srcDir
:String
,JS文件源码存放目录,相对于basic.localPath.src
;destDir
:String
,JS文件编译输出目录,相对于basic.localPath.dest
;mainFilePrefix
:String
,JS入口文件的命名前缀,默认值为main
;uglify
:Boolean
,编译输出文件是否uglify,默认true
;useHash
:Boolean
,编译输出文件是否打上hash指纹,默认true
;mutiEntriesVendor
:Boolean
,存在多入口文件时是否提取公共部分作为一个独立文件,默认值为false
。此配置项在未指定vendor
时才会起效,如果未指定vendor
并且存在多个入口文件,可以将公用的webpack runtime提取出来,已减少主文件体积并利用浏览器缓存提升应用性能;files
:【选填】Object
,指定编译文件。此项如不开启则boi自动匹配遵循命名规范的入口文件。main
:Object
,指定入口文件,如下:files: { main: { 'a': 'main.a.js', 'main.b': 'main.b.js' } }
vendor
:Array
,通用模块列表,数组内的模块将被合成打包为vendor.js
。
webpackConfig
:Object
,boi支持自定义webpack的module和plugins配置项,此项配置将完全覆盖boi内置的webpack配置,请谨慎使用。preloader
:Object
;loader
:Object
;postLoader
:Object
;plugins
:Array
。
style
style配置项与JS大体相同,有以下区别:
- 没有
uglify
、srcType
、mutiEntriesVendor
和files
配置项; extType
决定css预编译器的选型。
html
html配置项与JS大体相同,有以下区别:
- html没有
uglify
、srcType
、mutiEntriesVendor
和useHash
配置项; files
:Array
,index文件的列表,仍需遵循命名规范;mainFilePrefix
:默认值为'index'
。
image
extType
:Array
,图片文件扩展名列表;destDir
:String
,编译输出目录,basic.localPath.dest
;base64
:Boolean
,是否对小尺寸图片进行base64编码,默认false
;base64Limit
:Number
,base64编码文件的体积上限,大于这个尺寸的文件不会被base64编码;cdn
:【选填】String
,图片可配置独立的cdn域名,此项配置将覆盖basic同名配置项。比如style文件中引用图片:body{ background-color:blue; backgournd: url('../assets/images/icons.png'); }
image配置项为:
boi.spec('image', { extType: ['png', 'jpg'], destDir: 'image', cdn: 'img.daojia.com', });
编译输出的文件为:
body{ background-color:blue; backgournd:url(http://img.daojia.com/icons.b709986b.png) }
serve配置项
port
:String
,修改默认监听端口;domain
:String
,修改默认监听域名
插件
boi的核心功能比较轻量,具体的功能由boi插件完成。
使用插件
使用插件API为boi.use
,修改boi-conf.js
配置文件如下:
boi.use('boi-plugin-loader-vue');
boi本身不支持特定框架的编译,vue编译以及dev server配置由boi-plugin-loader-vue插件提供。
具体示例请参考demo。
安装插件
boi插件可以自行安装:
npm install boi-plugin-loader-vue --save-dev
由于某些不可言表的原因,npm可能会安装失败,请尝试以下解决方法:
挂VPN;
将npm仓库地址修改为taobao镜像:
npm config set registry https://registry.npm.taobao.org/
使用cnpm安装。
如果用户不自行安装,boi会自动安装所使用的插件。
推荐使用npm自行安装,cnpm安装目前存在一些不可预估的问题,后续会修复。