gulpman
- Create Modular Front-End Build System, based on gulp , more light and easier than FIS!
- 基于
gulp
的前端组件化、模块化解决方案,比百度FIS
更简单、灵活、可控性高,会gulp就会定制自己的方案 - 支持图片
base64
方式嵌入到html/CSS
- 支持
JS/CSS
内联方式嵌入html文件 - 整合
spritesmith
,简单生成sprite雪碧图 - 整合
icon-font
转换,支持svg转换 - 整合
usemin
,构建合并更加灵活强大 - 支持前端js模板嵌入,
tpl
格式的直接构建打包到最终js文件 - 集成
SCSS|ES6|ReactJS|Babel|Browserify|cssnano|uglify|imagmein
等常用组件,做到一站式自动化解决方案,同时清晰、可控,定制、修改简单 - 扩展性高,
gulp
现有的插件都可以拼装、加入到gulpman
中使用,你可以自己根据实际情况组合、修改,比如可以轻松整合browser-sync
到构建系统中。 - 整合
karma
单元测试框架,适配babel和es6
的代码单元测试和coverage
##Introduction 说明
- 支持Mac、Linux环境下安装、使用
- Windows环境未做完整安装测试,由于安装脚本使用到shell,windows不支持shell,执行完
npm install gulpman --save-dev
后,可能需要手动安装gulp
、gulp-sass
模块 - 如果手动安装
gulp-sass
,建议使用淘宝的cnpm
来完成,避免国内网络导致npm
安装失败 - Node版本需要不低于4.0.0
- *注意目前对于npm 3版本及以上(目前大家基本都是2.x),运行完
npm install
后,可能需要手动安装gulp-sass``babel-preset-es2015
babel-preset-react
等几个依赖
##Install 安装
npm install gulpman --save-dev
注:
- 安装中若npm报出目录权限导致的error,比如涉及到
/usr/local/lib/node_modules
权限的报错,请请检查其权限是否正常并用chown来修复,将拥有者修改为当前登录用户即可。 - 可以使用
sudo chown -R "$(whoami)"
+路径
来修复 - 不要使用
sudo npm install
来手工安装因为权限问题而失败的模块。请修改权限后,再用npm install
来安装即可 - 如果你本地node和npm的安装和权限正常,那gulpman的安装过程应该都是顺利和成功的。
- 图片压缩模块imagemin-pngquant需要依赖
libpng-devel
,如果是Linux环境,建议先运行yum install libpng-devel
来确保安装 - 安装过程中无故退出,请查看
npm-debug.log
,检查是否是内存不足ENOMEM
导致。
##Config 配置
###0. 支持自动默认模式,无需配置即使用
- 可直接跳过
Config 配置
处的说明,直接去看后面的Usage 使用
内容
###1. 配置 gulpfile.js:
- 只需要require gulpman模块,就会自动加载
gm:publish
, gm:develop
(开发监视模式)等task到环境中 - 使用时在命令行中直接输入
gulp gm:publish
即可执行gulpman预置的任务
var gulp = require('gulp'),
gman = require('gulpman')
gman.config({
'is_absolute': true,
'cdn_prefix': '',
'url_prefix': '/static'
'components': 'components',
'runtime_views': 'views',
'dist_views': 'views_dist',
'runtime_assets': 'assets',
'dist_assets': 'assets_dist',
'lib': 'lib',
'global': 'common'
})
###2. 如何更好的配置CDN
cdn_prefix
支持 字符串、数组、函数- 如果传入数组,那么按照随机来分配
- 如果传入函数,函数会获1个参数,
mediaFile
, 就是当前被css或html中引用到的资源文件名,可以根据文件名做cdn分配
'cdn_prefix': function (fileName) {
console.log(fileName)
var c_list = [
'http://s0.com',
'http://s1.com',
'http://s2.com',
'http://s3.com',
'http://s4.com'
]
if(hostFile.match(/\.html$/gm)){
return c_list[0]
}else {
return c_list[1]
}
},
###3. 对于is_absolute
的说明
-
is_absolute
是指输出的html文件中的资源src/url,否使用绝对路径,默认值true,即启用绝对目录。
-
[常用]当使用服务器配置静态目录的情况下,推荐使用绝对目录。比如配合nginx,指定某个目录为静态资源目录。类似/static/home/main.js
这种风格。
-
如果无服务端情况下,有需要本地调试,推荐设置is_absolute为false, 即启用相对路径。类似../../assets/static/home/main.js
这种风格。
-
当is_absolute为false(启用相对路径)的情况下,直接打开输出的views目录下的html文件,就可以正常浏览、运行、调试
###4. gulpman目录说明
-
使用gulpman按照模块划分后,模块根目录可以是./components
(默认,可配置),如果你有个模块是foo,那么应该有如下目录:./components/foo
,然后跟foo模块相关的html|js|css|fonts|image
等资源文件都放到foo
下,这个结构下,做开发时非常清晰、高效,便于模块组织、资源定位等。
-
通过gm:develop
命令进入develop
开发模式后,会自动生成模板views
目录,和静态资源assets
目录。
-
通过gm:publish
命令来构建发布资源,会自动生成生产环境下的模板目录views_dist
,和静态资源目录assets_dist
。
###5. 什么是全局模块目录:
- 你的
components/lib
目录下有一个模块 foo.js
,就是: components/lib/foo.js
,那么你在你的es6文件中,就可以这样使用:import foo from 'foo'
,不需要写成 import foo from '../lib/foo'
###6. 支持复杂目录和多级目录设定
gulpman.config({
'is_absolute': false,
'components': 'components/cc',
'runtime_views': 'runtime_views/rv',
'dist_views': 'dist_views/dv/dv',
'dist_assets': 'dist_assets/da',
'runtime_assets': 'runtime_assets/ra/ra',
})
##Usage 使用
###1. CLI 执行Task:
# 初始化目录,建立components目录并添加一份html的demo文件
# init components dir and a html demo
gulp gm:init
# develop and watch 开发模式,监视相关文件变动,增量更新
gulp gm:develop
# 指定监视某个component, 提高性能和效率
gulp gm:develop -c component_name
# publish 发布资源,包括合并、压缩资源、rev产生MD5等
gulp gm:publish
# publish命令支持`-a`和`-v`参数指定输出资源/模板目录(可选)
gulp gm:publish -v your_views_dist -a your_assets_dist
# clean 清理构建输出的目录和文件
gulp gm:clean
# 编译输出一份运行时资源文件,但是不进入监视状态
# compile for develop, not watch
gulp gm:compile
###2. 开发中只监视某个component目录
gulp gm:develop -c home
###3. 如何在gulpman下使用React
- 方法一:通过script标签引入React类库到HTML (推荐)
<script type="text/javascript" src="./lib/react-0.14.6/build/react.min.js"></script>
<script type="text/javascript" src="./lib/react-0.14.6/build/react-dom.min.js"></script>
- 方法二:直接在ES6/JSX文件中引入React模块
注意:引入的react文件是为Gulpman预置的,已经修改过来兼容browserify,从而在window中暴露React和ReactDOM对象供开发者调用:
import 'react'
###4. 如何在js|es6|jsx中使用tpl模板
###5. 如何在HTML/CSS中嵌入base64编码的图片
- 只需要图片资源后面添加
?_gm_inline
即可 - 打包时候会将图片生成
base64
编码替换到到html中
#####html
<p class="play">
<img width="480" alt="Karat 克拉" src="./img/testb64.png?_gm_inline" />
</p>
#####CSS/SCSS
.test {
background: url(./img/testb64.png?_gm_inline) no-repeat;
}
###6. 如何在HTML中嵌入内联CSS/JS
- 类似图片base64,只需要资源后面添加
?_gm_inline
即可
<script src="./plugin.js?_gm_inline" type="text/javascript"></script>
<link href="./dialog.css?_gm_inline" rel="stylesheet" type="text/css" >
- 注:所有内嵌嵌入的资源,包括图片/JS/CSS,在develop(监视)模式下,都已自动关联更新。即如果a.html文件中,内联嵌入了一个b.css,如果b.css发生了修改,那么a.html会自动编译更新。
###7. 如何使用Sprite雪碧图
.demo {
background: url(./img/abc.png?_gm_sprite) no-repeat;
width: 50px;
height: 50px;
}
###8. 如何使用Usemin
- 整合usemin,在gulpman.config 中可传入usemin的配置opts
- 关于usemin详细参见:https://github.com/zont/gulp-usemin
- 只需要在html文件中添加usemin的build注释即可。支持
js
|css
|inlinejs
|inlinecss
等语法 - 注意build注释中配置的输出路径写相对路径即可,跟script、link等标签类似,gulpman会自动转换成最终输出路径
<link rel="stylesheet" type="text/css" href="./main.css">
<link rel="stylesheet" type="text/css" href="./fff.css">
<script type="text/javascript" src="../lib/jquery.js"></script>
<script type="text/javascript" src="../lib/react.js"></script>
###9. 如何使用前端js模板
- 支持tpl扩展名,放到components相关目录下即可,js 可以直接require或者import
- 最终会作为字符串格式打包进js
- tpl中仍然支持资源嵌入和图片base64等,如参照前面_gm_inline等语法即可
import dialogTpl from './dialog.tpl'
var dialogTpl = require('./dialog.tpl')
###10. 使用iconfont转换
- 可以将svg转换成icon-font,用
@font-face
方式引用 - 初次使用先安装,运行
gulp gm:iconfont:install
- 将svg文件放到
components/iconfonts/source
目录下,运行gulp gm:iconfont
即可 - 自动生成的icon-font和css文件将会在
iconfonts/gmicon
目录下
###11. 支持LAB.js来完成异步加载js
- 引入LAB.js到项目中
- 使用LAB的api来加载即可,使用相对路径
- 代码用例:
$LAB.script("../testload/test.js").wait(()=>{console.log('test loaded')})
###12. 如何启用karma单元测试
- 初次使用先安装,运行
gulp gm:karma:install
,会安装依赖和生成karma.conf.js
文件 - 在您的components中的对应模块目录下,建立一个spec文件夹,将对应的spec文件放在里面,文件拓展名是.es6
- 运行
gulp gm:karma:start
来启动单元测试(watch模式),将会运行各spec文件,完成后可在生成的coverage文件夹中查看覆盖率结果 - 指定spec目录、browsers等karma的选项,可以在
karma.conf.js
中设置、定制等
###教程
浏览教程链接
###License
MIT