gulp webpack 组合 打包
在gulp的环境里调用webpack3(当前是3.5.6)这里nodejs环境是v8.1.0;npm是5.0.3,在这里我让webpack主要负责把js统一打包成模块并且es6转es5,兼容ie8浏览器。
这里来看一下重要的配置文件:
//package.json
{
"name": "gulp_es6",
"version": "1.0.0",
"description": "",
"main": "gulpfile.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"gulp": "gulp"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"autoprefixer-core": "^6.0.1",
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
"babel-preset-env": "^2.0.0-beta.1",
"babel-preset-react": "^6.24.1",
"css-loader": "^0.28.7",
"del": "^3.0.0",
"expose-loader": "^0.7.3",
"file-loader": "^0.11.2",
"gulp": "^3.9.1",
"gulp-babel": "^7.0.0",
"gulp-base64": "^0.1.3",
"gulp-cheerio": "^0.6.2",
"gulp-concat": "^2.6.1",
"gulp-file-include": "^1.2.0",
"gulp-htmlmin": "^3.0.0",
"gulp-if": "^2.0.2",
"gulp-imagemin": "^3.3.0",
"gulp-make-css-url-version": "0.0.13",
"gulp-minify-css": "^1.2.4",
"gulp-notify": "^3.0.0",
"gulp-postcss": "^7.0.0",
"gulp-rename": "^1.2.2",
"gulp-rev-append": "^0.1.8",
"gulp-uglify": "^3.0.0",
"gulp-useref": "^3.1.2",
"jquery": "^1.11.0",
"style-loader": "^0.18.2",
"uglifyjs-webpack-plugin": "^1.0.0-rc.0",
"vue": "^2.4.4",
"webpack-stream": "^4.0.0"
},
"dependencies": {
"vinyl-named": "^1.1.0"
}
}
*注意:解压后修改为 “gulp”: “node ./node_modules/gulp/bin/gulp”
//gulpfile.js
var gulp = require('gulp');
var cssmin = require('gulp-minify-css'); //压缩,删除注释、换行,合并选择器
var cssver = require('gulp-make-css-url-version'); //为css的url背景图片添加mdb5,防止缓存
var concat = require('gulp-concat');//合并css、js
var uglify = require('gulp-uglify'); //js压缩
var notify = require('gulp-notify'); //任务执行成功提示
var htmlmin = require('gulp-htmlmin');//对html页面压缩处理
var postcss = require('gulp-postcss'); //自动添加css前缀
var autoprefixer = require('autoprefixer-core');//自动添加css前缀
var rev = require('gulp-rev-append'); //为html的js、css添加版本号
var cheerio = require('gulp-cheerio'); //操作html的dom,目的合并多个js或者css链接
var useref = require('gulp-useref'); //将html中多个link和script各自合并成一个
var del = require('del'); //删除文件
var gulpif = require('gulp-if');
var imageMin = require('gulp-imagemin'); //图片压缩
var babel = require("gulp-babel");
var fileinclude = require('gulp-file-include');
var base64 = require('gulp-base64'); //将css里面的小图片转化为base64
var webpack = require('webpack-stream');
var webpack2 = require('./node_modules/webpack');
var rename = require("gulp-rename");
var UglifyJSPlugin = require('uglifyjs-webpack-plugin');
var named = require('vinyl-named');
gulp.task('fileinclude', function() {
// 适配page中所有文件夹下的所有html,排除page下的include文件夹中html
gulp.src(['src/**/*.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('dist'))
.on('end', function () {
gulp.src('src/*.html')
.pipe(useref())
//.pipe(gulpif('*.js', babel())) //转化es6为es5,但是ie8用不了,ie9可以
// .pipe(gulpif('*.js', uglify({
// mangle:false,//类型:Boolean 默认:true 是否修改变量名
// compress:false,//类型:Boolean 默认:true 是否完全压缩
// // preserveComments:'all'//保留所有注释
// })))
.pipe(gulpif('*.css', cssmin({
advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
keepSpecialComments: '*'//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
})))
.pipe(gulpif('*.css',postcss([ autoprefixer({ browsers: ["> 0%"] }) ])))
.pipe(gulpif('*.css',cssver()))
.pipe( gulpif('*.css',base64({
// baseDir: 'public',
// extensions: ['svg', 'png', /\.jpg#datauri$/i],
// exclude: [/\.server\.(com|net)\/dynamic\//, '--live.jpg'],
maxImageSize: 5*1024 // 小于5KB的图片就会被转化为base64
// debug: true
})))
.pipe(gulpif('*.html',htmlmin({
removeComments: true,//清除HTML注释
collapseWhitespace: true,//压缩HTML
collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
minifyJS: true,//压缩页面JS
minifyCSS: true//压缩页面CSS
})))
.pipe(gulpif('*.html',rev()))
//.pipe(gulpif('*.html',cheerio(function ($, file) {
// $('link').eq(0).remove();
// $('head').append('<link rel="stylesheet" href="css/css.min.css?rev='+Math.random()+'">');
// $('script').eq(0).remove();
// $('head').append('<script src="js/all.min.js?rev='+Math.random()+'"></script>');
//})))
.pipe(gulp.dest('dist'))
});
});
//把独立的js复制到dist/js的根目录下
gulp.task('copy', function() {
gulp.src('src/js/*.*')
.pipe(gulp.dest('dist/js'))
});
//图片压缩
gulp.task('img', function () {
gulp.src('src/images/*.*')
.pipe(imageMin({progressive: true}))
.pipe(gulp.dest('dist/images'));
});
//为此任务命名为watch
// gulp.task('watch',function(){
// gulp.watch('src/**/*.css',['sync']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
// gulp.watch('src/**/*.js',['sync']);
// });
//监听 src目录下的css 和 js 还有view目录下的html一旦有变化就更新
gulp.task('watch',function(){
gulp.watch(['src/**/*.css','src/**/*.js','src/**/*.html'],function () {
gulp.src(['view/**/*.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('src'))
.on('end', function () {
gulp.src('src/*.html')
.pipe(useref())
// .pipe(gulpif('*.js', uglify({
// mangle:false,//类型:Boolean 默认:true 是否修改变量名
// compress:false,//类型:Boolean 默认:true 是否完全压缩
// // preserveComments:'all'//保留所有注释
// })))
.pipe(gulpif('*.css', cssmin({
advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
keepSpecialComments: '*'//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
})))
.pipe(gulpif('*.css',postcss([ autoprefixer({ browsers: ["> 0%"] }) ])))
.pipe(gulpif('*.css',cssver()))
.pipe( gulpif('*.css',base64({
maxImageSize: 5*1024 // 小于5KB的图片就会被转化为base64
})))
.pipe(gulpif('*.html',htmlmin({
removeComments: true,//清除HTML注释
collapseWhitespace: true,//压缩HTML
collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
minifyJS: true,//压缩页面JS
minifyCSS: true//压缩页面CSS
})))
.pipe(gulpif('*.html',rev()))
.pipe(gulp.dest('dist'))
});
});
});
//修改view目录下的html就自动在src根目录下生成html
// gulp.task('watch_html',function(){
// gulp.watch('src/**/*.html',['fileinclude']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
// });
//gulp的默认执行的任务就是watch任务
//gulp.task('default',['testCssmin','js','html','watch'], function() {
// // 将你的默认的任务代码放在这
//});
gulp.task('default',['fileinclude','img','copy','watch'], function() {
// 将你的默认的任务代码放在这
return gulp.src(['src/js/a.js','src/js/b.js','src/js/css.js'])
.pipe(named()) //可以将多个js ['src/js/a.js','src/js/b.js','src/js/css.js'] 分开打包
.pipe(webpack({
watch: true,
module: {
loaders: [
{ test: /\.css$/, loader: 'style-loader!css-loader' },
{ test: /\.(png|jpg|jpeg|gif|woff)$/, loader: 'file-loader',query: {name: 'images/[name].[ext]'} },
{
test: /\.js|jsx$/, //是一个正则,代表js或者jsx后缀的文件要使用下面的loader npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react
exclude: /node_modules/,
loader: "babel-loader"
},
],
},
plugins: [ //扩展webpack额外的功能,要使用webpack自带插件就引入webpack,其他功能的话就额外安装其他插件
new webpack2.BannerPlugin('这个插件功能是头部提示功能'),
// new UglifyJSPlugin({uglifyOptions:{
// ie8: true
// }})
// new webpack2.ProvidePlugin({ //使用sudo npm install jquery@1.11.0,来调用jq,并将jq暴露打包文件全局中,相当于给window加了jquery
// $:"jquery",
// jQuery:"jquery",
// "window.jQuery":"jquery",
// 'window.$': 'jquery'
// }),
]
}))
// .pipe(rename("webpack_2.js"))
.pipe(gulp.dest('dist/js')); // ./dist/js/webpack_.js
});
为了以后方便使用,可以直接下在:下载地址
百度地址:https://pan.baidu.com/s/1slJoTvZ
使用步骤:(此包在mac下测试通过)
1,下载解压后不需要npm install,全部依赖包已经在里面了,
修改package.json,修改内容为”gulp”: “node ./node_modules/gulp/bin/gulp”,并让整个目录有执行权限chmod -R 777 /xxx/xxx
2,直接在shell命令里面执行npm run gulp即可
3,(1)编辑html,切换到目录./src中
(2)编辑css、js和添加图片,切换到目录./src中
4,浏览查看未编译的页面就浏览./src里面的html
浏览已经编译好的页面查看./dist里面的html
———————-babel一些坑——————————-
babel并不能把所有的es6功能都能完美转换为es5;
babel转化过的js压缩后ie8有问题
下次本人测试可以使用
//class方法声明 面向对象
//箭头函数
//模板
//默认参数
————————————————————————————————————–
gulp负责:
html压缩、css和js的链接分别合并、css代码压缩
webpack负责(主要处理js):
将es6转化成es5,js压缩、合并(合并后ie8不兼容)
推荐:
如果坚持使用es6转es5的功能,就不能压缩否则ie8无法工作,除非不考虑兼容ie8。
不是有特殊需求放弃使用webpack,js的压缩合并都是用gulp来处理。
需要合并链接,并将多个js打包压缩在一起就把js统一放在./src/js/public/里面,链接最前面最先被加载
<!-- build:js js/public/public.min.js --> <script src="./js/public/jquery.js"></script> <script src="./js/public/a.js"></script> <!-- endbuild -->
打包后成为
<script src="js/public/public.min.js"></script>
需要合并链接,并将多个css打包压缩在一起就把css统一放在./src/css/里面,链接最前面最先被加载,效果跟js一样