gulp-turbo
Version:
前端工作流(requirejs/jade/stylus/coffee),完整强缩进工作流,同步异步模板复用,高效率适合初期前端团队
115 lines (109 loc) • 4.08 kB
text/coffeescript
gulp = require 'gulp'
fs = require 'fs'
chalk = require 'chalk'
util = require 'gulp-util'
requirejs = require 'gulp-requirejs'
sourcemaps = require 'gulp-sourcemaps'
through = require 'through2'
uglify = require 'gulp-uglify'
rename = require 'gulp-rename'
path = require 'path'
revHash = require 'rev-hash'
turboCache = require '../lib/turboCache'
mkdir = require 'mkdirp'
plumber = require "gulp-plumber"
header = require 'gulp-header'
banner = ['/**',
' * <%= projectPkg.name %> v<%= projectPkg.version %>',
' * @update <%= projectPkg.currentDate %>',
' * @by <%= turboPkg.name %> v<%= turboPkg.version %> <%= turboPkg.homepage %>',
' */',
''].join('\n')
rjs_cache = {}
gulp.task 'rMin', ()->
pkg = global.pkg
{approot,distPath} = pkg
rjs_cache = turboCache pkg.base
gulp.src [approot+'/dev/js/*.js', approot+'/dev/js/entry/**/*.js', '!'+approot+'/dev/js/entry/**/*_loder.js'],
read: false
.pipe rjs
base: approot+'/dev/js/'
dest: approot+'/dist/js/'
global.jsMainHashs = {}
rjs = ( opts ) ->
through.obj ( file, enc, cb ) ->
fname = path.basename file.path
filename = path.basename file.path, '.js'
filedir = path.dirname file.path
relativePath = path.relative(opts.base, filedir).replace(/\\+/g, '\/')
filepath = path.relative opts.base, file.path
mainConfigFile = filedir + '/' + fname
name = if relativePath then relativePath + '/' + filename else filename
out = fname
dist = opts.dest + relativePath
fileMd5 = null
requirejs
baseUrl: opts.base
mainConfigFile: mainConfigFile
name: name
out: out
optimize: 'uglify2'
paths: opts.paths or {}
excludeShallow: opts.excludeShallow or []
inlineText: true
removeCombined: true
findNestedDependencies: true
.pipe plumber()
.pipe through.obj (file, enc, cb)->
fileMd5 = revHash file.contents
jsMainHashs['js'+filepath.replace(/(\\+)|(\/+)/g, '')] = fileMd5
result = rjs_cache.getFile fileMd5, filepath
resultMap = rjs_cache.getFile fileMd5+'.map', filepath+'.map'
if result
_filepath = path.join(opts.dest, filepath)
mkdir.sync path.dirname(_filepath)
util.log '[js turboCache]: ', filepath, ' [', fileMd5, ']'
fs.writeFileSync _filepath.replace(/\./, '-'+fileMd5+'.'), result
if resultMap
_mapspath = path.dirname(_filepath)+'/.maps/'
_mapsname = path.basename(_filepath)
mkdir.sync _mapspath
fs.writeFileSync _mapspath+_mapsname+'.map', resultMap
else
this.push file
cb()
.pipe sourcemaps.init()
.pipe uglify
output:
beautify: false
indent_level: 1
.pipe header(banner, global)
.pipe sourcemaps.write '.maps'
.pipe through.obj (file, enc, cb)->
if !/\.maps/.test(file.path)
util.log chalk.magenta '[js compress] ', filepath, ' --> ', file.contents.length, 'bytes [', fileMd5, ']'
rjs_cache.setFile file.contents, fileMd5, filepath
else
rjs_cache.setFile file.contents, fileMd5+'.map', filepath+'.map'
this.push file
cb()
.pipe rename (path)->
if path.extname is '.js'
path.basename += '-' + fileMd5
.pipe plumber.stop()
.pipe gulp.dest dist
cb()
return